diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2010-08-27 02:17:26 +0200 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2010-08-27 04:41:40 +0200 |
commit | 64552e11dd4435ebd85a0c291987457a99d7fe50 (patch) | |
tree | e8abc260ea3fcfd26934ecf2f0831e6aebb3a37f | |
parent | 5115f789c007a155e34505852d847b99b7f4c886 (diff) | |
download | samba-64552e11dd4435ebd85a0c291987457a99d7fe50.tar.gz samba-64552e11dd4435ebd85a0c291987457a99d7fe50.tar.bz2 samba-64552e11dd4435ebd85a0c291987457a99d7fe50.zip |
pyrpc: Add py_check_dcerpc_type().
This function checks whether the type of a PyObject matches a
DCE/RPC Python type.
Pair-Programmed-With: Andrew Tridgell <tridge@samba.org>
-rw-r--r-- | source4/libnet/py_net.c | 11 | ||||
-rw-r--r-- | source4/librpc/rpc/pyrpc_util.c | 61 | ||||
-rw-r--r-- | source4/librpc/rpc/pyrpc_util.h | 28 | ||||
-rwxr-xr-x | source4/librpc/wscript_build | 6 |
4 files changed, 98 insertions, 8 deletions
diff --git a/source4/libnet/py_net.c b/source4/libnet/py_net.c index 79abcd27ed..4f3e5db114 100644 --- a/source4/libnet/py_net.c +++ b/source4/libnet/py_net.c @@ -29,6 +29,7 @@ #include "lib/ldb/pyldb.h" #include "auth/gensec/gensec.h" #include "librpc/rpc/pyrpc.h" +#include "librpc/rpc/pyrpc_util.h" typedef struct { PyObject_HEAD @@ -407,12 +408,9 @@ static PyObject *py_net_replicate_chunk(py_net_Object *self, PyObject *args, PyO switch (level) { case 1: -#ifdef Py_TYPE - if (strcmp("drsuapi.DsGetNCChangesCtr1", Py_TYPE(py_ctr)->tp_name) != 0) { - PyErr_SetString(PyExc_TypeError, "Expected DsGetNCChangesCtr1 type for ctr"); + if (!py_check_dcerpc_type(py_ctr, "samba.dcerpc.drsuapi", "DsGetNCChangesCtr1")) { return NULL; } -#endif s->chunk.ctr1 = py_talloc_get_ptr(py_ctr); s->partition.nc = *s->chunk.ctr1->naming_context; s->partition.more_data = s->chunk.ctr1->more_data; @@ -421,12 +419,9 @@ static PyObject *py_net_replicate_chunk(py_net_Object *self, PyObject *args, PyO s->partition.highwatermark = s->chunk.ctr1->new_highwatermark; break; case 6: -#ifdef Py_TYPE - if (strcmp("drsuapi.DsGetNCChangesCtr6", Py_TYPE(py_ctr)->tp_name) != 0) { - PyErr_SetString(PyExc_TypeError, "Expected DsGetNCChangesCtr6 type for ctr"); + if (!py_check_dcerpc_type(py_ctr, "samba.dcerpc.drsuapi", "DsGetNCChangesCtr6")) { return NULL; } -#endif s->chunk.ctr6 = py_talloc_get_ptr(py_ctr); s->partition.nc = *s->chunk.ctr6->naming_context; s->partition.more_data = s->chunk.ctr6->more_data; diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c new file mode 100644 index 0000000000..e1d3450336 --- /dev/null +++ b/source4/librpc/rpc/pyrpc_util.c @@ -0,0 +1,61 @@ +/* + Unix SMB/CIFS implementation. + + Python interface to DCE/RPC library - utility functions. + + Copyright (C) 2010 Jelmer Vernooij <jelmer@samba.org> + Copyright (C) 2010 Andrew Tridgell <tridge@samba.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <Python.h> +#include "includes.h" +#include "librpc/rpc/pyrpc_util.h" + +#ifndef Py_TYPE /* Py_TYPE is only available on Python > 2.6 */ +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#endif + +bool py_check_dcerpc_type(PyObject *obj, const char *module, const char *typename) +{ + PyObject *mod; + PyTypeObject *type; + bool ret; + + mod = PyImport_ImportModule(module); + + if (mod == NULL) { + PyErr_Format(PyExc_RuntimeError, "Unable to import %s to check type %s", + module, typename); + return NULL; + } + + type = (PyTypeObject *)PyObject_GetAttrString(mod, typename); + Py_DECREF(mod); + if (type == NULL) { + PyErr_Format(PyExc_RuntimeError, "Unable to find type %s in module %s", + module, typename); + return NULL; + } + + ret = PyObject_TypeCheck(obj, type); + Py_DECREF(type); + + if (!ret) + PyErr_Format(PyExc_TypeError, "Expected type %s.%s, got %s", + module, typename, Py_TYPE(obj)->tp_name); + + return ret; +} diff --git a/source4/librpc/rpc/pyrpc_util.h b/source4/librpc/rpc/pyrpc_util.h new file mode 100644 index 0000000000..67fd4fcef1 --- /dev/null +++ b/source4/librpc/rpc/pyrpc_util.h @@ -0,0 +1,28 @@ +/* + Unix SMB/CIFS implementation. + + Python interface to DCE/RPC library - utility functions. + + Copyright (C) 2010 Jelmer Vernooij <jelmer@samba.org> + Copyright (C) 2010 Andrew Tridgell <tridge@samba.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef __PYRPC_UTIL_H__ +#define __PYRPC_UTIL_H__ + +bool py_check_dcerpc_type(PyObject *obj, const char *module, const char *typename); + +#endif /* __PYRPC_UTIL_H__ */ diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build index 62cb229b9d..69f3850efb 100755 --- a/source4/librpc/wscript_build +++ b/source4/librpc/wscript_build @@ -637,6 +637,12 @@ bld.SAMBA_LIBRARY('dcerpc', vnum='0.0.1' ) +bld.SAMBA_SUBSYSTEM('pyrpc_util', + source='rpc/pyrpc_util.c', + public_deps='PYTALLOC', + needs_python=True, + ) + bld.SAMBA_PYTHON('python_dcerpc', source='rpc/pyrpc.c', |