From 64552e11dd4435ebd85a0c291987457a99d7fe50 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 27 Aug 2010 02:17:26 +0200 Subject: 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 --- source4/librpc/rpc/pyrpc_util.c | 61 +++++++++++++++++++++++++++++++++++++++++ source4/librpc/rpc/pyrpc_util.h | 28 +++++++++++++++++++ source4/librpc/wscript_build | 6 ++++ 3 files changed, 95 insertions(+) create mode 100644 source4/librpc/rpc/pyrpc_util.c create mode 100644 source4/librpc/rpc/pyrpc_util.h (limited to 'source4/librpc') 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 + Copyright (C) 2010 Andrew Tridgell + + 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 . +*/ + +#include +#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 + Copyright (C) 2010 Andrew Tridgell + + 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 . +*/ + +#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', -- cgit