diff options
author | Stefan Metzmacher <metze@samba.org> | 2016-09-13 04:48:13 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2016-10-26 11:20:19 +0200 |
commit | 596f917693315cddcf4c453e75410ef786a7a8b0 (patch) | |
tree | d1bbcfa41c0730cb50c623cf3900014485e36970 /source4/librpc | |
parent | 3a0ce3e41d9fdab58273c239955862b03396ea19 (diff) | |
download | samba-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.c | 93 | ||||
-rw-r--r-- | source4/librpc/rpc/pyrpc_util.h | 5 |
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__ */ |