X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3f0211b63a6cdc4a2cecfd2a0dffeba172c86a47..5eb8bd4962a159c52bacb65bee86f20d1075beec:/acls.c diff --git a/acls.c b/acls.c index 82005731..dc80dce3 100644 --- a/acls.c +++ b/acls.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2006 Wayne Davison + * Copyright (C) 2006-2009 Wayne Davison * * 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 @@ -92,9 +92,19 @@ static item_list default_acl_list = EMPTY_ITEM_LIST; static const char *str_acl_type(SMB_ACL_TYPE_T type) { - return type == SMB_ACL_TYPE_ACCESS ? "SMB_ACL_TYPE_ACCESS" - : type == SMB_ACL_TYPE_DEFAULT ? "SMB_ACL_TYPE_DEFAULT" - : "unknown SMB_ACL_TYPE_T"; + switch (type) { + case SMB_ACL_TYPE_ACCESS: +#ifdef HAVE_OSX_ACLS + return "ACL_TYPE_EXTENDED"; +#else + return "ACL_TYPE_ACCESS"; +#endif + case SMB_ACL_TYPE_DEFAULT: + return "ACL_TYPE_DEFAULT"; + default: + break; + } + return "unknown ACL type!"; } static int calc_sacl_entries(const rsync_acl *racl) @@ -127,7 +137,8 @@ static void rsync_acl_strip_perms(rsync_acl *racl) else { if (racl->group_obj == racl->mask_obj) racl->group_obj = NO_ENTRY; - racl->mask_obj = NO_ENTRY; + if (racl->names.count != 0) + racl->mask_obj = NO_ENTRY; } racl->other_obj = NO_ENTRY; } @@ -556,7 +567,7 @@ static void send_ida_entries(const ida_entries *idal, int f) for (ida = idal->idas; count--; ida++) { uint32 xbits = ida->access << 2; - char *name; + const char *name; if (ida->access & NAME_IS_USER) { xbits |= XFLAG_NAME_IS_USER; name = add_uid(ida->id); @@ -739,14 +750,7 @@ static int recv_rsync_acl(item_list *racl_list, SMB_ACL_TYPE_T type, int f) /* If we received a superfluous mask, throw it away. */ duo_item->racl.mask_obj = NO_ENTRY; #else - if (!duo_item->racl.names.count) { - /* If we received a superfluous mask, throw it away. */ - if (duo_item->racl.mask_obj != NO_ENTRY) { - /* Mask off the group perms with it first. */ - duo_item->racl.group_obj &= duo_item->racl.mask_obj | NO_ENTRY; - duo_item->racl.mask_obj = NO_ENTRY; - } - } else if (duo_item->racl.mask_obj == NO_ENTRY) /* Must be non-empty with lists. */ + if (duo_item->racl.names.count && duo_item->racl.mask_obj == NO_ENTRY) /* Must be non-empty with lists. */ duo_item->racl.mask_obj = (computed_mask_bits | duo_item->racl.group_obj) & ~NO_ENTRY; #endif @@ -933,7 +937,7 @@ static int set_rsync_acl(const char *fname, acl_duo *duo_item, #endif if (sys_acl_set_file(fname, type, duo_item->sacl) < 0) { rsyserr(FERROR_XFER, errno, "set_acl: sys_acl_set_file(%s, %s)", - fname, str_acl_type(type)); + fname, str_acl_type(type)); return -1; } if (type == SMB_ACL_TYPE_ACCESS) @@ -1071,7 +1075,7 @@ int default_perms_for_dir(const char *dir) /* Apply the permission-bit entries of the default ACL, if any. */ if (racl.user_obj != NO_ENTRY) { perms = rsync_acl_get_perms(&racl); - if (verbose > 2) + if (DEBUG_GTE(ACL, 1)) rprintf(FINFO, "got ACL-based default perms %o for directory %s\n", perms, dir); }