py: Fix initialisation of subtypes, fix segfaults.
authorJelmer Vernooij <jelmer@samba.org>
Sun, 21 Dec 2008 02:08:14 +0000 (03:08 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Sun, 21 Dec 2008 02:08:14 +0000 (03:08 +0100)
12 files changed:
lib/talloc/pytalloc.c
source4/lib/ldb/pyldb.c
source4/lib/registry/pyregistry.c
source4/param/param.i
source4/param/param.py
source4/param/param_wrap.c
source4/scripting/python/config.mk
source4/scripting/python/pyglue.c [moved from source4/scripting/python/pymisc.c with 97% similarity]
source4/scripting/python/samba/__init__.py
source4/scripting/python/samba/idmap.py
source4/scripting/python/samba/provision.py
source4/scripting/python/samba/samdb.py

index f4b7d10e9711b1b6541a4a2091793cbfac5ad764..8bc85eead647eebe8834f97a21e6b36a622dcef2 100644 (file)
@@ -25,13 +25,13 @@ void py_talloc_dealloc(PyObject* self)
        py_talloc_Object *obj = (py_talloc_Object *)self;
        talloc_free(obj->talloc_ctx);
        obj->talloc_ctx = NULL;
-       PyObject_Del(self);
+       self->ob_type->tp_free(self);
 }
 
 PyObject *py_talloc_import_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, 
                                                   void *ptr)
 {
-       py_talloc_Object *ret = PyObject_New(py_talloc_Object, py_type);
+       py_talloc_Object *ret = (py_talloc_Object *)py_type->tp_alloc(py_type, 0);
        ret->talloc_ctx = talloc_new(NULL);
        if (ret->talloc_ctx == NULL) {
                return NULL;
index 53b4fcef3dd49149aeb54004128800c7011ba8bc..340e02cafa897605d07f25e82886a92075d72465 100644 (file)
@@ -320,6 +320,7 @@ PyTypeObject PyLdbDn = {
        .tp_new = py_ldb_dn_new,
        .tp_dealloc = py_talloc_dealloc,
        .tp_basicsize = sizeof(PyLdbObject),
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 /* Debug */
@@ -971,7 +972,6 @@ PyObject *PyLdb_FromLdbContext(struct ldb_context *ldb_ctx)
 }
 
 PyTypeObject PyLdb = {
-       PyObject_HEAD_INIT(NULL)
        .tp_name = "Ldb",
        .tp_methods = py_ldb_methods,
        .tp_repr = (reprfunc)py_ldb_repr,
@@ -1151,6 +1151,7 @@ PyTypeObject PyLdbModule = {
        .tp_str = (reprfunc)py_ldb_module_str,
        .tp_basicsize = sizeof(py_talloc_Object),
        .tp_dealloc = py_talloc_dealloc,
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 struct ldb_message_element *PyObject_AsMessageElement(TALLOC_CTX *mem_ctx,
@@ -1328,6 +1329,7 @@ PyTypeObject PyLdbMessageElement = {
        .tp_iter = (getiterfunc)py_ldb_msg_element_iter,
        .tp_as_sequence = &py_ldb_msg_element_seq,
        .tp_new = py_ldb_msg_element_new,
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 static PyObject *py_ldb_msg_remove_attr(PyLdbMessageObject *self, PyObject *args)
@@ -1462,7 +1464,7 @@ static PyObject *py_ldb_msg_new(PyTypeObject *type, PyObject *args, PyObject *kw
                if (!PyObject_AsDn(NULL, pydn, NULL, &ret->dn))
                        return NULL;
 
-       return py_talloc_import(&PyLdbMessage, ret); 
+       return py_talloc_import(type, ret); 
 }
 
 PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg)
@@ -1505,6 +1507,7 @@ PyTypeObject PyLdbMessage = {
        .tp_dealloc = py_talloc_dealloc,
        .tp_new = py_ldb_msg_new,
        .tp_repr = (reprfunc)py_ldb_msg_repr,
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 PyObject *PyLdbTree_FromTree(struct ldb_parse_tree *tree)
@@ -1516,6 +1519,7 @@ PyTypeObject PyLdbTree = {
        .tp_name = "Tree",
        .tp_basicsize = sizeof(PyLdbTreeObject),
        .tp_dealloc = py_talloc_dealloc,
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 /* Ldb_module */
index e49fdad8a2a68f44d5bcbe7756bcabd9d33dedd1..b93071f703121cbae993131311bbf5d1e0087a68 100644 (file)
@@ -156,6 +156,7 @@ PyTypeObject PyRegistry = {
        .tp_new = registry_new,
        .tp_basicsize = sizeof(py_talloc_Object),
        .tp_dealloc = py_talloc_dealloc,
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 static PyObject *py_hive_key_del(PyObject *self, PyObject *args)
@@ -246,12 +247,14 @@ PyTypeObject PyHiveKey = {
        .tp_new = hive_open,
        .tp_basicsize = sizeof(py_talloc_Object),
        .tp_dealloc = py_talloc_dealloc,
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 PyTypeObject PyRegistryKey = {
        .tp_name = "RegistryKey",
        .tp_basicsize = sizeof(py_talloc_Object),
        .tp_dealloc = py_talloc_dealloc,
+       .tp_flags = Py_TPFLAGS_DEFAULT,
 };
 
 static PyObject *py_open_samba(PyObject *self, PyObject *args, PyObject *kwargs)
index 06579f9b2687bdcafa161e796ae8cfef7d6f6bc4..c04c9279f49d884d53b34810cf937e3c8f660b6a 100644 (file)
@@ -78,6 +78,10 @@ typedef struct loadparm_context {
             return lp_set_cmdline($self, parm_name, parm_value);
         }
 
+        char *private_path(const char *name, TALLOC_CTX *mem_ctx) {
+            return private_path(mem_ctx, $self, name);
+        }
+
         %feature("docstring") set "S.get(name, service_name) -> value\n" \
                                    "Find specified parameter.";
         PyObject *get(const char *param_name, const char *service_name)
@@ -354,6 +358,3 @@ struct loadparm_context *py_default_loadparm_context(TALLOC_CTX *mem_ctx)
 }
 
 %}
-
-char *private_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx,
-               const char *name);
index 5c455671f9dd9a30d09ffe1bc6728f23ae7f15b1..3662c99a9c4e807bd1812bad48493245bcd7a26c 100644 (file)
@@ -119,6 +119,7 @@ LoadParm.is_mydomain = new_instancemethod(_param.LoadParm_is_mydomain,None,LoadP
 LoadParm.is_myname = new_instancemethod(_param.LoadParm_is_myname,None,LoadParm)
 LoadParm.use = new_instancemethod(_param.LoadParm_use,None,LoadParm)
 LoadParm.set = new_instancemethod(_param.LoadParm_set,None,LoadParm)
+LoadParm.private_path = new_instancemethod(_param.LoadParm_private_path,None,LoadParm)
 LoadParm.get = new_instancemethod(_param.LoadParm_get,None,LoadParm)
 LoadParm_swigregister = _param.LoadParm_swigregister
 LoadParm_swigregister(LoadParm)
@@ -262,6 +263,5 @@ param_section.next_parameter = new_instancemethod(_param.param_section_next_para
 param_section_swigregister = _param.param_section_swigregister
 param_section_swigregister(param_section)
 
-private_path = _param.private_path
 
 
index 2849950f7aea1ad6753b1ea31e3a783e49d59955..6ce17957c10b5bf5e31f3bf2319212b2f3429073 100644 (file)
@@ -2673,6 +2673,9 @@ SWIGINTERN bool loadparm_context_set(loadparm_context *self,char const *parm_nam
                 return false;
             return lp_set_cmdline(self, parm_name, parm_value);
         }
+SWIGINTERN char *loadparm_context_private_path(loadparm_context *self,char const *name,TALLOC_CTX *mem_ctx){
+            return private_path(mem_ctx, self, name);
+        }
 SWIGINTERN PyObject *loadparm_context_get(loadparm_context *self,char const *param_name,char const *service_name){
             struct parm_struct *parm = NULL;
             void *parm_ptr = NULL;
@@ -3217,6 +3220,50 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_LoadParm_private_path(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) {
+  PyObject *resultobj = 0;
+  loadparm_context *arg1 = (loadparm_context *) 0 ;
+  char *arg2 = (char *) 0 ;
+  TALLOC_CTX *arg3 = (TALLOC_CTX *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  char *  kwnames[] = {
+    (char *) "self",(char *) "name", NULL 
+  };
+  char *result = 0 ;
+  
+  arg1 = loadparm_init(NULL);
+  arg3 = NULL;
+  if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"|OO:LoadParm_private_path",kwnames,&obj0,&obj1)) SWIG_fail;
+  if (obj0) {
+    res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_loadparm_context, 0 |  0 );
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoadParm_private_path" "', argument " "1"" of type '" "loadparm_context *""'"); 
+    }
+    arg1 = (loadparm_context *)(argp1);
+  }
+  if (obj1) {
+    res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoadParm_private_path" "', argument " "2"" of type '" "char const *""'");
+    }
+    arg2 = (char *)(buf2);
+  }
+  result = (char *)loadparm_context_private_path(arg1,(char const *)arg2,arg3);
+  resultobj = SWIG_FromCharPtr((const char *)result);
+  if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_LoadParm_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) {
   PyObject *resultobj = 0;
   loadparm_context *arg1 = (loadparm_context *) 0 ;
@@ -4153,50 +4200,6 @@ SWIGINTERN PyObject *param_section_swiginit(PyObject *SWIGUNUSEDPARM(self), PyOb
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_private_path(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) {
-  PyObject *resultobj = 0;
-  TALLOC_CTX *arg1 = (TALLOC_CTX *) 0 ;
-  struct loadparm_context *arg2 = (struct loadparm_context *) 0 ;
-  char *arg3 = (char *) 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 ;
-  char *buf3 = 0 ;
-  int alloc3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  char *  kwnames[] = {
-    (char *) "lp_ctx",(char *) "name", NULL 
-  };
-  char *result = 0 ;
-  
-  arg2 = loadparm_init(NULL);
-  arg1 = NULL;
-  if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"|OO:private_path",kwnames,&obj0,&obj1)) SWIG_fail;
-  if (obj0) {
-    res2 = SWIG_ConvertPtr(obj0, &argp2,SWIGTYPE_p_loadparm_context, 0 |  0 );
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "private_path" "', argument " "2"" of type '" "struct loadparm_context *""'"); 
-    }
-    arg2 = (struct loadparm_context *)(argp2);
-  }
-  if (obj1) {
-    res3 = SWIG_AsCharPtrAndSize(obj1, &buf3, NULL, &alloc3);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "private_path" "', argument " "3"" of type '" "char const *""'");
-    }
-    arg3 = (char *)(buf3);
-  }
-  result = (char *)private_path(arg1,arg2,(char const *)arg3);
-  resultobj = SWIG_FromCharPtr((const char *)result);
-  if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-  return resultobj;
-fail:
-  if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
-  return NULL;
-}
-
-
 static PyMethodDef SwigMethods[] = {
         { (char *)"new_LoadParm", (PyCFunction)_wrap_new_LoadParm, METH_NOARGS, NULL},
         { (char *)"LoadParm_default_service", (PyCFunction) _wrap_LoadParm_default_service, METH_VARARGS | METH_KEYWORDS, NULL},
@@ -4227,6 +4230,7 @@ static PyMethodDef SwigMethods[] = {
                "S.set(name, value) -> bool\n"
                "Change a parameter.\n"
                ""},
+        { (char *)"LoadParm_private_path", (PyCFunction) _wrap_LoadParm_private_path, METH_VARARGS | METH_KEYWORDS, NULL},
         { (char *)"LoadParm_get", (PyCFunction) _wrap_LoadParm_get, METH_VARARGS | METH_KEYWORDS, NULL},
         { (char *)"delete_LoadParm", (PyCFunction) _wrap_delete_LoadParm, METH_VARARGS | METH_KEYWORDS, NULL},
         { (char *)"LoadParm_swigregister", LoadParm_swigregister, METH_VARARGS, NULL},
@@ -4274,7 +4278,6 @@ static PyMethodDef SwigMethods[] = {
         { (char *)"delete_param_section", (PyCFunction)_wrap_delete_param_section, METH_O, NULL},
         { (char *)"param_section_swigregister", param_section_swigregister, METH_VARARGS, NULL},
         { (char *)"param_section_swiginit", param_section_swiginit, METH_VARARGS, NULL},
-        { (char *)"private_path", (PyCFunction) _wrap_private_path, METH_VARARGS | METH_KEYWORDS, NULL},
         { NULL, NULL, 0, NULL }
 };
 
index 8eb0aab528e7b2abccf9ac28205d5f0fbf26b7fc..1f57294c593db731cb47e6f781d15ffff34b0e3f 100644 (file)
@@ -15,13 +15,13 @@ PRIVATE_DEPENDENCIES = LIBNDR
 
 python_uuid_OBJ_FILES = $(pyscriptsrcdir)/uuidmodule.o
 
-[PYTHON::python_misc]
-LIBRARY_REALNAME = samba/misc.$(SHLIBEXT)
-PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS swig_ldb
+[PYTHON::python_glue]
+LIBRARY_REALNAME = samba/glue.$(SHLIBEXT)
+PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS swig_ldb python_dcerpc_misc python_dcerpc_security
 
-python_misc_OBJ_FILES = $(pyscriptsrcdir)/pymisc.o
+python_glue_OBJ_FILES = $(pyscriptsrcdir)/pyglue.o
 
-$(python_misc_OBJ_FILES): CFLAGS+=$(CFLAG_NO_CAST_QUAL) -I$(ldbsrcdir)
+$(python_glue_OBJ_FILES): CFLAGS+=$(CFLAG_NO_CAST_QUAL) -I$(ldbsrcdir)
 
 _PY_FILES = $(shell find $(pyscriptsrcdir)/samba ../lib/subunit/python -name "*.py")
 
similarity index 97%
rename from source4/scripting/python/pymisc.c
rename to source4/scripting/python/pyglue.c
index 2ba682a6d22fb6e099c8b9d4af7009d277164a40..381792b735116e61936d1bb344c38574c19800be 100644 (file)
@@ -37,8 +37,8 @@ extern struct cli_credentials *cli_credentials_from_py_object(PyObject *py_obj);
 
 #define PyErr_LDB_OR_RAISE(py_ldb, ldb) \
        if (!PyLdb_Check(py_ldb)) { \
-               PyErr_SetString(PyExc_TypeError, "Ldb connection object required"); \
-               return NULL; \
+               /*PyErr_SetString(PyExc_TypeError, "Ldb connection object required"); \
+               return NULL; \ */ \
        } \
        ldb = PyLdb_AsLdbContext(py_ldb);
 
@@ -259,11 +259,11 @@ static PyMethodDef py_misc_methods[] = {
        { NULL }
 };
 
-void initmisc(void)
+void initglue(void)
 {
        PyObject *m;
 
-       m = Py_InitModule3("misc", py_misc_methods, 
+       m = Py_InitModule3("glue", py_misc_methods, 
                           "Python bindings for miscellaneous Samba functions.");
        if (m == NULL)
                return;
index e191227108a8d97a139ba7341d2d5b92dfb8a218..e9fc26af20b846a470d3994807f260a4dfc799a1 100644 (file)
@@ -43,7 +43,7 @@ else:
 
 import ldb
 import credentials
-import misc
+import glue
 
 class Ldb(ldb.Ldb):
     """Simple Samba-specific LDB subclass that takes care 
@@ -80,7 +80,7 @@ class Ldb(ldb.Ldb):
         if session_info is not None:
             self.set_session_info(session_info)
 
-        assert misc.ldb_register_samba_handlers(self) == 0
+        glue.ldb_register_samba_handlers(self)
 
         if lp is not None:
             self.set_loadparm(lp)
@@ -92,10 +92,14 @@ class Ldb(ldb.Ldb):
         if url is not None:
             self.connect(url)
 
+    def set_credentials(self, credentials):
+        glue.ldb_set_credentials(self, credentials)
 
-    set_credentials = misc.ldb_set_credentials
-    set_session_info = misc.ldb_set_session_info
-    set_loadparm = misc.ldb_set_loadparm
+    def set_session_info(self, session_info):
+        glue.ldb_set_session_info(self, session_info)
+
+    def set_loadparm(self, lp_ctx):
+        glue.ldb_set_loadparm(self, lp_ctx)
 
     def searchone(self, attribute, basedn=None, expression=None, 
                   scope=ldb.SCOPE_BASE):
@@ -235,4 +239,4 @@ def valid_netbios_name(name):
         return False
     return True
 
-version = misc.version
+version = glue.version
index 755ec52c7b4a66f9062a2bbc885772a86a42a952..f8eeb1892569a4b68b3b85577467f96c156cd604 100644 (file)
@@ -23,7 +23,7 @@
 __docformat__ = "restructuredText"
 
 import samba
-import misc
+import glue
 import ldb
 
 class IDmapDB(samba.Ldb):
@@ -50,7 +50,7 @@ class IDmapDB(samba.Ldb):
             self.connect(lp.get("idmap database"))
 
     def connect(self, url):
-        super(IDmapDB, self).connect(misc.private_path(self.lp, url))
+        super(IDmapDB, self).connect(self.lp.private_path(url))
 
     def setup_name_mapping(self, sid, type, unixid):
         """Setup a mapping between a sam name and a unix name.
index 568092926f00483cc7e93790bd7d43cc6adee476..0819a0c8bf1b192d5c0751415baa0ff1614aa041 100644 (file)
@@ -29,7 +29,7 @@ import os
 import pwd
 import grp
 import time
-import uuid, misc
+import uuid, glue
 import socket
 import param
 import registry
@@ -926,13 +926,13 @@ def provision(setup_dir, message, session_info,
     if policyguid is None:
         policyguid = str(uuid.uuid4())
     if adminpass is None:
-        adminpass = misc.random_password(12)
+        adminpass = glue.generate_random_str(12)
     if krbtgtpass is None:
-        krbtgtpass = misc.random_password(12)
+        krbtgtpass = glue.generate_random_str(12)
     if machinepass is None:
-        machinepass  = misc.random_password(12)
+        machinepass  = glue.generate_random_str(12)
     if dnspass is None:
-        dnspass = misc.random_password(12)
+        dnspass = glue.generate_random_str(12)
     root_uid = findnss_uid([root or "root"])
     nobody_uid = findnss_uid([nobody or "nobody"])
     users_gid = findnss_gid([users or "users"])
@@ -1172,7 +1172,7 @@ def provision_backend(setup_dir=None, message=None,
         root = findnss(pwd.getpwnam, ["root"])[0]
 
     if adminpass is None:
-        adminpass = misc.random_password(12)
+        adminpass = glue.generate_random_str(12)
 
     if targetdir is not None:
         if (not os.path.exists(os.path.join(targetdir, "etc"))):
index 4a64c2f76d348c390bad84d585fd88f42488341b..92b0bd7b89f679685f08d0c9c5d11bbfc14cc503 100644 (file)
@@ -23,7 +23,7 @@
 """Convenience functions for using the SAM."""
 
 import samba
-import misc
+import glue
 import ldb
 from samba.idmap import IDmapDB
 import pwd
@@ -43,14 +43,14 @@ class SamDB(samba.Ldb):
         self.lp = lp
         super(SamDB, self).__init__(session_info=session_info, credentials=credentials,
                                     modules_dir=modules_dir, lp=lp)
-        assert misc.dsdb_set_global_schema(self) == 0
+        glue.dsdb_set_global_schema(self)
         if url:
             self.connect(url)
         else:
             self.connect(lp.get("sam database"))
 
     def connect(self, url):
-        super(SamDB, self).connect(misc.private_path(self.lp, url))
+        super(SamDB, self).connect(self.lp.private_path(url))
 
     def add_foreign(self, domaindn, sid, desc):
         """Add a foreign security principle."""
@@ -182,17 +182,17 @@ userPassword: %s
 
         :param sid: The new domain sid to use.
         """
-        misc.samdb_set_domain_sid(self, sid)
+        glue.samdb_set_domain_sid(self, sid)
 
     def attach_schema_from_ldif(self, pf, df):
-        misc.dsdb_attach_schema_from_ldif_file(self, pf, df)
+        glue.dsdb_attach_schema_from_ldif_file(self, pf, df)
 
     def set_invocation_id(self, invocation_id):
        """Set the invocation id for this SamDB handle.
        
        :param invocation_id: GUID of the invocation id.
        """
-       misc.dsdb_set_ntds_invocation_id(self, invocation_id)
+       glue.dsdb_set_ntds_invocation_id(self, invocation_id)
 
     def setexpiry(self, user, expiry_seconds, noexpiry):
         """Set the password expiry for a user
@@ -212,7 +212,7 @@ userPassword: %s
             accountExpires = 0
         else:
             userAccountControl = userAccountControl & ~0x10000
-            accountExpires = misc.unix2nttime(expiry_seconds + int(time.time()))
+            accountExpires = glue.unix2nttime(expiry_seconds + int(time.time()))
 
         mod = """
 dn: %s