diff options
author | Bruno Haible <bruno@clisp.org> | 2008-06-01 22:41:49 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2008-06-01 22:41:49 +0200 |
commit | 28c952d8555a939d74a4096d63dba5c8e7863a90 (patch) | |
tree | 1507730e59b9e4f316f394a1d2be3fdcdbc4a273 /tests/test-sameacls.c | |
parent | bfc48f96da6b1f62f4f45c6f89b3aecb754486ce (diff) | |
download | gnulib-28c952d8555a939d74a4096d63dba5c8e7863a90.tar.gz |
Portability fixes for MacOS X, Solaris, HP-UX, IRIX.
Diffstat (limited to 'tests/test-sameacls.c')
-rw-r--r-- | tests/test-sameacls.c | 236 |
1 files changed, 130 insertions, 106 deletions
diff --git a/tests/test-sameacls.c b/tests/test-sameacls.c index 55c6f445fc..0086cd6974 100644 --- a/tests/test-sameacls.c +++ b/tests/test-sameacls.c @@ -29,6 +29,7 @@ # include <sys/acl.h> #endif +#include "progname.h" #include "read-file.h" #include "xalloc.h" @@ -50,6 +51,8 @@ main (int argc, char *argv[]) const char *file1; const char *file2; + set_program_name (argv[0]); + ASSERT (argc == 3); file1 = argv[1]; @@ -120,97 +123,110 @@ main (int argc, char *argv[]) } { #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 */ @@ -220,20 +236,20 @@ 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); return 1; @@ -280,21 +296,25 @@ main (int argc, char *argv[]) } # 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; @@ -351,27 +371,31 @@ 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); 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); |