[PATCH 4/9] s4: add python bindings for wrap_(s|g)etxattr

Matthieu Patou mat at matws.net
Mon Nov 9 10:53:34 MST 2009


---
 source4/scripting/python/config.mk |   11 +++-
 source4/scripting/python/pyglue.c  |    4 +-
 source4/scripting/python/pyxattr.c |  107 ++++++++++++++++++++++++++++++++++++
 3 files changed, 119 insertions(+), 3 deletions(-)
 create mode 100644 source4/scripting/python/pyxattr.c

diff --git a/source4/scripting/python/config.mk b/source4/scripting/python/config.mk
index a5e3f25..c861772 100644
--- a/source4/scripting/python/config.mk
+++ b/source4/scripting/python/config.mk
@@ -17,12 +17,21 @@ python_uuid_OBJ_FILES = $(pyscriptsrcdir)/uuidmodule.o
 
 [PYTHON::python_glue]
 LIBRARY_REALNAME = samba/glue.$(SHLIBEXT)
-PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS pyldb python_dcerpc_misc python_dcerpc_security pyauth pyldb_util pyparam_util
+PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS pyldb python_dcerpc_misc python_dcerpc_security pyauth pyldb_util pyparam_util WRAP_XATTR
 
 python_glue_OBJ_FILES = $(pyscriptsrcdir)/pyglue.o
 
 $(python_glue_OBJ_FILES): CFLAGS+=-I$(ldbsrcdir)
 
+[PYTHON::python_xattr]
+LIBRARY_REALNAME = samba/xattr.$(SHLIBEXT)
+PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS  python_dcerpc_security pyparam_util WRAP_XATTR
+#PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS  python_dcerpc_security pyauth pyldb_util pyparam_util WRAP_XATTR
+
+python_xattr_OBJ_FILES = $(pyscriptsrcdir)/pyxattr.o
+
+$(python_xattr_OBJ_FILES): CFLAGS+=-I$(ldbsrcdir)
+
 _PY_FILES = $(shell find $(pyscriptsrcdir)/samba ../lib/subunit/python -name "*.py")
 
 $(eval $(foreach pyfile, $(_PY_FILES),$(call python_py_module_template,$(patsubst $(pyscriptsrcdir)/%,%,$(subst ../lib/subunit/python,,$(pyfile))),$(pyfile))))
diff --git a/source4/scripting/python/pyglue.c b/source4/scripting/python/pyglue.c
index 9f01102..b2a5520 100644
--- a/source4/scripting/python/pyglue.c
+++ b/source4/scripting/python/pyglue.c
@@ -54,8 +54,8 @@ static void PyErr_SetLdbError(PyObject *error, int ret, struct ldb_context *ldb_
 		return; /* Python exception should already be set, just keep that */
 
 	PyErr_SetObject(error, 
-					Py_BuildValue(discard_const_p(char, "(i,s)"), ret, 
-				  ldb_ctx == NULL?ldb_strerror(ret):ldb_errstring(ldb_ctx)));
+			Py_BuildValue(discard_const_p(char, "(i,s)"), ret, 
+			ldb_ctx == NULL?ldb_strerror(ret):ldb_errstring(ldb_ctx)));
 }
 
 static PyObject *py_ldb_get_exception(void)
diff --git a/source4/scripting/python/pyxattr.c b/source4/scripting/python/pyxattr.c
new file mode 100644
index 0000000..371334f
--- /dev/null
+++ b/source4/scripting/python/pyxattr.c
@@ -0,0 +1,107 @@
+/* 
+   Unix SMB/CIFS implementation. Xattr manipulation bindings.
+   Copyright (C) Matthieu Patou <mat at matws.net> 2009
+   Base on work of pyglue.c by Jelmer Vernooij <jelmer at samba.org> 2007 and
+    Matthias Dieter Wallnöfer 2009
+   
+   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 "version.h"
+#include "includes.h"
+#include "librpc/ndr/libndr.h"
+#include "lib/util/wrap_xattr.h"
+
+#ifndef Py_RETURN_NONE
+#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
+#endif
+
+
+static PyObject *py_wrap_setxattr(PyObject *self, PyObject *args)
+{
+	char *filename, *attribute;
+	int ret = 0;
+	DATA_BLOB blob;
+	if (!PyArg_ParseTuple(args, "sss#", &filename,&attribute,&blob.data,&blob.length))
+		return NULL;
+	ret = wrap_setxattr(filename,attribute,blob.data,blob.length,0); 
+	if( ret < 0 ) {
+		PyErr_SetString(PyExc_TypeError, strerror(errno));
+		return NULL;
+	}
+	Py_RETURN_NONE;
+}
+
+static PyObject *py_wrap_getxattr(PyObject *self, PyObject *args)
+{
+	char *filename, *attribute;
+	int len;
+	TALLOC_CTX *mem_ctx;
+	uint8_t *buf;
+	PyObject *ret;
+	if (!PyArg_ParseTuple(args, "ss", &filename,&attribute))
+		return NULL;
+	
+	mem_ctx = talloc_new(NULL);
+	len = wrap_getxattr(filename,attribute,NULL,0); 
+	if( len < 0 ) {
+		PyErr_SetString(PyExc_TypeError, strerror(errno));
+		return NULL;
+	}
+	/* check length ... */
+	buf = talloc_zero_array(mem_ctx, uint8_t, len);
+	len = getxattr(filename,attribute,buf,len); 
+	if( len < 0 ) {
+		PyErr_SetString(PyExc_TypeError, strerror(errno));
+		return NULL;
+	}
+	ret = PyString_FromStringAndSize(buf,len);
+	talloc_free(buf);
+	return ret;
+}
+
+static PyMethodDef py_xattr_methods[] = {
+	{ "wrap_getxattr", (PyCFunction)py_wrap_getxattr, METH_VARARGS,
+		"wrap_getxattr(filename,attribute) -> blob\n"
+		"Retreive given attribute on the given file." },
+	{ "wrap_setxattr", (PyCFunction)py_wrap_setxattr, METH_VARARGS,
+		"wrap_setxattr(filename,attribute,value)\n"
+		"Set the given attribute to the given value on the given file." },
+	{ NULL }
+};
+
+void initxattr(void)
+{
+	PyObject *m;
+
+	fprintf(stderr,"called ?\n");
+	m = Py_InitModule3("xattr", py_xattr_methods, 
+			   "Python bindings for xattr manipulation.");
+	if (m == NULL)
+		return;
+
+	PyModule_AddObject(m, "version", PyString_FromString(SAMBA_VERSION_STRING));
+
+	/* one of the most annoying things about python scripts is
+ 	   that they don't die when you hit control-C. This fixes that
+ 	   sillyness. As we do all database operations using
+ 	   transactions, this is also safe. In fact, not dying
+ 	   immediately is unsafe as we could end up treating the
+ 	   control-C exception as a different error and try to modify
+ 	   as database incorrectly 
+	*/
+	signal(SIGINT, SIG_DFL);
+}
+
-- 
1.6.3.3


--------------040902060508090209080608
Content-Type: text/x-patch;
 name="0005-s4-Create-unit-tests-for-python-samba.xattr-module.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0005-s4-Create-unit-tests-for-python-samba.xattr-module.patc";
 filename*1="h"



More information about the samba-technical mailing list