summaryrefslogtreecommitdiff
path: root/source4/librpc
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2016-09-13 04:48:13 +0200
committerAndreas Schneider <asn@cryptomilk.org>2016-10-26 11:20:19 +0200
commit596f917693315cddcf4c453e75410ef786a7a8b0 (patch)
treed1bbcfa41c0730cb50c623cf3900014485e36970 /source4/librpc
parent3a0ce3e41d9fdab58273c239955862b03396ea19 (diff)
downloadsamba-596f917693315cddcf4c453e75410ef786a7a8b0.tar.gz
s4:pyrpc: add pyrpc_{im,ex}port_union() helper functions
Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'source4/librpc')
-rw-r--r--source4/librpc/rpc/pyrpc_util.c93
-rw-r--r--source4/librpc/rpc/pyrpc_util.h5
2 files changed, 98 insertions, 0 deletions
diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c
index 95443f7772c..cfbb9cb1977 100644
--- a/source4/librpc/rpc/pyrpc_util.c
+++ b/source4/librpc/rpc/pyrpc_util.c
@@ -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;
+}
diff --git a/source4/librpc/rpc/pyrpc_util.h b/source4/librpc/rpc/pyrpc_util.h
index 21454cae15b..12733122bb1 100644
--- a/source4/librpc/rpc/pyrpc_util.h
+++ b/source4/librpc/rpc/pyrpc_util.h
@@ -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__ */