[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#20311: [GNULIB 3/4] qacl: Simplify HP-UP acl_nontrivial check
From: |
Andreas Gruenbacher |
Subject: |
bug#20311: [GNULIB 3/4] qacl: Simplify HP-UP acl_nontrivial check |
Date: |
Sun, 12 Apr 2015 16:36:38 +0200 |
* 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