From 596f917693315cddcf4c453e75410ef786a7a8b0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 13 Sep 2016 04:48:13 +0200 Subject: s4:pyrpc: add pyrpc_{im,ex}port_union() helper functions Signed-off-by: Stefan Metzmacher Reviewed-by: Andreas Schneider --- source4/librpc/rpc/pyrpc_util.c | 93 +++++++++++++++++++++++++++++++++++++++++ source4/librpc/rpc/pyrpc_util.h | 5 +++ 2 files changed, 98 insertions(+) (limited to 'source4/librpc') 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__ */ -- cgit v1.2.1