s4:pyrpc: add pyrpc_{im,ex}port_union() helper functions
authorStefan Metzmacher <metze@samba.org>
Tue, 13 Sep 2016 02:48:13 +0000 (04:48 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 26 Oct 2016 09:20:19 +0000 (11:20 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source4/librpc/rpc/pyrpc_util.c
source4/librpc/rpc/pyrpc_util.h

index 95443f7772ce00fa1489bb65f250e058c56f8e01..cfbb9cb19776a6c23d467aa52f2d6c8949d1dfd2 100644 (file)
@@ -390,3 +390,96 @@ PyObject *PyString_FromStringOrNULL(const char *str)
        }
        return PyString_FromString(str);
 }
+
+PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+                            const void *in, const char *typename)
+{
+       static const char *mem_ctx_type = "TALLOC_CTX";
+       PyObject *mem_ctx_obj = NULL;
+       PyObject *in_obj = NULL;
+       PyObject *ret = NULL;
+
+       mem_ctx_obj = PyCObject_FromVoidPtrAndDesc(mem_ctx,
+                                       discard_const_p(char, mem_ctx_type),
+                                       NULL);
+       if (mem_ctx_obj == NULL) {
+               return NULL;
+       }
+
+       in_obj = PyCObject_FromVoidPtrAndDesc(discard_const(in),
+                                       discard_const_p(char, typename),
+                                       NULL);
+       if (in_obj == NULL) {
+               Py_XDECREF(mem_ctx_obj);
+               return NULL;
+       }
+
+       ret = PyObject_CallMethod((PyObject *)type,
+                                 discard_const_p(char, "__import__"),
+                                 discard_const_p(char, "OiO"),
+                                 mem_ctx_obj, level, in_obj);
+       Py_XDECREF(mem_ctx_obj);
+       Py_XDECREF(in_obj);
+       if (ret == NULL) {
+               return NULL;
+       }
+
+       return ret;
+}
+
+void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+                        PyObject *in, const char *typename)
+{
+       static const char *mem_ctx_type = "TALLOC_CTX";
+       PyObject *mem_ctx_obj = NULL;
+       PyObject *ret_obj = NULL;
+       const char *ret_desc = NULL;
+       void *ret = NULL;
+       int cmp;
+
+       mem_ctx_obj = PyCObject_FromVoidPtrAndDesc(mem_ctx,
+                                       discard_const_p(char, mem_ctx_type),
+                                       NULL);
+       if (mem_ctx_obj == NULL) {
+               return NULL;
+       }
+
+       ret_obj = PyObject_CallMethod((PyObject *)type,
+                                     discard_const_p(char, "__export__"),
+                                     discard_const_p(char, "OiO"),
+                                     mem_ctx_obj, level, in);
+       Py_XDECREF(mem_ctx_obj);
+       if (ret_obj == NULL) {
+               return NULL;
+       }
+
+       if (!PyCObject_Check(ret_obj)) {
+               Py_XDECREF(ret_obj);
+               PyErr_Format(PyExc_TypeError,
+                            "New %s.__export__() returned no PyCObject!",
+                            type->tp_name);
+               return NULL;
+       }
+
+       ret_desc = (const char *)PyCObject_GetDesc(ret_obj);
+       if (ret_desc == NULL) {
+               Py_XDECREF(ret_obj);
+               PyErr_Format(PyExc_TypeError,
+                            "New %s.__export__() returned no PyCObject_GetDesc()!",
+                            type->tp_name);
+               return NULL;
+       }
+
+       cmp = strncmp(typename, ret_desc, strlen(typename) + 1);
+       if (cmp != 0) {
+               Py_XDECREF(ret_obj);
+               PyErr_Format(PyExc_TypeError,
+                            "New %s.__export__() returned PyCObject_GetDesc() != %s!",
+                            type->tp_name, typename);
+               return NULL;
+       }
+
+       ret = PyCObject_AsVoidPtr(ret_obj);
+       Py_XDECREF(ret_obj);
+       return ret;
+}
index 21454cae15be6d68bf3a040843a7267d32264ed4..12733122bb19eed3bdfa57b9492785eea1255ddf 100644 (file)
@@ -59,4 +59,9 @@ PyObject *py_return_ndr_struct(const char *module_name, const char *type_name,
 
 PyObject *PyString_FromStringOrNULL(const char *str);
 
+PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+                            const void *in, const char *typename);
+void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+                        PyObject *in, const char *typename);
+
 #endif /* __PYRPC_UTIL_H__ */