X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-sameacls.c;h=7dcec2ae50a66540efbc1346e8fd47f5fe10d343;hb=84e7e349505e6961cc62fded69ba277474cc3d35;hp=55c6f445fc778ad8d859c210b7d6cc8f14547619;hpb=025733d35d2371eca95b865e46f57d892c11ce9d;p=gnulib.git diff --git a/tests/test-sameacls.c b/tests/test-sameacls.c index 55c6f445f..7dcec2ae5 100644 --- a/tests/test-sameacls.c +++ b/tests/test-sameacls.c @@ -1,5 +1,5 @@ /* Test whether two files have the same ACLs. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2010 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 @@ -29,20 +29,10 @@ # include #endif +#include "progname.h" #include "read-file.h" #include "xalloc.h" - -#define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) +#include "macros.h" int main (int argc, char *argv[]) @@ -50,6 +40,8 @@ main (int argc, char *argv[]) const char *file1; const char *file2; + set_program_name (argv[0]); + ASSERT (argc == 3); file1 = argv[1]; @@ -65,31 +57,31 @@ main (int argc, char *argv[]) contents1 = read_file (file1, &size1); if (contents1 == NULL) { - fprintf (stderr, "error reading file %s: errno = %d\n", file1, errno); - fflush (stderr); - abort (); + fprintf (stderr, "error reading file %s: errno = %d\n", file1, errno); + fflush (stderr); + abort (); } contents2 = read_file (file2, &size2); if (contents2 == NULL) { - fprintf (stderr, "error reading file %s: errno = %d\n", file2, errno); - fflush (stderr); - abort (); + fprintf (stderr, "error reading file %s: errno = %d\n", file2, errno); + fflush (stderr); + abort (); } if (size2 != size1) { - fprintf (stderr, "files %s and %s have different sizes\n", - file1, file2); - fflush (stderr); - abort (); + fprintf (stderr, "files %s and %s have different sizes\n", + file1, file2); + fflush (stderr); + abort (); } if (memcmp (contents1, contents2, size1) != 0) { - fprintf (stderr, "files %s and %s have different contents\n", - file1, file2); - fflush (stderr); - abort (); + fprintf (stderr, "files %s and %s have different contents\n", + file1, file2); + fflush (stderr); + abort (); } } @@ -100,118 +92,131 @@ main (int argc, char *argv[]) if (stat (file1, &statbuf1) < 0) { - fprintf (stderr, "error accessing file %s: errno = %d\n", file1, errno); - fflush (stderr); - abort (); + fprintf (stderr, "error accessing file %s: errno = %d\n", file1, errno); + fflush (stderr); + abort (); } if (stat (file2, &statbuf2) < 0) { - fprintf (stderr, "error accessing file %s: errno = %d\n", file2, errno); - fflush (stderr); - abort (); + fprintf (stderr, "error accessing file %s: errno = %d\n", file2, errno); + fflush (stderr); + abort (); } if (statbuf1.st_mode != statbuf2.st_mode) { - fprintf (stderr, "files %s and %s have different access modes: %03o and %03o\n", - file1, file2, - (unsigned int) statbuf1.st_mode, (unsigned int) statbuf2.st_mode); - return 1; + fprintf (stderr, "files %s and %s have different access modes: %03o and %03o\n", + file1, file2, + (unsigned int) statbuf1.st_mode, (unsigned int) statbuf2.st_mode); + return 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) - { - text1 = NULL; - errno1 = errno; - } - else - { - text1 = acl_to_text (acl1, NULL); - if (text1 == NULL) - errno1 = errno; - else - errno1 = 0; - } - acl2 = acl_get_file (file2, ACL_TYPE_ACCESS); - if (acl2 == (acl_t)NULL) + static const int types[] = { - text2 = NULL; - errno2 = errno; - } - else - { - text2 = acl_to_text (acl2, NULL); - if (text2 == NULL) - errno2 = errno; - else - errno2 = 0; - } + ACL_TYPE_ACCESS +# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */ + , ACL_TYPE_EXTENDED +# endif + }; + int t; - if (acl1 != (acl_t)NULL) + for (t = 0; t < sizeof (types) / sizeof (types[0]); t++) { - if (acl2 != (acl_t)NULL) - { - if (text1 != NULL) - { - 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, "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) - { - 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 - { - if (acl2 != (acl_t)NULL) - { - fprintf (stderr, "file %s has no ACL, but file %s has an ACL\n", - file1, file2); - return 1; - } + 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 + { + 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 + { + 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 (text1 != NULL) + { + 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, "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) + { + 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 + { + 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 */ int count1; @@ -220,22 +225,22 @@ main (int argc, char *argv[]) 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); + file1, file2, count1, count2); return 1; } else @@ -245,58 +250,62 @@ main (int argc, char *argv[]) int i; if (acl (file1, GETACL, count1, entries1) < count1) - { - fprintf (stderr, "error retrieving the ACLs of file %s\n", file1); - fflush (stderr); - abort (); - } + { + fprintf (stderr, "error retrieving the ACLs of file %s\n", file1); + fflush (stderr); + abort (); + } if (acl (file2, GETACL, count2, entries2) < count1) - { - fprintf (stderr, "error retrieving the ACLs of file %s\n", file2); - fflush (stderr); - abort (); - } + { + fprintf (stderr, "error retrieving the 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 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_id != entries2[i].a_id) - { - fprintf (stderr, "files %s and %s: different ACL entry #%d: different ids %d and %d\n", - file1, file2, i, (int)entries1[i].a_id, (int)entries2[i].a_id); - return 1; - } - if (entries1[i].a_perm != entries2[i].a_perm) - { - fprintf (stderr, "files %s and %s: different ACL entry #%d: different permissions %03o and %03o\n", - file1, file2, i, (unsigned int) entries1[i].a_perm, (unsigned int) entries2[i].a_perm); - return 1; - } - } + { + if (entries1[i].a_type != entries2[i].a_type) + { + fprintf (stderr, "files %s and %s: different 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_id != entries2[i].a_id) + { + fprintf (stderr, "files %s and %s: different ACL entry #%d: different ids %d and %d\n", + file1, file2, i, (int)entries1[i].a_id, (int)entries2[i].a_id); + return 1; + } + if (entries1[i].a_perm != entries2[i].a_perm) + { + fprintf (stderr, "files %s and %s: different ACL entry #%d: different permissions %03o and %03o\n", + file1, file2, i, (unsigned int) entries1[i].a_perm, (unsigned int) entries2[i].a_perm); + 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); + file1, file2, count1, count2); return 1; } else if (count1 > 0) @@ -306,44 +315,44 @@ main (int argc, char *argv[]) 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 (); - } + { + 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 (); - } + { + 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; - } - } + { + 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 */ @@ -351,65 +360,69 @@ main (int argc, char *argv[]) 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); + 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); int i; if (getacl (file1, count1, entries1) < count1) - { - fprintf (stderr, "error retrieving the ACLs of file %s\n", file1); - fflush (stderr); - abort (); - } + { + fprintf (stderr, "error retrieving the ACLs of file %s\n", file1); + fflush (stderr); + abort (); + } if (getacl (file2, count2, entries2) < count1) - { - fprintf (stderr, "error retrieving the ACLs of file %s\n", file2); - fflush (stderr); - abort (); - } + { + fprintf (stderr, "error retrieving the ACLs of file %s\n", file2); + fflush (stderr); + abort (); + } for (i = 0; i < count1; i++) - { - if (entries1[i].uid != entries2[i].uid) - { - fprintf (stderr, "files %s and %s: different ACL entry #%d: different uids %d and %d\n", - file1, file2, i, (int)entries1[i].uid, (int)entries2[i].uid); - return 1; - } - if (entries1[i].gid != entries2[i].gid) - { - fprintf (stderr, "files %s and %s: different ACL entry #%d: different gids %d and %d\n", - file1, file2, i, (int)entries1[i].gid, (int)entries2[i].gid); - return 1; - } - if (entries1[i].mode != entries2[i].mode) - { - fprintf (stderr, "files %s and %s: different ACL entry #%d: different permissions %03o and %03o\n", - file1, file2, i, (unsigned int) entries1[i].mode, (unsigned int) entries2[i].mode); - return 1; - } - } + { + if (entries1[i].uid != entries2[i].uid) + { + fprintf (stderr, "files %s and %s: different ACL entry #%d: different uids %d and %d\n", + file1, file2, i, (int)entries1[i].uid, (int)entries2[i].uid); + return 1; + } + if (entries1[i].gid != entries2[i].gid) + { + fprintf (stderr, "files %s and %s: different ACL entry #%d: different gids %d and %d\n", + file1, file2, i, (int)entries1[i].gid, (int)entries2[i].gid); + return 1; + } + if (entries1[i].mode != entries2[i].mode) + { + fprintf (stderr, "files %s and %s: different ACL entry #%d: different permissions %03o and %03o\n", + file1, file2, i, (unsigned int) entries1[i].mode, (unsigned int) entries2[i].mode); + return 1; + } + } } #elif HAVE_ACLX_GET /* AIX */ acl_type_t type1; @@ -423,6 +436,9 @@ main (int argc, char *argv[]) mode_t mode2; char text2[1000]; + /* The docs say that type1 being 0 is equivalent to ACL_ANY, but it is not + true, in AIX 5.3. */ + type1.u64 = ACL_ANY; if (aclx_get (file1, 0, &type1, acl1, &aclsize1, &mode1) < 0) { fprintf (stderr, "error accessing the ACLs of file %s\n", file1); @@ -436,6 +452,9 @@ main (int argc, char *argv[]) abort (); } + /* The docs say that type2 being 0 is equivalent to ACL_ANY, but it is not + true, in AIX 5.3. */ + type2.u64 = ACL_ANY; if (aclx_get (file2, 0, &type2, acl2, &aclsize2, &mode2) < 0) { fprintf (stderr, "error accessing the ACLs of file %s\n", file2); @@ -452,7 +471,7 @@ main (int argc, char *argv[]) if (strcmp (text1, text2) != 0) { fprintf (stderr, "files %s and %s have different ACLs:\n%s\n%s\n", - file1, file2, text1, text2); + file1, file2, text1, text2); return 1; } #elif HAVE_STATACL /* older AIX */ @@ -476,13 +495,13 @@ main (int argc, char *argv[]) if (acl1.a.acl_len != acl2.a.acl_len) { fprintf (stderr, "files %s and %s have different ACL lengths: %u and %u\n", - file1, file2, acl1.a.acl_len, acl2.a.acl_len); + file1, file2, acl1.a.acl_len, acl2.a.acl_len); return 1; } if (acl1.a.acl_mode != acl2.a.acl_mode) { fprintf (stderr, "files %s and %s have different ACL modes: %03o and %03o\n", - file1, file2, acl1.a.acl_mode, acl2.a.acl_mode); + file1, file2, acl1.a.acl_mode, acl2.a.acl_mode); return 1; } if (acl1.a.u_access != acl2.a.u_access @@ -490,15 +509,15 @@ main (int argc, char *argv[]) || acl1.a.o_access != acl2.a.o_access) { fprintf (stderr, "files %s and %s have different ACL access masks: %03o %03o %03o and %03o %03o %03o\n", - file1, file2, - acl1.a.u_access, acl1.a.g_access, acl1.a.o_access, - acl2.a.u_access, acl2.a.g_access, acl2.a.o_access); + file1, file2, + acl1.a.u_access, acl1.a.g_access, acl1.a.o_access, + acl2.a.u_access, acl2.a.g_access, acl2.a.o_access); return 1; } if (memcmp (acl1.a.acl_ext, acl2.a.acl_ext, acl1.a.acl_len) != 0) { fprintf (stderr, "files %s and %s have different ACL entries\n", - file1, file2); + file1, file2); return 1; } #endif