summaryrefslogtreecommitdiff
path: root/source4/dsdb/pydsdb.c
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2010-04-04 00:40:01 +0200
committerJelmer Vernooij <jelmer@samba.org>2010-04-04 00:40:01 +0200
commit2a67eda98f88f132443bc2b81ca2686bcc1775a6 (patch)
treee97353e4510d4dbd8443de8e93aa9ce3a379c4a2 /source4/dsdb/pydsdb.c
parentccd954f2a7534cc27afd17b23e2fc838e10cf6b3 (diff)
downloadsamba-2a67eda98f88f132443bc2b81ca2686bcc1775a6.tar.gz
samba-2a67eda98f88f132443bc2b81ca2686bcc1775a6.tar.bz2
samba-2a67eda98f88f132443bc2b81ca2686bcc1775a6.zip
s4-python: Move set_opaque_integer -> dsdb.
Diffstat (limited to 'source4/dsdb/pydsdb.c')
-rw-r--r--source4/dsdb/pydsdb.c78
1 files changed, 72 insertions, 6 deletions
diff --git a/source4/dsdb/pydsdb.c b/source4/dsdb/pydsdb.c
index 248bc1a07a..b4f0b0f339 100644
--- a/source4/dsdb/pydsdb.c
+++ b/source4/dsdb/pydsdb.c
@@ -36,15 +36,15 @@ static PyObject *py_samdb_server_site_name(PyObject *self, PyObject *args)
PyObject *py_ldb, *result;
struct ldb_context *ldb;
const char *site;
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
+ TALLOC_CTX *mem_ctx;
- if (!PyArg_ParseTuple(args, "O", &py_ldb)) {
- talloc_free(mem_ctx);
+ if (!PyArg_ParseTuple(args, "O", &py_ldb))
return NULL;
- }
PyErr_LDB_OR_RAISE(py_ldb, ldb);
+ mem_ctx = talloc_new(NULL);
+
site = samdb_server_site_name(ldb, mem_ctx);
if (site == NULL) {
PyErr_SetString(PyExc_RuntimeError, "Failed to find server site");
@@ -57,9 +57,75 @@ static PyObject *py_samdb_server_site_name(PyObject *self, PyObject *args)
return result;
}
+/* XXX: This function really should be in pyldb.c */
+static PyObject *py_dsdb_set_opaque_integer(PyObject *self, PyObject *args)
+{
+ PyObject *py_ldb;
+ int value;
+ int *old_val, *new_val;
+ char *py_opaque_name, *opaque_name_talloc;
+ struct ldb_context *ldb;
+ TALLOC_CTX *tmp_ctx;
+
+ if (!PyArg_ParseTuple(args, "Osi", &py_ldb, &py_opaque_name, &value))
+ return NULL;
+
+ PyErr_LDB_OR_RAISE(py_ldb, ldb);
+
+ /* see if we have a cached copy */
+ old_val = (int *)ldb_get_opaque(ldb, py_opaque_name);
+ /* XXX: We shouldn't just blindly assume that the value that is
+ * already present has the size of an int and is not shared
+ * with other code that may rely on it not changing.
+ * JRV 20100403 */
+
+ if (old_val) {
+ *old_val = value;
+ Py_RETURN_NONE;
+ }
+
+ tmp_ctx = talloc_new(ldb);
+ if (tmp_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ new_val = talloc(tmp_ctx, int);
+ if (new_val == NULL) {
+ talloc_free(tmp_ctx);
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ opaque_name_talloc = talloc_strdup(tmp_ctx, py_opaque_name);
+ if (opaque_name_talloc == NULL) {
+ talloc_free(tmp_ctx);
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ *new_val = value;
+
+ /* cache the domain_sid in the ldb */
+ if (ldb_set_opaque(ldb, opaque_name_talloc, new_val) != LDB_SUCCESS) {
+ talloc_free(tmp_ctx);
+ PyErr_SetString(PyExc_RuntimeError,
+ "Failed to set opaque integer into the ldb");
+ return NULL;
+ }
+
+ talloc_steal(ldb, new_val);
+ talloc_steal(ldb, opaque_name_talloc);
+ talloc_free(tmp_ctx);
+
+ Py_RETURN_NONE;
+}
+
static PyMethodDef py_dsdb_methods[] = {
- { "server_site_name", (PyCFunction)py_samdb_server_site_name, METH_VARARGS,
- "get the server site name as a string"},
+ { "samdb_server_site_name", (PyCFunction)py_samdb_server_site_name,
+ METH_VARARGS, "Get the server site name as a string"},
+ { "dsdb_set_opaque_integer", (PyCFunction)py_dsdb_set_opaque_integer,
+ METH_VARARGS, NULL },
{ NULL }
};