c79da0ab4aab8a594e5f2c7aa1cf4ddb80b896a8
[rsync-patches.git] / adaptec_acl_mods.diff
1 To use this patch, run these commands for a successful build:
2
3     patch -p1 <patches/adaptec_acl_mods.diff
4     ./prepare-source
5     ./configure --enable-acl-support
6     make
7
8 Philip Lowman wrote:
9 > Attached is a small patch which allows the preservation of the delete,
10 > chmod, and chown bits which Adaptec has added to XFS on their SnapOS NAS
11 > units.  This is nice for backing up files between different NAS units
12 > and preserving all of the Samba ACLs.
13
14 > I'm not sure how useful this patch will be because I'm not sure if any
15 > other NAS vendors have standardized on their extensions to POSIX ACLs to
16 > support Samba in the same manner that Adaptec has.  FWIW, though, this
17 > will allow you to preserve acls when copying between different Adaptec
18 > based NAS units running SnapOS.
19
20 I (Wayne) tweaked the patch to work with the latest source.
21
22 Todo:
23
24 Fix a bug that could lose some bits when stripping some (supposedly)
25 superfluous ACL info.
26
27 diff --git a/lib/sysacls.c b/lib/sysacls.c
28 --- a/lib/sysacls.c
29 +++ b/lib/sysacls.c
30 @@ -30,6 +30,18 @@
31  #endif
32  #define DEBUG(x,y)
33  
34 +/* These are custom ACL bits used by Adaptec's modifications
35 + * to XFS on their SnapOS units. */
36 +#ifndef ACL_DELETE
37 +#define ACL_DELETE 8
38 +#endif
39 +#ifndef ACL_CHMOD
40 +#define ACL_CHMOD 16
41 +#endif
42 +#ifndef ACL_CHOWN
43 +#define ACL_CHOWN 32
44 +#endif
45 +
46  void SAFE_FREE(void *mem)
47  {
48         if (mem)
49 @@ -99,6 +111,9 @@ int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T *tag_type_p, uint32 *b
50                 return -1;
51  
52         *bits_p = (acl_get_perm(permset, ACL_READ) ? 4 : 0)
53 +               | (acl_get_perm(permset, ACL_CHOWN) ? 32 : 0)
54 +               | (acl_get_perm(permset, ACL_CHMOD) ? 16 : 0)
55 +               | (acl_get_perm(permset, ACL_DELETE) ? 8 : 0)
56                 | (acl_get_perm(permset, ACL_WRITE) ? 2 : 0)
57                 | (acl_get_perm(permset, ACL_EXECUTE) ? 1 : 0);
58  
59 @@ -143,6 +158,12 @@ int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits)
60         if ((rc = acl_get_permset(entry, &permset)) != 0)
61                 return rc;
62         acl_clear_perms(permset);
63 +       if (bits & 32)
64 +               acl_add_perm(permset, ACL_CHOWN);
65 +       if (bits & 16)
66 +               acl_add_perm(permset, ACL_CHMOD);
67 +       if (bits & 8)
68 +               acl_add_perm(permset, ACL_DELETE);
69         if (bits & 4)
70                 acl_add_perm(permset, ACL_READ);
71         if (bits & 2)
72 diff --git a/lib/sysacls.h b/lib/sysacls.h
73 --- a/lib/sysacls.h
74 +++ b/lib/sysacls.h
75 @@ -58,8 +58,8 @@
76  #define SMB_ACL_TYPE_ACCESS    ACL_TYPE_ACCESS
77  #define SMB_ACL_TYPE_DEFAULT   ACL_TYPE_DEFAULT
78  
79 -#define SMB_ACL_VALID_NAME_BITS        (4 | 2 | 1)
80 -#define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1)
81 +#define SMB_ACL_VALID_NAME_BITS        (32 | 16 | 8 | 4 | 2 | 1)
82 +#define SMB_ACL_VALID_OBJ_BITS (32 | 16 | 8 | 4 | 2 | 1)
83  
84  #define SMB_ACL_NEED_SORT
85