diff options
author | Matthieu Patou <mat@matws.net> | 2010-01-11 02:19:22 +0300 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2010-01-21 07:11:18 +1300 |
commit | 1a143b8a590f5173ccacb7368f3cf36a8785da33 (patch) | |
tree | 00a2b3a2074c5c245442909f49ebe2f09aa45716 | |
parent | c637c528762e5972bc47cc18f158186c670b4f7d (diff) | |
download | samba-1a143b8a590f5173ccacb7368f3cf36a8785da33.tar.gz samba-1a143b8a590f5173ccacb7368f3cf36a8785da33.tar.bz2 samba-1a143b8a590f5173ccacb7368f3cf36a8785da33.zip |
s4: allow python code to dump NTACL object as well
-rw-r--r-- | librpc/idl/xattr.idl | 1 | ||||
-rw-r--r-- | source4/librpc/ndr/py_xattr.c | 94 |
2 files changed, 95 insertions, 0 deletions
diff --git a/librpc/idl/xattr.idl b/librpc/idl/xattr.idl index 1dd98a9588..bc8c20c9ea 100644 --- a/librpc/idl/xattr.idl +++ b/librpc/idl/xattr.idl @@ -14,6 +14,7 @@ import "security.idl"; uuid("12345778-1234-abcd-0001-00000002"), version(0.0), helper("../librpc/ndr/ndr_xattr.h"), + pyhelper("librpc/ndr/py_xattr.c"), pointer_default(unique) ] interface xattr diff --git a/source4/librpc/ndr/py_xattr.c b/source4/librpc/ndr/py_xattr.c new file mode 100644 index 0000000000..15f2b9c33a --- /dev/null +++ b/source4/librpc/ndr/py_xattr.c @@ -0,0 +1,94 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Matthieu Patou <mat@matws.net> 2010 + + 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> + +#ifndef Py_RETURN_NONE +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#endif +static void PyType_AddMethods(PyTypeObject *type, PyMethodDef *methods) +{ + PyObject *dict; + int i; + if (type->tp_dict == NULL) + type->tp_dict = PyDict_New(); + dict = type->tp_dict; + for (i = 0; methods[i].ml_name; i++) { + PyObject *descr; + if (methods[i].ml_flags & METH_CLASS) + descr = PyCFunction_New(&methods[i], (PyObject *)type); + else + descr = PyDescr_NewMethod(type, &methods[i]); + PyDict_SetItemString(dict, methods[i].ml_name, + descr); + } +} + +static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3); + +static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...) +{ + va_list ap; + char *s = NULL; + int i; + + va_start(ap, format); + vasprintf(&s, format, ap); + va_end(ap); + + for (i=0;i<ndr->depth;i++) { + printf(" "); + } + + printf("%s\n", s); + free(s); +} + +static PyObject *py_ntacl_print(PyObject *self, PyObject *args) +{ + struct xattr_NTACL *ntacl = py_talloc_get_ptr(self); + struct ndr_print *pr; + TALLOC_CTX *mem_ctx; + + mem_ctx = talloc_new(NULL); + + pr = talloc_zero(mem_ctx, struct ndr_print); + if (!pr) return; + pr->print = ntacl_print_debug_helper; + ndr_print_xattr_NTACL(pr, "file", ntacl); + + talloc_free(pr); + + Py_RETURN_NONE; +} + +static PyMethodDef py_ntacl_extra_methods[] = { + { "dump", (PyCFunction)py_ntacl_print, METH_NOARGS, + NULL }, + { NULL } +}; + +static void py_xattr_NTACL_patch(PyTypeObject *type) +{ + PyType_AddMethods(type, py_ntacl_extra_methods); +} + +#define PY_NTACL_PATCH py_xattr_NTACL_patch + + |