Mercurial > hg > octave-jordi > gnulib-hg
changeset 17963:d4fc0c72ed64
qacl: Simplify HP-UX acl_nontrivial check
* lib/acl-internal.c: Remove struct stat parameter from HP-UX's version of
acl_nontrivial. Check if the acl has at most three entries instead (it must
have exactly three entries according to the HP-UX documentation). Ignore
uids and gids as long as an entry is either for a user (i.e., the owner),
a group (i.e., the owning group), or others.
* lib/acl-internal.h: Change HP-UX's acl_nontrivial prototype.
* lib/qcopy-acl.c (qcopy_acl): With that, we no longer need to stat the source
file.
author | Andreas Gruenbacher <andreas.gruenbacher@gmail.com> |
---|---|
date | Sun, 12 Apr 2015 16:36:38 +0200 |
parents | 58658f2c2c44 |
children | 5a6167820a2c |
files | ChangeLog lib/acl-internal.c lib/acl-internal.h lib/qcopy-acl.c |
diffstat | 4 files changed, 21 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2015-04-15 Andreas Gruenbacher <andreas.gruenbacher@gmail.com> + + qacl: Simplify HP-UX acl_nontrivial check + * lib/acl-internal.c: Remove struct stat parameter from HP-UX's version of + acl_nontrivial. Check if the acl has at most three entries instead (it must + have exactly three entries according to the HP-UX documentation). Ignore + uids and gids as long as an entry is either for a user (i.e., the owner), + a group (i.e., the owning group), or others. + * lib/acl-internal.h: Change HP-UX's acl_nontrivial prototype. + * lib/qcopy-acl.c (qcopy_acl): With that, we no longer need to stat the file. + 2015-04-15 Andreas Gruenbacher <andreas.gruenbacher@gmail.com> acl: On Linux, check for acls without libacl
--- a/lib/acl-internal.c +++ b/lib/acl-internal.c @@ -336,18 +336,19 @@ /* Return 1 if the given ACL is non-trivial. Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ int -acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb) +acl_nontrivial (int count, struct acl_entry *entries) { int i; + if (count > 3) + return 1; + for (i = 0; i < count; i++) { struct acl_entry *ace = &entries[i]; - if (!((ace->uid == sb->st_uid && ace->gid == ACL_NSGROUP) - || (ace->uid == ACL_NSUSER && ace->gid == sb->st_gid) - || (ace->uid == ACL_NSUSER && ace->gid == ACL_NSGROUP))) - return 1; + if (ace->uid != ACL_NSUSER && ace->gid != ACL_NSGROUP) + return 1; } return 0; }
--- a/lib/acl-internal.h +++ b/lib/acl-internal.h @@ -220,7 +220,7 @@ /* Return 1 if the given ACL is non-trivial. Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ -extern int acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb); +extern int acl_nontrivial (int count, struct acl_entry *entries); # if HAVE_ACLV_H /* HP-UX >= 11.11 */
--- a/lib/qcopy-acl.c +++ b/lib/qcopy-acl.c @@ -437,20 +437,9 @@ if (ret < 0 && saved_errno == 0) { saved_errno = errno; - if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) - { - struct stat source_statbuf; - - if ((source_desc != -1 - ? fstat (source_desc, &source_statbuf) - : stat (src_name, &source_statbuf)) == 0) - { - if (!acl_nontrivial (count, entries, &source_statbuf)) - saved_errno = 0; - } - else - saved_errno = errno; - } + if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP + && !acl_nontrivial (count, entries)) + saved_errno = 0; } else did_chmod = 1;