Allow a failure of EINVAL to mean no ACLs are available.
[rsync/rsync.git] / lib / sysacls.c
index 26ae86b..52314bc 100644 (file)
@@ -2,6 +2,7 @@
  * Unix SMB/CIFS implementation.
  * Based on the Samba ACL support code.
  * Copyright (C) Jeremy Allison 2000.
+ * Copyright (C) 2007-2008 Wayne Davison
  *
  * The permission functions have been changed to get/set all bits via
  * one call.  Some functions that rsync doesn't need were also removed.
@@ -550,7 +551,7 @@ SMB_ACL_T sys_acl_init(int count)
         * acl[] array, this actually allocates an ACL with room
         * for (count+1) entries
         */
-       if ((a = (SMB_ACL_T)SMB_MALLOC(sizeof(struct SMB_ACL_T) + count * sizeof(struct acl))) == NULL) {
+       if ((a = (SMB_ACL_T)SMB_MALLOC(sizeof a[0] + count * sizeof (struct acl))) == NULL) {
                errno = ENOMEM;
                return NULL;
        }
@@ -1006,7 +1007,7 @@ SMB_ACL_T sys_acl_init(int count)
         * acl[] array, this actually allocates an ACL with room
         * for (count+1) entries
         */
-       if ((a = SMB_MALLOC(sizeof(struct SMB_ACL_T) + count * sizeof(struct acl))) == NULL) {
+       if ((a = (SMB_ACL_T)SMB_MALLOC(sizeof a[0] + count * sizeof(struct acl))) == NULL) {
                errno = ENOMEM;
                return NULL;
        }
@@ -1637,14 +1638,14 @@ SMB_ACL_T sys_acl_init(int count)
                return NULL;
        }
 
-       if ((a = SMB_MALLOC(sizeof(struct SMB_ACL_T) + sizeof(struct acl))) == NULL) {
+       if ((a = (SMB_ACL_T)SMB_MALLOC(sizeof a[0] + sizeof (struct acl))) == NULL) {
                errno = ENOMEM;
                return NULL;
        }
 
        a->next = -1;
        a->freeaclp = False;
-       a->aclp = (struct acl *)(&a->aclp + sizeof(struct acl *));
+       a->aclp = (struct acl *)((char *)a + sizeof a[0]);
        a->aclp->acl_cnt = 0;
 
        return a;
@@ -1814,7 +1815,11 @@ SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_ACL_TYPE_T type)
 
        /* AIX has no DEFAULT */
        if  ( type == SMB_ACL_TYPE_DEFAULT ) {
+#ifdef ENOTSUP
                errno = ENOTSUP;
+#else
+               errno = ENOSYS;
+#endif
                return NULL;
        }
 
@@ -2776,6 +2781,11 @@ int no_acl_syscall_error(int err)
                return 1;
        }
 #endif
+       if (err == EINVAL) {
+               /* If the type of SMB_ACL_TYPE_ACCESS or SMB_ACL_TYPE_DEFAULT
+                * isn't valid, then the ACLs must be non-POSIX. */
+               return 1;
+       }
        return 0;
 }