aboutsummaryrefslogtreecommitdiff
path: root/bin/ls
diff options
context:
space:
mode:
authorBosko Milekic <bmilekic@FreeBSD.org>2004-04-03 16:55:56 +0000
committerBosko Milekic <bmilekic@FreeBSD.org>2004-04-03 16:55:56 +0000
commit263377339cd8d5cb97519ba9595a03828d0ca99c (patch)
tree28ad418aceb5508d4c74a09bb0b205944312cf1f /bin/ls
parentfdcac92868ae2506749bb4edc925e754f2118006 (diff)
downloadsrc-263377339cd8d5cb97519ba9595a03828d0ca99c.tar.gz
src-263377339cd8d5cb97519ba9595a03828d0ca99c.zip
Stop iterating over ACLs if we've already determined we
will print them (i.e., number of successful calls to acl_get_entry() exceeds 3). This makes O(1) what was O(num_TYPE_ACCESS_ACLs). This is a slightly modified version of submitter's patch. PR: bin/65042 Submitted by: Christian S.J. Peron <maneo@bsdpro.com>
Notes
Notes: svn path=/head/; revision=127795
Diffstat (limited to 'bin/ls')
-rw-r--r--bin/ls/print.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/bin/ls/print.c b/bin/ls/print.c
index d4cae67198c4..e5f2575d8178 100644
--- a/bin/ls/print.c
+++ b/bin/ls/print.c
@@ -694,11 +694,17 @@ aclmode(char *buf, const FTSENT *p, int *haveacls)
*haveacls = 1;
if ((facl = acl_get_file(name, ACL_TYPE_ACCESS)) != NULL) {
if (acl_get_entry(facl, ACL_FIRST_ENTRY, &ae) == 1) {
- entries = 0;
- do
- entries++;
- while (acl_get_entry(facl, ACL_NEXT_ENTRY, &ae) == 1);
- if (entries != 3)
+ entries = 1;
+ while (acl_get_entry(facl, ACL_NEXT_ENTRY, &ae) == 1)
+ if (++entries > 3)
+ break;
+ /*
+ * POSIX.1e requires that ACLs of type ACL_TYPE_ACCESS
+ * must have at least three entries (owner, group,
+ * and other). So anything with more than 3 ACLs looks
+ * interesting to us.
+ */
+ if (entries > 3)
buf[10] = '+';
}
acl_free(facl);