svn commit: samba r23856 - in branches: SAMBA_3_2/source/modules SAMBA_3_2_0/source/modules

jra at samba.org jra at samba.org
Thu Jul 12 18:49:45 GMT 2007


Author: jra
Date: 2007-07-12 18:49:44 +0000 (Thu, 12 Jul 2007)
New Revision: 23856

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23856

Log:
Add Jiri.Sasek at Sun.COM;s fix from Axel Apitz for ZFS ACLs.
Jeremy.

Modified:
   branches/SAMBA_3_2/source/modules/vfs_zfsacl.c
   branches/SAMBA_3_2_0/source/modules/vfs_zfsacl.c


Changeset:
Modified: branches/SAMBA_3_2/source/modules/vfs_zfsacl.c
===================================================================
--- branches/SAMBA_3_2/source/modules/vfs_zfsacl.c	2007-07-12 18:11:41 UTC (rev 23855)
+++ branches/SAMBA_3_2/source/modules/vfs_zfsacl.c	2007-07-12 18:49:44 UTC (rev 23856)
@@ -4,6 +4,9 @@
  * Copyright (C) Jiri Sasek, 2007
  * based on the foobar.c module which is copyrighted by Volker Lendecke
  *
+ * Many thanks to Axel Apitz for help to fix the special ace's handling
+ * issues.
+ *
  * 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
@@ -71,7 +74,19 @@
 		aceprop.aceFlags = (uint32) acebuf[i].a_flags;
 		aceprop.aceMask  = (uint32) acebuf[i].a_access_mask;
 		aceprop.who.id   = (uint32) acebuf[i].a_who;
-		aceprop.flags    = 0;
+
+		if(aceprop.aceFlags & ACE_OWNER) {
+			aceprop.flags = SMB_ACE4_ID_SPECIAL;
+			aceprop.who.special_id = SMB_ACE4_WHO_OWNER;
+		} else if(aceprop.aceFlags & ACE_GROUP) {
+			aceprop.flags = SMB_ACE4_ID_SPECIAL;
+			aceprop.who.special_id = SMB_ACE4_WHO_GROUP;
+		} else if(aceprop.aceFlags & ACE_EVERYONE) {
+			aceprop.flags = SMB_ACE4_ID_SPECIAL;
+			aceprop.who.special_id = SMB_ACE4_WHO_EVERYONE;
+		} else {
+			aceprop.flags	= 0;
+		}
 		if(smb_add_ace4(pacl, &aceprop) == NULL) return 0;
 	}
 
@@ -103,6 +118,23 @@
 		acebuf[i].a_flags       = aceprop->aceFlags;
 		acebuf[i].a_access_mask = aceprop->aceMask;
 		acebuf[i].a_who         = aceprop->who.id;
+		if(aceprop->flags & SMB_ACE4_ID_SPECIAL) {
+			switch(aceprop->who.special_id) {
+			case SMB_ACE4_WHO_EVERYONE:
+				acebuf[i].a_flags |= ACE_EVERYONE;
+				break;
+			case SMB_ACE4_WHO_OWNER:
+				acebuf[i].a_flags |= ACE_OWNER;
+				break;
+			case SMB_ACE4_WHO_GROUP:
+				acebuf[i].a_flags |= ACE_GROUP;
+				break;
+			default:
+				DEBUG(8, ("unsupported special_id %d\n", \
+					aceprop->who.special_id));
+				continue; /* don't add it !!! */
+			}
+		}
 	}
 	SMB_ASSERT(i == naces);
 
@@ -178,8 +210,23 @@
 	{SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
 };
 
+/* != 0 if this module will be compiled as static */
+
+#define STATIC 0
+
+#if STATIC
 NTSTATUS vfs_zfsacl_init(void);
-NTSTATUS vfs_zfsacl_init(void)
+#else
+NTSTATUS init_module(void);
+#endif
+
+NTSTATUS
+#if STATIC
+	vfs_zfsacl_init
+#else
+	init_module
+#endif
+		(void)
 {
 	return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "zfsacl",
 				zfsacl_ops);

Modified: branches/SAMBA_3_2_0/source/modules/vfs_zfsacl.c
===================================================================
--- branches/SAMBA_3_2_0/source/modules/vfs_zfsacl.c	2007-07-12 18:11:41 UTC (rev 23855)
+++ branches/SAMBA_3_2_0/source/modules/vfs_zfsacl.c	2007-07-12 18:49:44 UTC (rev 23856)
@@ -4,6 +4,9 @@
  * Copyright (C) Jiri Sasek, 2007
  * based on the foobar.c module which is copyrighted by Volker Lendecke
  *
+ * Many thanks to Axel Apitz for help to fix the special ace's handling
+ * issues.
+ *
  * 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
@@ -71,7 +74,19 @@
 		aceprop.aceFlags = (uint32) acebuf[i].a_flags;
 		aceprop.aceMask  = (uint32) acebuf[i].a_access_mask;
 		aceprop.who.id   = (uint32) acebuf[i].a_who;
-		aceprop.flags    = 0;
+
+		if(aceprop.aceFlags & ACE_OWNER) {
+			aceprop.flags = SMB_ACE4_ID_SPECIAL;
+			aceprop.who.special_id = SMB_ACE4_WHO_OWNER;
+		} else if(aceprop.aceFlags & ACE_GROUP) {
+			aceprop.flags = SMB_ACE4_ID_SPECIAL;
+			aceprop.who.special_id = SMB_ACE4_WHO_GROUP;
+		} else if(aceprop.aceFlags & ACE_EVERYONE) {
+			aceprop.flags = SMB_ACE4_ID_SPECIAL;
+			aceprop.who.special_id = SMB_ACE4_WHO_EVERYONE;
+		} else {
+			aceprop.flags	= 0;
+		}
 		if(smb_add_ace4(pacl, &aceprop) == NULL) return 0;
 	}
 
@@ -103,6 +118,23 @@
 		acebuf[i].a_flags       = aceprop->aceFlags;
 		acebuf[i].a_access_mask = aceprop->aceMask;
 		acebuf[i].a_who         = aceprop->who.id;
+		if(aceprop->flags & SMB_ACE4_ID_SPECIAL) {
+			switch(aceprop->who.special_id) {
+			case SMB_ACE4_WHO_EVERYONE:
+				acebuf[i].a_flags |= ACE_EVERYONE;
+				break;
+			case SMB_ACE4_WHO_OWNER:
+				acebuf[i].a_flags |= ACE_OWNER;
+				break;
+			case SMB_ACE4_WHO_GROUP:
+				acebuf[i].a_flags |= ACE_GROUP;
+				break;
+			default:
+				DEBUG(8, ("unsupported special_id %d\n", \
+					aceprop->who.special_id));
+				continue; /* don't add it !!! */
+			}
+		}
 	}
 	SMB_ASSERT(i == naces);
 
@@ -178,8 +210,23 @@
 	{SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
 };
 
+/* != 0 if this module will be compiled as static */
+
+#define STATIC 0
+
+#if STATIC
 NTSTATUS vfs_zfsacl_init(void);
-NTSTATUS vfs_zfsacl_init(void)
+#else
+NTSTATUS init_module(void);
+#endif
+
+NTSTATUS
+#if STATIC
+	vfs_zfsacl_init
+#else
+	init_module
+#endif
+		(void)
 {
 	return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "zfsacl",
 				zfsacl_ops);



More information about the samba-cvs mailing list