[PATCH 08/18] s4: allow wrap_setxattr and wrap_getxattr to operate on tdb stored xattr

Matthieu Patou mat at matws.net
Fri Jan 8 03:03:51 MST 2010


---
 source4/scripting/python/config.mk        |   26 ++++--
 source4/scripting/python/pyxattr.c        |  115 -------------------------
 source4/scripting/python/pyxattr_native.c |  115 +++++++++++++++++++++++++
 source4/scripting/python/pyxattr_tdb.c    |  131 +++++++++++++++++++++++++++++
 4 files changed, 265 insertions(+), 122 deletions(-)
 delete mode 100644 source4/scripting/python/pyxattr.c
 create mode 100644 source4/scripting/python/pyxattr_native.c
 create mode 100644 source4/scripting/python/pyxattr_tdb.c

diff --git a/source4/scripting/python/config.mk b/source4/scripting/python/config.mk
index c861772..bb24121 100644
--- a/source4/scripting/python/config.mk
+++ b/source4/scripting/python/config.mk
@@ -17,20 +17,32 @@ 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 WRAP_XATTR
+PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS pyldb python_dcerpc_misc python_dcerpc_security pyauth pyldb_util pyparam_util 
 
 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::python_xattr_native]
+LIBRARY_REALNAME = samba/xattr_native.$(SHLIBEXT)
+PRIVATE_DEPENDENCIES = LIBNDR LIBLDB SAMDB CREDENTIALS  python_dcerpc_security pyparam_util WRAP_XATTR 
 
-python_xattr_OBJ_FILES = $(pyscriptsrcdir)/pyxattr.o
+python_xattr_native_OBJ_FILES = $(pyscriptsrcdir)/pyxattr_native.o
 
-$(python_xattr_OBJ_FILES): CFLAGS+=-I$(ldbsrcdir)
+$(python_xattr_native_OBJ_FILES): CFLAGS+=-I$(ldbsrcdir)
+
+#ntvfs_common pvfs_acl
+#$(ntvfs_posix_OBJ_FILES)
+[PYTHON::python_xattr_tdb]
+LIBRARY_REALNAME = samba/xattr_tdb.$(SHLIBEXT)
+PRIVATE_DEPENDENCIES = LIBNDR LIBLDB python_dcerpc_security pyparam_util share
+#dcerpc_server 
+
+python_xattr_tdb_OBJ_FILES = $(pyscriptsrcdir)/pyxattr_tdb.o  $(ntvfssrcdir)/posix/xattr_tdb.o 
+#{$(ntvfssrcdir)/ntvfs_interface.o
+#$(ntvfs_posix_OBJ_FILES)
+
+$(python_xattr_tdb_OBJ_FILES): CFLAGS+=-I$(ldbsrcdir)
 
 _PY_FILES = $(shell find $(pyscriptsrcdir)/samba ../lib/subunit/python -name "*.py")
 
diff --git a/source4/scripting/python/pyxattr.c b/source4/scripting/python/pyxattr.c
deleted file mode 100644
index 02455e5..0000000
--- a/source4/scripting/python/pyxattr.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* 
-   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_is_xattr_supported(PyObject *self)
-{
-#if !defined(HAVE_XATTR_SUPPORT)
-	return Py_False;
-#else
-	return Py_True;
-#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." },
-	{ "is_xattr_supported", (PyCFunction)py_is_xattr_supported, METH_NOARGS,
-		"Return true if xattr are supported on this system\n"},
-	{ NULL }
-};
-
-void initxattr(void)
-{
-	PyObject *m;
-
-	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);
-}
-
diff --git a/source4/scripting/python/pyxattr_native.c b/source4/scripting/python/pyxattr_native.c
new file mode 100644
index 0000000..3a4fbb5
--- /dev/null
+++ b/source4/scripting/python/pyxattr_native.c
@@ -0,0 +1,115 @@
+/* 
+   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_is_xattr_supported(PyObject *self)
+{
+#if !defined(HAVE_XATTR_SUPPORT)
+	return Py_False;
+#else
+	return Py_True;
+#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." },
+	{ "is_xattr_supported", (PyCFunction)py_is_xattr_supported, METH_NOARGS,
+		"Return true if xattr are supported on this system\n"},
+	{ NULL }
+};
+
+void initxattr_native(void)
+{
+	PyObject *m;
+
+	m = Py_InitModule3("xattr_native", 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);
+}
+
diff --git a/source4/scripting/python/pyxattr_tdb.c b/source4/scripting/python/pyxattr_tdb.c
new file mode 100644
index 0000000..75c95e2
--- /dev/null
+++ b/source4/scripting/python/pyxattr_tdb.c
@@ -0,0 +1,131 @@
+/* 
+   Unix SMB/CIFS implementation. Xattr manipulation bindings.
+   Copyright (C) Matthieu Patou <mat at matws.net> 2009-2010
+   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 "../tdb/include/tdb.h"
+#include "tdb_wrap.h"
+#include "librpc/ndr/libndr.h"
+#include "lib/util/wrap_xattr.h"
+#include "ntvfs/posix/vfs_posix.h"
+
+#ifndef Py_RETURN_NONE
+#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
+#endif
+
+static PyObject  *py_is_xattr_supported(PyObject *self)
+{
+/*#if !defined(HAVE_XATTR_SUPPORT)
+	return Py_False;
+#else
+	return Py_True;
+#endif*/
+	return Py_True;
+}
+static PyObject *py_wrap_setxattr(PyObject *self, PyObject *args)
+{
+	char *filename, *attribute, *tdbname;
+	DATA_BLOB blob;
+        NTSTATUS status;
+	TALLOC_CTX *mem_ctx;
+	struct tdb_wrap *eadb;
+
+	if (!PyArg_ParseTuple(args, "ssss#", &tdbname,&filename,&attribute,&blob.data,&blob.length))
+		return NULL;
+	
+	mem_ctx = talloc_new(NULL);
+	eadb = tdb_wrap_open(mem_ctx, tdbname, 50000,
+				TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
+
+	if (eadb == NULL) {
+		PyErr_SetFromErrno(PyExc_IOError);
+		return NULL;
+	}	status = push_xattr_blob_tdb_raw(eadb,mem_ctx,attribute,filename,-1,&blob);
+	if( !NT_STATUS_IS_OK(status) ) {
+		PyErr_SetString(PyExc_TypeError, strerror(errno));
+		return NULL;
+	}
+	Py_RETURN_NONE;
+}
+
+static PyObject *py_wrap_getxattr(PyObject *self, PyObject *args)
+{
+	char *filename, *attribute, *tdbname;
+	TALLOC_CTX *mem_ctx;
+	DATA_BLOB blob;
+	PyObject *ret;
+	NTSTATUS status;
+	struct tdb_wrap *eadb = NULL;
+
+	if (!PyArg_ParseTuple(args, "sss", &tdbname,&filename,&attribute))
+		return NULL;
+	
+	mem_ctx = talloc_new(NULL);
+	eadb = tdb_wrap_open(mem_ctx, tdbname, 50000,
+				TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
+	if (eadb == NULL) {
+
+		PyErr_SetFromErrno(PyExc_IOError);
+		return NULL;
+	}
+	status = pull_xattr_blob_tdb_raw(eadb,mem_ctx,attribute,filename,-1,100,&blob); 
+	if( !NT_STATUS_IS_OK(status) || blob.length < 0 ) {
+		PyErr_SetString(PyExc_TypeError, get_friendly_nt_error_msg(status));
+		return NULL;
+	}
+	ret = PyString_FromStringAndSize(blob.data,blob.length);
+	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." },
+	{ "is_xattr_supported", (PyCFunction)py_is_xattr_supported, METH_NOARGS,
+		"Return true if xattr backed by tdb are supported on this system\n"},
+	{ NULL }
+};
+
+void initxattr_tdb(void)
+{
+	PyObject *m;
+
+	m = Py_InitModule3("xattr_tdb", 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


--------------080603070205020905060303
Content-Type: text/x-patch;
 name="0009-s4-update-setntacl-and-getntacl-to-select-the-adaqua.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0009-s4-update-setntacl-and-getntacl-to-select-the-adaqua.pa";
 filename*1="tch"



More information about the samba-technical mailing list