/* Test whether two files have the same ACLs.
- Copyright (C) 2008-2012 Free Software Foundation, Inc.
+ Copyright (C) 2008-2013 Free Software Foundation, Inc.
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
}
}
{
-#if HAVE_ACL_GET_FILE /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+#if HAVE_ACL_GET_FILE /* Linux, FreeBSD, Mac OS X, IRIX, Tru64 */
static const int types[] =
{
ACL_TYPE_ACCESS
-# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+# if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
, ACL_TYPE_EXTENDED
# endif
};
fflush (stderr);
abort ();
}
- if (count1 != count2)
- {
- fprintf (stderr, "files %s and %s have different number of ACE-ACLs: %d and %d\n",
- file1, file2, count1, count2);
- return 1;
- }
- else if (count1 > 0)
- {
- ace_t *entries1 = XNMALLOC (count1, ace_t);
- ace_t *entries2 = XNMALLOC (count2, ace_t);
- int i;
+ {
+ ace_t *entries1 = XNMALLOC (count1, ace_t);
+ ace_t *entries2 = XNMALLOC (count2, ace_t);
+ int ret;
+ int i;
- if (acl (file1, ACE_GETACL, count1, entries1) < count1)
- {
- fprintf (stderr, "error retrieving the ACE-ACLs of file %s\n", file1);
- fflush (stderr);
- abort ();
- }
- if (acl (file2, ACE_GETACL, count2, entries2) < count1)
- {
- fprintf (stderr, "error retrieving the ACE-ACLs of file %s\n", file2);
- fflush (stderr);
- abort ();
- }
- for (i = 0; i < count1; i++)
- {
- if (entries1[i].a_type != entries2[i].a_type)
- {
- fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different types %d and %d\n",
- file1, file2, i, entries1[i].a_type, entries2[i].a_type);
- return 1;
- }
- if (entries1[i].a_who != entries2[i].a_who)
- {
- fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different ids %d and %d\n",
- file1, file2, i, (int)entries1[i].a_who, (int)entries2[i].a_who);
- return 1;
- }
- if (entries1[i].a_access_mask != entries2[i].a_access_mask)
- {
- fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different access masks %03o and %03o\n",
- file1, file2, i, (unsigned int) entries1[i].a_access_mask, (unsigned int) entries2[i].a_access_mask);
- return 1;
- }
- if (entries1[i].a_flags != entries2[i].a_flags)
- {
- fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different flags 0x%x and 0x%x\n",
- file1, file2, i, (unsigned int) entries1[i].a_flags, (unsigned int) entries2[i].a_flags);
- return 1;
- }
- }
- }
+ ret = acl (file1, ACE_GETACL, count1, entries1);
+ if (ret < 0 && errno == EINVAL)
+ count1 = 0;
+ else if (ret < count1)
+ {
+ fprintf (stderr, "error retrieving the ACE-ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ ret = acl (file2, ACE_GETACL, count2, entries2);
+ if (ret < 0 && errno == EINVAL)
+ count2 = 0;
+ else if (ret < count2)
+ {
+ fprintf (stderr, "error retrieving the ACE-ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
+
+ if (count1 != count2)
+ {
+ fprintf (stderr, "files %s and %s have different number of ACE-ACLs: %d and %d\n",
+ file1, file2, count1, count2);
+ return 1;
+ }
+
+ for (i = 0; i < count1; i++)
+ {
+ if (entries1[i].a_type != entries2[i].a_type)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different types %d and %d\n",
+ file1, file2, i, entries1[i].a_type, entries2[i].a_type);
+ return 1;
+ }
+ if (entries1[i].a_who != entries2[i].a_who)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different ids %d and %d\n",
+ file1, file2, i, (int)entries1[i].a_who, (int)entries2[i].a_who);
+ return 1;
+ }
+ if (entries1[i].a_access_mask != entries2[i].a_access_mask)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different access masks %03o and %03o\n",
+ file1, file2, i, (unsigned int) entries1[i].a_access_mask, (unsigned int) entries2[i].a_access_mask);
+ return 1;
+ }
+ if (entries1[i].a_flags != entries2[i].a_flags)
+ {
+ fprintf (stderr, "files %s and %s: different ACE-ACL entry #%d: different flags 0x%x and 0x%x\n",
+ file1, file2, i, (unsigned int) entries1[i].a_flags, (unsigned int) entries2[i].a_flags);
+ return 1;
+ }
+ }
+ }
# endif
#elif HAVE_GETACL /* HP-UX */
int count1;