[PATCH 07/18] s4: ntvfs, create push_xattr_blob_tdb_raw and pull_xattr_blob_tdb_raw that do not depend on pvfs objects

Matthieu Patou mat at matws.net
Fri Jan 8 02:57:59 MST 2010


  Following a talk with tridge on IRC, this patch allow (pull|push)_xattr_blob to be called without
  having a pvfs object. It's handy for programs that wants to manipulate xattr directly.
---
 source4/ntvfs/posix/xattr_tdb.c |   76 +++++++++++++++++++++++++--------------
 1 files changed, 49 insertions(+), 27 deletions(-)

diff --git a/source4/ntvfs/posix/xattr_tdb.c b/source4/ntvfs/posix/xattr_tdb.c
index aa13fee..69324a3 100644
--- a/source4/ntvfs/posix/xattr_tdb.c
+++ b/source4/ntvfs/posix/xattr_tdb.c
@@ -20,9 +20,9 @@
 */
 
 #include "includes.h"
-#include "vfs_posix.h"
-#include "../tdb/include/tdb.h"
 #include "tdb_wrap.h"
+#include "../tdb/include/tdb.h"
+#include "vfs_posix.h"
 
 #define XATTR_LIST_ATTR ".xattr_list"
 
@@ -30,7 +30,7 @@
   we need to maintain a list of attributes on each file, so that unlink
   can automatically clean them up
 */
-static NTSTATUS xattr_tdb_add_list(struct pvfs_state *pvfs, const char *attr_name, 
+static NTSTATUS xattr_tdb_add_list(struct tdb_wrap *ea_tdb, TALLOC_CTX *ctx, const char *attr_name,
 				   const char *fname, int fd)
 {
 	DATA_BLOB blob;
@@ -43,9 +43,9 @@ static NTSTATUS xattr_tdb_add_list(struct pvfs_state *pvfs, const char *attr_nam
 		return NT_STATUS_OK;
 	}
 
-	mem_ctx = talloc_new(pvfs);
+	mem_ctx = talloc_new(ctx);
 
-	status = pull_xattr_blob_tdb(pvfs, mem_ctx, XATTR_LIST_ATTR, 
+	status = pull_xattr_blob_tdb_raw(ea_tdb, mem_ctx, XATTR_LIST_ATTR,
 				     fname, fd, 100, &blob);
 	if (!NT_STATUS_IS_OK(status)) {
 		blob = data_blob(NULL, 0);
@@ -68,16 +68,16 @@ static NTSTATUS xattr_tdb_add_list(struct pvfs_state *pvfs, const char *attr_nam
 	memcpy(blob.data + blob.length, attr_name, len);
 	blob.length += len;
 
-	status = push_xattr_blob_tdb(pvfs, XATTR_LIST_ATTR, fname, fd, &blob);
+	status = push_xattr_blob_tdb_raw(ea_tdb,ctx, XATTR_LIST_ATTR, fname, fd, &blob);
 	talloc_free(mem_ctx);
 
 	return status;
 }
 
 /*
-  form a key for using in the ea_db
+  form a key for using in the ea_tdb
 */
-static NTSTATUS get_ea_db_key(TALLOC_CTX *mem_ctx,
+static NTSTATUS get_ea_tdb_key(TALLOC_CTX *mem_ctx,
 			      const char *attr_name,
 			      const char *fname, int fd, 
 			      TDB_DATA *key)
@@ -108,26 +108,28 @@ static NTSTATUS get_ea_db_key(TALLOC_CTX *mem_ctx,
 	return NT_STATUS_OK;
 }
 
+
+
 /*
-  pull a xattr as a blob, using the ea_db tdb
+  pull a xattr as a blob, using the ea_tdb_context tdb
 */
-NTSTATUS pull_xattr_blob_tdb(struct pvfs_state *pvfs,
+NTSTATUS pull_xattr_blob_tdb_raw(struct tdb_wrap *ea_tdb,
 			     TALLOC_CTX *mem_ctx,
-			     const char *attr_name, 
-			     const char *fname, 
-			     int fd, 
+			     const char *attr_name,
+			     const char *fname,
+			     int fd,
 			     size_t estimated_size,
 			     DATA_BLOB *blob)
 {
 	TDB_DATA tkey, tdata;
 	NTSTATUS status;
 
-	status = get_ea_db_key(mem_ctx, attr_name, fname, fd, &tkey);
+	status = get_ea_tdb_key(mem_ctx, attr_name, fname, fd, &tkey);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
 
-	tdata = tdb_fetch(pvfs->ea_db->tdb, tkey);
+	tdata = tdb_fetch(ea_tdb->tdb, tkey);
 	if (tdata.dptr == NULL) {
 		return NT_STATUS_NOT_FOUND;
 	}
@@ -141,19 +143,31 @@ NTSTATUS pull_xattr_blob_tdb(struct pvfs_state *pvfs,
 	return NT_STATUS_OK;	
 }
 
+NTSTATUS pull_xattr_blob_tdb(struct pvfs_state *pvfs,
+			     TALLOC_CTX *mem_ctx,
+			     const char *attr_name,
+			     const char *fname,
+			     int fd,
+			     size_t estimated_size,
+			     DATA_BLOB *blob)
+{
+	return pull_xattr_blob_tdb_raw(pvfs->ea_db,mem_ctx,attr_name,fname,fd,estimated_size,blob);
+}
+
 /*
-  push a xattr as a blob, using ea_db
+  push a xattr as a blob, using ea_tdb
 */
-NTSTATUS push_xattr_blob_tdb(struct pvfs_state *pvfs,
-			     const char *attr_name, 
-			     const char *fname, 
-			     int fd, 
+NTSTATUS push_xattr_blob_tdb_raw(struct tdb_wrap *ea_tdb,
+			     TALLOC_CTX *mem_ctx,
+			     const char *attr_name,
+			     const char *fname,
+			     int fd,
 			     const DATA_BLOB *blob)
 {
 	TDB_DATA tkey, tdata;
 	NTSTATUS status;
 
-	status = get_ea_db_key(pvfs, attr_name, fname, fd, &tkey);
+	status = get_ea_tdb_key(mem_ctx, attr_name, fname, fd, &tkey);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -161,25 +175,33 @@ NTSTATUS push_xattr_blob_tdb(struct pvfs_state *pvfs,
 	tdata.dptr = blob->data;
 	tdata.dsize = blob->length;
 
-	if (tdb_chainlock(pvfs->ea_db->tdb, tkey) != 0) {
+	if (tdb_chainlock(ea_tdb->tdb, tkey) != 0) {
 		talloc_free(tkey.dptr);
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
-	status = xattr_tdb_add_list(pvfs, attr_name, fname, fd);
+	status = xattr_tdb_add_list(ea_tdb,mem_ctx, attr_name, fname, fd);
 	if (!NT_STATUS_IS_OK(status)) {
 		goto done;
 	}
 
-	if (tdb_store(pvfs->ea_db->tdb, tkey, tdata, TDB_REPLACE) == -1) {
+	if (tdb_store(ea_tdb->tdb, tkey, tdata, TDB_REPLACE) == -1) {
 		status = NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
 done:
-	tdb_chainunlock(pvfs->ea_db->tdb, tkey);
+	tdb_chainunlock(ea_tdb->tdb, tkey);
 	talloc_free(tkey.dptr);
 	return status;	
 }
+NTSTATUS push_xattr_blob_tdb(struct pvfs_state *pvfs,
+			     const char *attr_name,
+			     const char *fname,
+			     int fd,
+			     const DATA_BLOB *blob)
+{
+	return push_xattr_blob_tdb_raw(pvfs->ea_db,pvfs,attr_name,fname,fd,blob);
+}
 
 
 /*
@@ -191,7 +213,7 @@ NTSTATUS delete_xattr_tdb(struct pvfs_state *pvfs, const char *attr_name,
 	TDB_DATA tkey;
 	NTSTATUS status;
 
-	status = get_ea_db_key(NULL, attr_name, fname, fd, &tkey);
+	status = get_ea_tdb_key(NULL, attr_name, fname, fd, &tkey);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -217,7 +239,7 @@ NTSTATUS unlink_xattr_tdb(struct pvfs_state *pvfs, const char *fname)
 	const char *s;
 	NTSTATUS status;
 
-	status = pull_xattr_blob_tdb(pvfs, mem_ctx, XATTR_LIST_ATTR, 
+	status = pull_xattr_blob_tdb(pvfs, mem_ctx, XATTR_LIST_ATTR,
 				     fname, -1, 100, &blob);
 	if (!NT_STATUS_IS_OK(status)) {
 		talloc_free(mem_ctx);
-- 
1.6.3.3


--------------080603070205020905060303
Content-Type: text/x-patch;
 name="0008-s4-allow-wrap_setxattr-and-wrap_getxattr-to-operate-.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
 filename*0="0008-s4-allow-wrap_setxattr-and-wrap_getxattr-to-operate-.pa";
 filename*1="tch"



More information about the samba-technical mailing list