X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/dfadc68a0c54e98a996becf6d94579fcac0ba732..00188d68fd6237a24a4f71c26a3251b1951fa542:/adaptec_acl_mods.diff diff --git a/adaptec_acl_mods.diff b/adaptec_acl_mods.diff index 92b4c2b..f9988e7 100644 --- a/adaptec_acl_mods.diff +++ b/adaptec_acl_mods.diff @@ -26,46 +26,108 @@ with literal values were needed. --- old/acls.c +++ new/acls.c -@@ -146,6 +146,9 @@ static BOOL unpack_smb_acl(rsync_acl *ra - } - race->access = (sys_acl_get_perm(permset, SMB_ACL_READ) ? 4 : 0) - | (sys_acl_get_perm(permset, SMB_ACL_WRITE) ? 2 : 0) -+ | (sys_acl_get_perm(permset, SMB_ACL_DELETE) ? 8 : 0) -+ | (sys_acl_get_perm(permset, SMB_ACL_CHMOD) ? 16 : 0) -+ | (sys_acl_get_perm(permset, SMB_ACL_CHOWN) ? 32 : 0) - | (sys_acl_get_perm(permset, SMB_ACL_EXECUTE) ? 1 : 0); - switch (race->tag_type) { - case SMB_ACL_USER: -@@ -575,6 +578,21 @@ static BOOL pack_smb_acl(SMB_ACL_T *smb_ - errfun = "sys_acl_add_perm"; - break; - } -+ if (race->access & 8) -+ if (sys_acl_add_perm(permset, SMB_ACL_DELETE)) { -+ errfun = "sys_acl_add_perm"; -+ break; -+ } -+ if (race->access & 16) -+ if (sys_acl_add_perm(permset, SMB_ACL_CHMOD)) { -+ errfun = "sys_acl_add_perm"; -+ break; -+ } -+ if (race->access & 32) -+ if (sys_acl_add_perm(permset, SMB_ACL_CHOWN)) { -+ errfun = "sys_acl_add_perm"; -+ break; -+ } - if (sys_acl_set_permset(entry, permset)) { - errfun = "sys_acl_set_permset"; - break; -@@ -634,7 +652,7 @@ static void receive_rsync_acl(rsync_acl - exit_cleanup(RERR_STREAMIO); +@@ -30,9 +30,11 @@ extern int am_root; + extern int dry_run; + extern int orig_umask; + ++typedef unsigned short abits; ++ + typedef struct { + id_t id; +- uchar access; ++ abits access; + } id_access; + + typedef struct { +@@ -41,15 +43,15 @@ typedef struct { + id_access *idas; + } ida_list; + +-#define NO_ENTRY ((uchar)0x80) ++#define NO_ENTRY ((abits)0x8000) + typedef struct { + ida_list users; + ida_list groups; + /* These will be NO_ENTRY if there's no such entry. */ +- uchar user_obj; +- uchar group_obj; +- uchar mask; +- uchar other; ++ abits user_obj; ++ abits group_obj; ++ abits mask; ++ abits other; + } rsync_acl; + + static const rsync_acl rsync_acl_initializer = +@@ -148,7 +150,7 @@ static BOOL unpack_smb_acl(rsync_acl *ra + rc = sys_acl_get_entry(sacl, SMB_ACL_NEXT_ENTRY, &entry)) { + SMB_ACL_TAG_T tag_type; + SMB_ACL_PERMSET_T permset; +- uchar access; ++ abits access; + void *qualifier; + id_access *ida; + ida_list *idal; +@@ -162,6 +164,9 @@ static BOOL unpack_smb_acl(rsync_acl *ra } - race->access = read_byte(f); -- if (race->access & ~ (4 | 2 | 1)) { -+ if (race->access & ~(32 | 16 | 8 | 4 | 2 | 1)) { + access = (sys_acl_get_perm(permset, SMB_ACL_READ) ? 4 : 0) + | (sys_acl_get_perm(permset, SMB_ACL_WRITE) ? 2 : 0) ++ | (sys_acl_get_perm(permset, SMB_ACL_DELETE) ? 8 : 0) ++ | (sys_acl_get_perm(permset, SMB_ACL_CHMOD) ? 16 : 0) ++ | (sys_acl_get_perm(permset, SMB_ACL_CHOWN) ? 32 : 0) + | (sys_acl_get_perm(permset, SMB_ACL_EXECUTE) ? 1 : 0); + /* continue == done with entry; break == store in given idal */ + switch (tag_type) { +@@ -559,13 +564,19 @@ static void expand_smb_acl_list(smb_acl_ + #define COE(func,args) CALL_OR_ERROR(func,args,#func) + #define COE2(func,args) CALL_OR_ERROR(func,args,NULL) + +-static int store_access_in_entry(uchar access, SMB_ACL_ENTRY_T entry) ++static int store_access_in_entry(abits access, SMB_ACL_ENTRY_T entry) + { + const char *errfun = NULL; + SMB_ACL_PERMSET_T permset; + + COE( sys_acl_get_permset,(entry, &permset) ); + COE( sys_acl_clear_perms,(permset) ); ++ if (access & 32) ++ COE( sys_acl_add_perm(permset, SMB_ACL_CHOWN) ); ++ if (access & 16) ++ COE( sys_acl_add_perm(permset, SMB_ACL_CHMOD) ); ++ if (access & 8) ++ COE( sys_acl_add_perm(permset, SMB_ACL_DELETE) ); + if (access & 4) + COE( sys_acl_add_perm,(permset, SMB_ACL_READ) ); + if (access & 2) +@@ -645,7 +656,7 @@ static BOOL pack_smb_acl(SMB_ACL_T *smb_ + return False; + } + +-static mode_t change_sacl_perms(SMB_ACL_T sacl, uchar mask, mode_t old_mode, mode_t mode) ++static mode_t change_sacl_perms(SMB_ACL_T sacl, abits mask, mode_t old_mode, mode_t mode) + { + SMB_ACL_ENTRY_T entry; + int group_id = mask != NO_ENTRY ? SMB_ACL_MASK : SMB_ACL_GROUP_OBJ; +@@ -696,7 +707,7 @@ static mode_t change_sacl_perms(SMB_ACL_ + + static void receive_rsync_acl(rsync_acl *racl, int f) + { +- uchar computed_mask_bits = 0; ++ abits computed_mask_bits = 0; + ida_list *idal = NULL; + id_access *ida; + size_t count; +@@ -708,8 +719,8 @@ static void receive_rsync_acl(rsync_acl + + while (count--) { + char tag = read_byte(f); +- uchar access = read_byte(f); +- if (access & ~ (4 | 2 | 1)) { ++ abits access = read_byte(f); ++ if (access & ~(32 | 16 | 8 | 4 | 2 | 1)) { rprintf(FERROR, "receive_rsync_acl: bogus permset %o\n", - race->access); + access); exit_cleanup(RERR_STREAMIO); --- old/smb_acls.h +++ new/smb_acls.h