fi
fi
else
- if (lsacl tmpfile0 >/dev/null) 2>/dev/null; then
+ if (lsacl / >/dev/null) 2>/dev/null; then
# Platforms with the lsacl and chacl programs.
# HP-UX, sometimes also IRIX.
acl_flavor=hpux
# Remove the ACL for other.
case $acl_flavor in
- linux) ;; # impossible
+ linux | solaris) ;; # impossible
freebsd) setfacl -x other::4 tmpfile0 ;;
*) setfacl -d other:4 tmpfile0 ;;
esac
irix)
# Set an ACL for a user.
- /sbin/chacl user:$auid:--x tmpfile0
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x tmpfile0
func_test_copy tmpfile0 tmpfile2
# Set an ACL for a group.
- /sbin/chacl user:$auid:--x,group:$agid:r-- tmpfile0
+ /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x,group:$agid:r-- tmpfile0
func_test_copy tmpfile0 tmpfile3
# Set an ACL for other.
- /sbin/chacl user:$auid:--x,group:$agid:r--,other::r-- tmpfile0
+ /sbin/chacl user::rw-,group::---,user:$auid:--x,group:$agid:r--,other::r-- tmpfile0
func_test_copy tmpfile0 tmpfile4
# Remove the ACL for the user.
- /sbin/chacl group:$agid:r--,other::r-- tmpfile0
+ /sbin/chacl user::rw-,group::---,group:$agid:r--,other::r-- tmpfile0
func_test_copy tmpfile0 tmpfile5
- # Remove the ACL for other.
- /sbin/chacl group:$agid:r-- tmpfile0
-
- func_test_copy tmpfile0 tmpfile6
-
# Remove the ACL for the group.
- /sbin/chacl , tmpfile0
+ /sbin/chacl user::rw-,group::---,other::r-- tmpfile0
func_test_copy tmpfile0 tmpfile7
# include <sys/acl.h>
#endif
+#include "progname.h"
#include "read-file.h"
#include "xalloc.h"
const char *file1;
const char *file2;
+ set_program_name (argv[0]);
+
ASSERT (argc == 3);
file1 = argv[1];
}
{
#if HAVE_ACL_GET_FILE /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
- acl_t acl1;
- char *text1;
- int errno1;
- acl_t acl2;
- char *text2;
- int errno2;
-
- acl1 = acl_get_file (file1, ACL_TYPE_ACCESS);
- if (acl1 == (acl_t)NULL)
+ static const int types[] =
{
- text1 = NULL;
- errno1 = errno;
- }
- else
+ ACL_TYPE_ACCESS
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+ , ACL_TYPE_EXTENDED
+# endif
+ };
+ int t;
+
+ for (t = 0; t < sizeof (types) / sizeof (types[0]); t++)
{
- text1 = acl_to_text (acl1, NULL);
- if (text1 == NULL)
- errno1 = errno;
+ int type = types[t];
+ acl_t acl1;
+ char *text1;
+ int errno1;
+ acl_t acl2;
+ char *text2;
+ int errno2;
+
+ acl1 = acl_get_file (file1, type);
+ if (acl1 == (acl_t)NULL)
+ {
+ text1 = NULL;
+ errno1 = errno;
+ }
else
- errno1 = 0;
- }
- acl2 = acl_get_file (file2, ACL_TYPE_ACCESS);
- if (acl2 == (acl_t)NULL)
- {
- text2 = NULL;
- errno2 = errno;
- }
- else
- {
- text2 = acl_to_text (acl2, NULL);
- if (text2 == NULL)
- errno2 = errno;
+ {
+ text1 = acl_to_text (acl1, NULL);
+ if (text1 == NULL)
+ errno1 = errno;
+ else
+ errno1 = 0;
+ }
+ acl2 = acl_get_file (file2, type);
+ if (acl2 == (acl_t)NULL)
+ {
+ text2 = NULL;
+ errno2 = errno;
+ }
else
- errno2 = 0;
- }
+ {
+ text2 = acl_to_text (acl2, NULL);
+ if (text2 == NULL)
+ errno2 = errno;
+ else
+ errno2 = 0;
+ }
- if (acl1 != (acl_t)NULL)
- {
- if (acl2 != (acl_t)NULL)
+ if (acl1 != (acl_t)NULL)
{
- if (text1 != NULL)
+ if (acl2 != (acl_t)NULL)
{
- if (text2 != NULL)
+ if (text1 != NULL)
{
- if (strcmp (text1, text2) != 0)
+ if (text2 != NULL)
+ {
+ if (strcmp (text1, text2) != 0)
+ {
+ fprintf (stderr, "files %s and %s have different ACLs:\n%s\n%s\n",
+ file1, file2, text1, text2);
+ return 1;
+ }
+ }
+ else
{
- fprintf (stderr, "files %s and %s have different ACLs:\n%s\n%s\n",
- file1, file2, text1, text2);
+ fprintf (stderr, "file %s has a valid ACL, but file %s has an invalid ACL\n",
+ file1, file2);
return 1;
}
}
else
{
- fprintf (stderr, "file %s has a valid ACL, but file %s has an invalid ACL\n",
- file1, file2);
- return 1;
- }
- }
- else
- {
- if (text2 != NULL)
- {
- fprintf (stderr, "file %s has an invalid ACL, but file %s has a valid ACL\n",
- file1, file2);
- return 1;
- }
- else
- {
- if (errno1 != errno2)
+ if (text2 != NULL)
{
- fprintf (stderr, "files %s and %s have differently invalid ACLs, errno = %d vs. %d\n",
- file1, file2, errno1, errno2);
+ fprintf (stderr, "file %s has an invalid ACL, but file %s has a valid ACL\n",
+ file1, file2);
return 1;
}
+ else
+ {
+ if (errno1 != errno2)
+ {
+ fprintf (stderr, "files %s and %s have differently invalid ACLs, errno = %d vs. %d\n",
+ file1, file2, errno1, errno2);
+ return 1;
+ }
+ }
}
}
+ else
+ {
+ fprintf (stderr, "file %s has an ACL, but file %s has no ACL\n",
+ file1, file2);
+ return 1;
+ }
}
else
{
- fprintf (stderr, "file %s has an ACL, but file %s has no ACL\n",
- file1, file2);
- return 1;
- }
- }
- else
- {
- if (acl2 != (acl_t)NULL)
- {
- fprintf (stderr, "file %s has no ACL, but file %s has an ACL\n",
- file1, file2);
- return 1;
+ if (acl2 != (acl_t)NULL)
+ {
+ fprintf (stderr, "file %s has no ACL, but file %s has an ACL\n",
+ file1, file2);
+ return 1;
+ }
}
}
#elif HAVE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
count1 = acl (file1, GETACLCNT, 0, NULL);
count2 = acl (file2, GETACLCNT, 0, NULL);
+ if (count1 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (count2 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
if (count1 != count2)
{
- if (count1 < 0)
- {
- fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
- fflush (stderr);
- abort ();
- }
- if (count2 < 0)
- {
- fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
- fflush (stderr);
- abort ();
- }
fprintf (stderr, "files %s and %s have different number of ACLs: %d and %d\n",
file1, file2, count1, count2);
return 1;
}
# ifdef ACE_GETACL
count1 = acl (file1, ACE_GETACLCNT, 0, NULL);
+ if (count1 < 0 && errno == EINVAL)
+ count1 = 0;
count2 = acl (file2, ACE_GETACLCNT, 0, NULL);
+ if (count2 < 0 && errno == EINVAL)
+ count2 = 0;
+ if (count1 < 0)
+ {
+ fprintf (stderr, "error accessing the ACE-ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (count2 < 0)
+ {
+ fprintf (stderr, "error accessing the ACE-ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
if (count1 != count2)
{
- if (count1 < 0)
- {
- fprintf (stderr, "error accessing the ACE-ACLs of file %s\n", file1);
- fflush (stderr);
- abort ();
- }
- if (count2 < 0)
- {
- fprintf (stderr, "error accessing the ACE-ACLs of file %s\n", file2);
- fflush (stderr);
- abort ();
- }
fprintf (stderr, "files %s and %s have different number of ACE-ACLs: %d and %d\n",
file1, file2, count1, count2);
return 1;
int count2;
count1 = getacl (file1, 0, NULL);
+ if (count1 < 0 && (errno == ENOSYS || errno == EOPNOTSUPP))
+ count1 = 0;
count2 = getacl (file2, 0, NULL);
+ if (count2 < 0 && (errno == ENOSYS || errno == EOPNOTSUPP))
+ count2 = 0;
+ if (count1 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
+ fflush (stderr);
+ abort ();
+ }
+ if (count2 < 0)
+ {
+ fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
+ fflush (stderr);
+ abort ();
+ }
if (count1 != count2)
{
- if (count1 < 0)
- {
- fprintf (stderr, "error accessing the ACLs of file %s\n", file1);
- fflush (stderr);
- abort ();
- }
- if (count2 < 0)
- {
- fprintf (stderr, "error accessing the ACLs of file %s\n", file2);
- fflush (stderr);
- abort ();
- }
fprintf (stderr, "files %s and %s have different number of ACLs: %d and %d\n",
file1, file2, count1, count2);
return 1;
}
- else
+ else if (count1 > 0)
{
struct acl_entry *entries1 = XNMALLOC (count1, struct acl_entry);
struct acl_entry *entries2 = XNMALLOC (count2, struct acl_entry);