Mercurial > hg > octave-nkf > gnulib-hg
changeset 10118:a771dc3b73d4
Rename tests/test-copy-file-sameacls.c to tests/test-sameacls.c.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sun, 25 May 2008 13:51:56 +0200 |
parents | f73bf03d3c84 |
children | 8fce636ec92a |
files | ChangeLog modules/copy-file-tests tests/test-copy-file-sameacls.c tests/test-sameacls.c |
diffstat | 4 files changed, 516 insertions(+), 511 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-05-25 Bruno Haible <bruno@clisp.org> + + * tests/test-sameacls.c: Renamed from tests/test-copy-file-sameacls.c. + * modules/copy-file-tests (Files, Makefile.am): Update. + 2008-05-24 Andreas Färber <andreas.faerber@web.de> (tiny change) * lib/stdbool.in.h [__HAIKU__]: Disable __BEOS__ workarounds.
--- a/modules/copy-file-tests +++ b/modules/copy-file-tests @@ -1,7 +1,7 @@ Files: tests/test-copy-file.sh tests/test-copy-file.c -tests/test-copy-file-sameacls.c +tests/test-sameacls.c Depends-on: acl @@ -28,6 +28,6 @@ Makefile.am: TESTS += test-copy-file.sh TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' -check_PROGRAMS += test-copy-file test-copy-file-sameacls +check_PROGRAMS += test-copy-file test-sameacls test_copy_file_LDADD = $(LDADD) $(LIB_ACL) @LIBINTL@ -test_copy_file_sameacls_LDADD = $(LDADD) $(LIB_ACL) @LIBINTL@ +test_sameacls_LDADD = $(LDADD) $(LIB_ACL) @LIBINTL@
deleted file mode 100644 --- a/tests/test-copy-file-sameacls.c +++ /dev/null @@ -1,508 +0,0 @@ -/* Test whether two files have the same ACLs. - Copyright (C) 2008 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 - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -/* Written by Bruno Haible <bruno@clisp.org>, 2008. */ - -#include <config.h> - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> - -#if HAVE_ACL_GET_FILE || HAVE_ACL || HAVE_ACLX_GET || HAVE_STATACL -# include <sys/types.h> -# include <sys/acl.h> -#endif - -#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) - -int -main (int argc, char *argv[]) -{ - const char *file1; - const char *file2; - - ASSERT (argc == 3); - - file1 = argv[1]; - file2 = argv[2]; - - /* Compare the contents of the two files. */ - { - size_t size1; - char *contents1; - size_t size2; - char *contents2; - - contents1 = read_file (file1, &size1); - if (contents1 == NULL) - { - 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 (); - } - - if (size2 != size1) - { - 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 (); - } - } - - /* Compare the access permissions of the two files, including ACLs. */ - { - struct stat statbuf1; - struct stat statbuf2; - - if (stat (file1, &statbuf1) < 0) - { - 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 (); - } - 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; - } - } - { -#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) - { - 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; - int count2; - - count1 = acl (file1, GETACLCNT, 0, NULL); - count2 = acl (file2, GETACLCNT, 0, NULL); - - 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 - { - aclent_t *entries1 = XNMALLOC (count1, aclent_t); - aclent_t *entries2 = XNMALLOC (count2, aclent_t); - int i; - - if (acl (file1, GETACL, count1, entries1) < count1) - { - 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 (); - } - 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; - } - } - } -# ifdef ACE_GETACL - count1 = acl (file1, ACE_GETACLCNT, 0, NULL); - count2 = acl (file2, ACE_GETACLCNT, 0, NULL); - 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; - } - else if (count1 > 0) - { - ace_t *entries1 = XNMALLOC (count1, ace_t); - ace_t *entries2 = XNMALLOC (count2, ace_t); - 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; - } - } - } -# endif -#elif HAVE_GETACL /* HP-UX */ - int count1; - int count2; - - count1 = getacl (file1, 0, NULL); - count2 = getacl (file2, 0, NULL); - - 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 - { - 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 (); - } - if (getacl (file2, count2, entries2) < count1) - { - 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; - } - } - } -#elif HAVE_ACLX_GET /* AIX */ - acl_type_t type1; - char acl1[1000]; - size_t aclsize1 = sizeof (acl1); - mode_t mode1; - char text1[1000]; - acl_type_t type2; - char acl2[1000]; - size_t aclsize2 = sizeof (acl2); - mode_t mode2; - char text2[1000]; - - if (aclx_get (file1, 0, &type1, acl1, &aclsize1, &mode1) < 0) - { - fprintf (stderr, "error accessing the ACLs of file %s\n", file1); - fflush (stderr); - abort (); - } - if (aclx_printStr (text1, sizeof (text1), acl1, aclsize1, type1, file1, 0) < 0) - { - fprintf (stderr, "cannot convert the ACLs of file %s to text\n", file1); - fflush (stderr); - abort (); - } - - if (aclx_get (file2, 0, &type2, acl2, &aclsize2, &mode2) < 0) - { - fprintf (stderr, "error accessing the ACLs of file %s\n", file2); - fflush (stderr); - abort (); - } - if (aclx_printStr (text2, sizeof (text2), acl2, aclsize2, type2, file2, 0) < 0) - { - fprintf (stderr, "cannot convert the ACLs of file %s to text\n", file2); - fflush (stderr); - abort (); - } - - 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; - } -#elif HAVE_STATACL /* older AIX */ - union { struct acl a; char room[4096]; } acl1; - union { struct acl a; char room[4096]; } acl2; - unsigned int i; - - if (statacl (file1, STX_NORMAL, &acl1.a, sizeof (acl1)) < 0) - { - fprintf (stderr, "error accessing the ACLs of file %s\n", file1); - fflush (stderr); - abort (); - } - if (statacl (file2, STX_NORMAL, &acl2.a, sizeof (acl2)) < 0) - { - fprintf (stderr, "error accessing the ACLs of file %s\n", file2); - fflush (stderr); - abort (); - } - - 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); - 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); - return 1; - } - if (acl1.a.u_access != acl2.a.u_access - || acl1.a.g_access != acl2.a.g_access - || 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); - 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); - return 1; - } -#endif - } - - return 0; -}
new file mode 100644 --- /dev/null +++ b/tests/test-sameacls.c @@ -0,0 +1,508 @@ +/* Test whether two files have the same ACLs. + Copyright (C) 2008 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 + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Written by Bruno Haible <bruno@clisp.org>, 2008. */ + +#include <config.h> + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> + +#if HAVE_ACL_GET_FILE || HAVE_ACL || HAVE_ACLX_GET || HAVE_STATACL +# include <sys/types.h> +# include <sys/acl.h> +#endif + +#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) + +int +main (int argc, char *argv[]) +{ + const char *file1; + const char *file2; + + ASSERT (argc == 3); + + file1 = argv[1]; + file2 = argv[2]; + + /* Compare the contents of the two files. */ + { + size_t size1; + char *contents1; + size_t size2; + char *contents2; + + contents1 = read_file (file1, &size1); + if (contents1 == NULL) + { + 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 (); + } + + if (size2 != size1) + { + 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 (); + } + } + + /* Compare the access permissions of the two files, including ACLs. */ + { + struct stat statbuf1; + struct stat statbuf2; + + if (stat (file1, &statbuf1) < 0) + { + 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 (); + } + 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; + } + } + { +#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) + { + 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; + int count2; + + count1 = acl (file1, GETACLCNT, 0, NULL); + count2 = acl (file2, GETACLCNT, 0, NULL); + + 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 + { + aclent_t *entries1 = XNMALLOC (count1, aclent_t); + aclent_t *entries2 = XNMALLOC (count2, aclent_t); + int i; + + if (acl (file1, GETACL, count1, entries1) < count1) + { + 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 (); + } + 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; + } + } + } +# ifdef ACE_GETACL + count1 = acl (file1, ACE_GETACLCNT, 0, NULL); + count2 = acl (file2, ACE_GETACLCNT, 0, NULL); + 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; + } + else if (count1 > 0) + { + ace_t *entries1 = XNMALLOC (count1, ace_t); + ace_t *entries2 = XNMALLOC (count2, ace_t); + 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; + } + } + } +# endif +#elif HAVE_GETACL /* HP-UX */ + int count1; + int count2; + + count1 = getacl (file1, 0, NULL); + count2 = getacl (file2, 0, NULL); + + 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 + { + 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 (); + } + if (getacl (file2, count2, entries2) < count1) + { + 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; + } + } + } +#elif HAVE_ACLX_GET /* AIX */ + acl_type_t type1; + char acl1[1000]; + size_t aclsize1 = sizeof (acl1); + mode_t mode1; + char text1[1000]; + acl_type_t type2; + char acl2[1000]; + size_t aclsize2 = sizeof (acl2); + mode_t mode2; + char text2[1000]; + + if (aclx_get (file1, 0, &type1, acl1, &aclsize1, &mode1) < 0) + { + fprintf (stderr, "error accessing the ACLs of file %s\n", file1); + fflush (stderr); + abort (); + } + if (aclx_printStr (text1, sizeof (text1), acl1, aclsize1, type1, file1, 0) < 0) + { + fprintf (stderr, "cannot convert the ACLs of file %s to text\n", file1); + fflush (stderr); + abort (); + } + + if (aclx_get (file2, 0, &type2, acl2, &aclsize2, &mode2) < 0) + { + fprintf (stderr, "error accessing the ACLs of file %s\n", file2); + fflush (stderr); + abort (); + } + if (aclx_printStr (text2, sizeof (text2), acl2, aclsize2, type2, file2, 0) < 0) + { + fprintf (stderr, "cannot convert the ACLs of file %s to text\n", file2); + fflush (stderr); + abort (); + } + + 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; + } +#elif HAVE_STATACL /* older AIX */ + union { struct acl a; char room[4096]; } acl1; + union { struct acl a; char room[4096]; } acl2; + unsigned int i; + + if (statacl (file1, STX_NORMAL, &acl1.a, sizeof (acl1)) < 0) + { + fprintf (stderr, "error accessing the ACLs of file %s\n", file1); + fflush (stderr); + abort (); + } + if (statacl (file2, STX_NORMAL, &acl2.a, sizeof (acl2)) < 0) + { + fprintf (stderr, "error accessing the ACLs of file %s\n", file2); + fflush (stderr); + abort (); + } + + 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); + 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); + return 1; + } + if (acl1.a.u_access != acl2.a.u_access + || acl1.a.g_access != acl2.a.g_access + || 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); + 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); + return 1; + } +#endif + } + + return 0; +}