We need VA_COPY() defined more. Fix dangling #endif.
[rsync/rsync.git] / acls.c
diff --git a/acls.c b/acls.c
index ef2751c..35734bb 100644 (file)
--- a/acls.c
+++ b/acls.c
@@ -495,9 +495,15 @@ static int get_rsync_acl(const char *fname, rsync_acl *racl,
                }
 
                racl->user_obj = IVAL(buf, 0);
+               if (racl->user_obj == NO_ENTRY)
+                       racl->user_obj = (mode >> 6) & 7;
                racl->group_obj = IVAL(buf, 4);
+               if (racl->group_obj == NO_ENTRY)
+                       racl->group_obj = (mode >> 3) & 7;
                racl->mask_obj = IVAL(buf, 8);
                racl->other_obj = IVAL(buf, 12);
+               if (racl->other_obj == NO_ENTRY)
+                       racl->other_obj = mode & 7;
 
                if (cnt) {
                        char *bp = buf + 4*4;
@@ -589,9 +595,9 @@ static void send_ida_entries(int f, const ida_entries *idal)
                const char *name;
                if (ida->access & NAME_IS_USER) {
                        xbits |= XFLAG_NAME_IS_USER;
-                       name = add_uid(ida->id);
+                       name = numeric_ids ? NULL : add_uid(ida->id);
                } else
-                       name = add_gid(ida->id);
+                       name = numeric_ids ? NULL : add_gid(ida->id);
                write_varint(f, ida->id);
                if (inc_recurse && name) {
                        int len = strlen(name);
@@ -1101,6 +1107,9 @@ int default_perms_for_dir(const char *dir)
        if (sacl == NULL) {
                /* Couldn't get an ACL.  Darn. */
                switch (errno) {
+               case EINVAL:
+                       /* If SMB_ACL_TYPE_DEFAULT isn't valid, then the ACLs must be non-POSIX. */
+                       break;
 #ifdef ENOTSUP
                case ENOTSUP:
 #endif