summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2008-12-21 03:08:14 +0100
committerJelmer Vernooij <jelmer@samba.org>2008-12-21 03:08:14 +0100
commit2e7a6cb6bf32a49682ccadc07244d3a6ae4058d3 (patch)
tree1025e2107efd63e6468b3c81c291aaf7d5c11251
parentbd41b4579c26f40f55811b332874ddeca3478e24 (diff)
downloadsamba-2e7a6cb6bf32a49682ccadc07244d3a6ae4058d3.tar.gz
samba-2e7a6cb6bf32a49682ccadc07244d3a6ae4058d3.tar.bz2
samba-2e7a6cb6bf32a49682ccadc07244d3a6ae4058d3.zip
py: Fix initialisation of subtypes, fix segfaults.
-rw-r--r--lib/talloc/pytalloc.c4
-rw-r--r--source4/lib/ldb/pyldb.c8
-rw-r--r--source4/lib/registry/pyregistry.c3
-rw-r--r--source4/param/param.i7
-rw-r--r--source4/param/param.py2
-rw-r--r--source4/param/param_wrap.c93
-rw-r--r--source4/scripting/python/config.mk10
-rw-r--r--source4/scripting/python/pyglue.c (renamed from source4/scripting/python/pymisc.c)8
-rw-r--r--source4/scripting/python/samba/__init__.py16
-rw-r--r--source4/scripting/python/samba/idmap.py4
-rw-r--r--source4/scripting/python/samba/provision.py12
-rw-r--r--source4/scripting/python/samba/samdb.py14
12 files changed, 98 insertions, 83 deletions
diff --git a/lib/talloc/pytalloc.c b/lib/talloc/pytalloc.c
index f4b7d10e97..8bc85eead6 100644
--- a/lib/talloc/pytalloc.c
+++ b/lib/talloc/pytalloc.c
@@ -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;
diff --git a/source4/lib/ldb/pyldb.c b/source4/lib/ldb/pyldb.c
index 53b4fcef3d..340e02cafa 100644
--- a/source4/lib/ldb/pyldb.c
+++ b/source4/lib/ldb/pyldb.c
@@ -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 */
diff --git a/source4/lib/registry/pyregistry.c b/source4/lib/registry/pyregistry.c
index e49fdad8a2..b93071f703 100644
--- a/source4/lib/registry/pyregistry.c
+++ b/source4/lib/registry/pyregistry.c
@@ -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)
diff --git a/source4/param/param.i b/source4/param/param.i
index 06579f9b26..c04c9279f4 100644
--- a/source4/param/param.i
+++ b/source4/param/param.i
@@ -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);
diff --git a/source4/param/param.py b/source4/param/param.py
index 5c455671f9..3662c99a9c 100644
--- a/source4/param/param.py
+++ b/source4/param/param.py
@@ -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
diff --git a/source4/param/param_wrap.c b/source4/param/param_wrap.c
index 2849950f7a..6ce17957c1 100644
--- a/source4/param/param_wrap.c
+++ b/source4/param/param_wrap.c
@@ -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 }
};
diff --git a/source4/scripting/python/config.mk b/source4/scripting/python/config.mk
index 8eb0aab528..1f57294c59 100644
--- a/source4/scripting/python/config.mk
+++ b/source4/scripting/python/config.mk
@@ -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")
diff --git a/source4/scripting/python/pymisc.c b/source4/scripting/python/pyglue.c
index 2ba682a6d2..381792b735 100644
--- a/source4/scripting/python/pymisc.c
+++ b/source4/scripting/python/pyglue.c
@@ -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;
diff --git a/source4/scripting/python/samba/__init__.py b/source4/scripting/python/samba/__init__.py
index e191227108..e9fc26af20 100644
--- a/source4/scripting/python/samba/__init__.py
+++ b/source4/scripting/python/samba/__init__.py
@@ -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
diff --git a/source4/scripting/python/samba/idmap.py b/source4/scripting/python/samba/idmap.py
index 755ec52c7b..f8eeb18925 100644
--- a/source4/scripting/python/samba/idmap.py
+++ b/source4/scripting/python/samba/idmap.py
@@ -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.
diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py
index 568092926f..0819a0c8bf 100644
--- a/source4/scripting/python/samba/provision.py
+++ b/source4/scripting/python/samba/provision.py
@@ -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"))):
diff --git a/source4/scripting/python/samba/samdb.py b/source4/scripting/python/samba/samdb.py
index 4a64c2f76d..92b0bd7b89 100644
--- a/source4/scripting/python/samba/samdb.py
+++ b/source4/scripting/python/samba/samdb.py
@@ -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