* 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. --- lib/acl-internal.c | 11 ++++++----- lib/acl-internal.h | 2 +- lib/qcopy-acl.c | 17 +++-------------- 3 files changed, 10 insertions(+), 20 deletions(-)
diff --git a/lib/acl-internal.c b/lib/acl-internal.c index 7a465c1..d9bd446 100644 --- a/lib/acl-internal.c +++ b/lib/acl-internal.c @@ -336,18 +336,19 @@ acl_ace_nontrivial (int count, ace_t *entries) /* 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; } diff --git a/lib/acl-internal.h b/lib/acl-internal.h index 243ca32..9b9fae2 100644 --- a/lib/acl-internal.h +++ b/lib/acl-internal.h @@ -220,7 +220,7 @@ extern int acl_ace_nontrivial (int count, ace_t *entries) _GL_ATTRIBUTE_PURE; /* 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 */ diff --git a/lib/qcopy-acl.c b/lib/qcopy-acl.c index aac76a1..bc258ba 100644 --- a/lib/qcopy-acl.c +++ b/lib/qcopy-acl.c @@ -437,20 +437,9 @@ qcopy_acl (const char *src_name, int source_desc, const char *dst_name, 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; -- 2.1.0