s3/s4 build: Fix Py_RETURN_NONE to work with python versions < 2.4
[tprouty/samba.git] / source4 / lib / ldb / pyldb.c
index 4d4550eb720aff8c2aa5c2ebe090e66551a0a953..b7a78e8f531607ff48a05e287d0af776eca865da 100644 (file)
 */
 
 #include "ldb_includes.h"
+#include "../lib/util/python_util.h"
 #include "pyldb.h"
 
+/* There's no Py_ssize_t in 2.4, apparently */
+#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5
+typedef int Py_ssize_t;
+typedef inquiry lenfunc;
+typedef intargfunc ssizeargfunc;
+#endif
+
 /* Picked out of thin air. To do this properly, we should probably have some part of the 
  * errors in LDB be allocated to bindings ? */
 #define LDB_ERR_PYTHON_EXCEPTION       142
@@ -94,7 +102,7 @@ static PyObject *PyLdbResult_FromResult(struct ldb_result *result)
        PyObject *ret;
        int i;
        if (result == NULL) {
-               return Py_None;
+               Py_RETURN_NONE;
        } 
        ret = PyList_New(result->count);
        for (i = 0; i < result->count; i++) {
@@ -363,7 +371,7 @@ static PyObject *py_ldb_set_debug(PyLdbObject *self, PyObject *args)
        /* FIXME: Where do we DECREF cb ? */
        PyErr_LDB_ERROR_IS_ERR_RAISE(ldb_set_debug(self->ldb_ctx, py_ldb_debug, cb), PyLdb_AsLdbContext(self));
        
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_set_create_perms(PyTypeObject *self, PyObject *args)
@@ -374,7 +382,7 @@ static PyObject *py_ldb_set_create_perms(PyTypeObject *self, PyObject *args)
 
        ldb_set_create_perms(PyLdb_AsLdbContext(self), perms);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_set_modules_dir(PyTypeObject *self, PyObject *args)
@@ -385,31 +393,31 @@ static PyObject *py_ldb_set_modules_dir(PyTypeObject *self, PyObject *args)
 
        ldb_set_modules_dir(PyLdb_AsLdbContext(self), modules_dir);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_transaction_start(PyLdbObject *self)
 {
        PyErr_LDB_ERROR_IS_ERR_RAISE(ldb_transaction_start(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_transaction_commit(PyLdbObject *self)
 {
        PyErr_LDB_ERROR_IS_ERR_RAISE(ldb_transaction_commit(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_transaction_cancel(PyLdbObject *self)
 {
        PyErr_LDB_ERROR_IS_ERR_RAISE(ldb_transaction_cancel(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_setup_wellknown_attributes(PyLdbObject *self)
 {
        PyErr_LDB_ERROR_IS_ERR_RAISE(ldb_setup_wellknown_attributes(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_repr(PyLdbObject *self)
@@ -421,7 +429,7 @@ static PyObject *py_ldb_get_root_basedn(PyLdbObject *self)
 {
        struct ldb_dn *dn = ldb_get_root_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
-               return Py_None;
+               Py_RETURN_NONE;
        return PyLdbDn_FromDn(dn);
 }
 
@@ -430,7 +438,7 @@ static PyObject *py_ldb_get_schema_basedn(PyLdbObject *self)
 {
        struct ldb_dn *dn = ldb_get_schema_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
-               return Py_None;
+               Py_RETURN_NONE;
        return PyLdbDn_FromDn(dn);
 }
 
@@ -439,7 +447,7 @@ static PyObject *py_ldb_get_config_basedn(PyLdbObject *self)
 {
        struct ldb_dn *dn = ldb_get_config_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
-               return Py_None;
+               Py_RETURN_NONE;
        return PyLdbDn_FromDn(dn);
 }
 
@@ -448,7 +456,7 @@ static PyObject *py_ldb_get_default_basedn(PyLdbObject *self)
 {
        struct ldb_dn *dn = ldb_get_default_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
-               return Py_None;
+               Py_RETURN_NONE;
        return PyLdbDn_FromDn(dn);
 }
 
@@ -531,7 +539,7 @@ static PyObject *py_ldb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs
 static PyObject *py_ldb_connect(PyLdbObject *self, PyObject *args, PyObject *kwargs)
 {
        char *url;
-       int flags;
+       int flags = 0;
        PyObject *py_options = Py_None;
        int ret;
        const char **options;
@@ -553,7 +561,7 @@ static PyObject *py_ldb_connect(PyLdbObject *self, PyObject *args, PyObject *kwa
 
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, PyLdb_AsLdbContext(self));
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_modify(PyLdbObject *self, PyObject *args)
@@ -571,7 +579,7 @@ static PyObject *py_ldb_modify(PyLdbObject *self, PyObject *args)
        ret = ldb_modify(PyLdb_AsLdbContext(self), PyLdbMessage_AsMessage(py_msg));
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, PyLdb_AsLdbContext(self));
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args)
@@ -628,7 +636,7 @@ static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args)
        ret = ldb_add(PyLdb_AsLdbContext(self), msg);
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, PyLdb_AsLdbContext(self));
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 
@@ -650,7 +658,7 @@ static PyObject *py_ldb_delete(PyLdbObject *self, PyObject *args)
        ret = ldb_delete(ldb, dn);
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, ldb);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_rename(PyLdbObject *self, PyObject *args)
@@ -672,7 +680,7 @@ static PyObject *py_ldb_rename(PyLdbObject *self, PyObject *args)
        ret = ldb_rename(ldb, dn1, dn2);
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, ldb);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_schema_attribute_remove(PyLdbObject *self, PyObject *args)
@@ -683,7 +691,7 @@ static PyObject *py_ldb_schema_attribute_remove(PyLdbObject *self, PyObject *arg
 
        ldb_schema_attribute_remove(PyLdb_AsLdbContext(self), name);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_schema_attribute_add(PyLdbObject *self, PyObject *args)
@@ -698,13 +706,13 @@ static PyObject *py_ldb_schema_attribute_add(PyLdbObject *self, PyObject *args)
 
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, PyLdb_AsLdbContext(self));
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *ldb_ldif_to_pyobject(struct ldb_ldif *ldif)
 {
        if (ldif == NULL) {
-               return Py_None;
+               Py_RETURN_NONE;
        } else {
        /* We don't want this attached to the 'ldb' any more */
                talloc_steal(NULL, ldif);
@@ -751,12 +759,12 @@ static PyObject *py_ldb_schema_format_value(PyLdbObject *self, PyObject *args)
        a = ldb_schema_attribute_by_name(PyLdb_AsLdbContext(self), element_name);
 
        if (a == NULL) {
-               return Py_None;
+               Py_RETURN_NONE;
        }
        
        if (a->syntax->ldif_write_fn(PyLdb_AsLdbContext(self), mem_ctx, &old_val, &new_val) != 0) {
                talloc_free(mem_ctx);
-               return Py_None;
+               Py_RETURN_NONE;
        }
 
        ret = PyString_FromStringAndSize((const char *)new_val.data, new_val.length);
@@ -841,6 +849,12 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
 
        talloc_free(req);
 
+       if (ret != LDB_SUCCESS) {
+               talloc_free(res);
+               PyErr_LDB_ERROR_IS_ERR_RAISE(ret, ldb_ctx);
+               return NULL;
+       }
+
        return PyLdbResult_FromResult(res);
 }
 
@@ -855,7 +869,7 @@ static PyObject *py_ldb_get_opaque(PyLdbObject *self, PyObject *args)
        data = ldb_get_opaque(PyLdb_AsLdbContext(self), name);
 
        if (data == NULL)
-               return Py_None;
+               Py_RETURN_NONE;
 
        /* FIXME: More interpretation */
 
@@ -874,7 +888,7 @@ static PyObject *py_ldb_set_opaque(PyLdbObject *self, PyObject *args)
 
        ldb_set_opaque(PyLdb_AsLdbContext(self), name, data);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_modules(PyLdbObject *self)
@@ -1070,19 +1084,19 @@ static PyObject *py_ldb_module_str(PyLdbModuleObject *self)
 static PyObject *py_ldb_module_start_transaction(PyLdbModuleObject *self)
 {
        PyLdbModule_AsModule(self)->ops->start_transaction(PyLdbModule_AsModule(self));
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_module_end_transaction(PyLdbModuleObject *self)
 {
        PyLdbModule_AsModule(self)->ops->end_transaction(PyLdbModule_AsModule(self));
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_module_del_transaction(PyLdbModuleObject *self)
 {
        PyLdbModule_AsModule(self)->ops->del_transaction(PyLdbModule_AsModule(self));
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_module_search(PyLdbModuleObject *self, PyObject *args, PyObject *kwargs)
@@ -1131,7 +1145,7 @@ static PyObject *py_ldb_module_add(PyLdbModuleObject *self, PyObject *args)
 
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, mod->ldb);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_module_modify(PyLdbModuleObject *self, PyObject *args) 
@@ -1153,7 +1167,7 @@ static PyObject *py_ldb_module_modify(PyLdbModuleObject *self, PyObject *args)
 
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, mod->ldb);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_module_delete(PyLdbModuleObject *self, PyObject *args) 
@@ -1173,7 +1187,7 @@ static PyObject *py_ldb_module_delete(PyLdbModuleObject *self, PyObject *args)
 
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, NULL);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_module_rename(PyLdbModuleObject *self, PyObject *args)
@@ -1195,7 +1209,7 @@ static PyObject *py_ldb_module_rename(PyLdbModuleObject *self, PyObject *args)
 
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, NULL);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyMethodDef py_ldb_module_methods[] = {
@@ -1243,14 +1257,16 @@ struct ldb_message_element *PyObject_AsMessageElement(TALLOC_CTX *mem_ctx,
                me->num_values = 1;
                me->values = talloc_array(me, struct ldb_val, me->num_values);
                me->values[0].length = PyString_Size(set_obj);
-               me->values[0].data = (uint8_t *)talloc_strdup(me->values, 
-                                                                                  PyString_AsString(set_obj));
+               me->values[0].data = (uint8_t *)talloc_strndup(me->values,
+                                       PyString_AsString(set_obj),
+                                       me->values[0].length);
        } else if (PySequence_Check(set_obj)) {
                int i;
                me->num_values = PySequence_Size(set_obj);
                me->values = talloc_array(me, struct ldb_val, me->num_values);
                for (i = 0; i < me->num_values; i++) {
                        PyObject *obj = PySequence_GetItem(set_obj, i);
+
                        me->values[i].length = PyString_Size(obj);
                        me->values[i].data = (uint8_t *)PyString_AsString(obj);
                }
@@ -1286,7 +1302,7 @@ static PyObject *py_ldb_msg_element_get(PyLdbMessageElementObject *self, PyObjec
        if (!PyArg_ParseTuple(args, "i", &i))
                return NULL;
        if (i < 0 || i >= PyLdbMessageElement_AsMessageElement(self)->num_values)
-               return Py_None;
+               Py_RETURN_NONE;
 
        return PyObject_FromLdbValue(NULL, PyLdbMessageElement_AsMessageElement(self), 
                                                                 &(PyLdbMessageElement_AsMessageElement(self)->values[i]));
@@ -1336,7 +1352,11 @@ PyObject *PyLdbMessageElement_FromMessageElement(struct ldb_message_element *el,
                PyErr_NoMemory();
                return NULL;
        }
-       ret->mem_ctx = talloc_reference(mem_ctx, el);
+       ret->mem_ctx = talloc_new(NULL);
+       if (talloc_reference(ret->mem_ctx, mem_ctx) == NULL) {
+               PyErr_NoMemory();
+               return NULL;
+       }
        ret->el = el;
        return (PyObject *)ret;
 }
@@ -1356,12 +1376,12 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
 
        if (py_elements != NULL) {
                int i;
-               if (!PySequence_Check(py_elements)) {
+               if (PyString_Check(py_elements)) {
                        el->num_values = 1;
                        el->values = talloc_array(el, struct ldb_val, 1);
                        el->values[0].data = (uint8_t *)PyString_AsString(py_elements);
                        el->values[0].length = PyString_Size(py_elements);
-               } else {
+               } else if (PySequence_Check(py_elements)) {
                        el->num_values = PySequence_Size(py_elements);
                        el->values = talloc_array(el, struct ldb_val, el->num_values);
                        for (i = 0; i < el->num_values; i++) {
@@ -1369,6 +1389,11 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
                                el->values[i].data = (uint8_t *)PyString_AsString(item);
                                el->values[i].length = PyString_Size(item);
                        }
+               } else {
+                       PyErr_SetString(PyExc_TypeError, 
+                                       "Expected string or list");
+                       talloc_free(el);
+                       return NULL;
                }
        }
 
@@ -1382,7 +1407,8 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
                return NULL;
        }
 
-       ret->mem_ctx = ret->el = el;
+       ret->mem_ctx = talloc_new(NULL);
+       ret->el = talloc_reference(ret->mem_ctx, el);
        return (PyObject *)ret;
 }
 
@@ -1415,7 +1441,7 @@ static PyObject *py_ldb_msg_element_str(PyLdbMessageElementObject *self)
        if (el->num_values == 1)
                return PyString_FromStringAndSize((char *)el->values[0].data, el->values[0].length);
        else 
-               return Py_None;
+               Py_RETURN_NONE;
 }
 
 static void py_ldb_msg_element_dealloc(PyLdbMessageElementObject *self)
@@ -1446,7 +1472,7 @@ static PyObject *py_ldb_msg_remove_attr(PyLdbMessageObject *self, PyObject *args
 
        ldb_msg_remove_attr(self->msg, name);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_ldb_msg_keys(PyLdbMessageObject *self)
@@ -1497,7 +1523,7 @@ static PyObject *py_ldb_msg_get(PyLdbMessageObject *self, PyObject *args)
 
        ret = py_ldb_msg_getitem_helper(self, name);
        if (ret == NULL)
-               return Py_None;
+               Py_RETURN_NONE;
        return ret;
 }
 
@@ -1588,7 +1614,8 @@ static PyObject *py_ldb_msg_new(PyTypeObject *type, PyObject *args, PyObject *kw
                return NULL;
        }
 
-       py_ret->mem_ctx = py_ret->msg = ret;
+       py_ret->mem_ctx = talloc_new(NULL);
+       py_ret->msg = talloc_reference(py_ret->mem_ctx, ret);
        return (PyObject *)py_ret;
 }
 
@@ -1960,7 +1987,7 @@ static PyObject *py_register_module(PyObject *module, PyObject *args)
 
        PyErr_LDB_ERROR_IS_ERR_RAISE(ret, NULL);
 
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 static PyObject *py_timestring(PyObject *module, PyObject *args)