From: Bruno Haible <bruno@clisp.org>
Date: Tue, 3 Jun 2008 10:57:18 +0000 (+0200)
Subject: Make acl_entries work reliably.
X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96da577c491b74012dc5db01c0ce64a000b7e173;p=pspp

Make acl_entries work reliably.
---

diff --git a/ChangeLog b/ChangeLog
index 4aff8f46b2..339839131c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-06-02  Bruno Haible  <bruno@clisp.org>
+
+	* lib/acl_entries.c (acl_entries): Rewrite to use acl_get_entry.
+	* lib/copy-acl.c (qcopy_acl): Update comment.
+
 2008-06-02  Bruno Haible  <bruno@clisp.org>
 
 	* lib/acl-entries.h: Enclose most definitions in #ifs for POSIX-draft
diff --git a/lib/acl_entries.c b/lib/acl_entries.c
index cd3c38b145..a931fff67d 100644
--- a/lib/acl_entries.c
+++ b/lib/acl_entries.c
@@ -21,18 +21,38 @@
 
 #include "acl-internal.h"
 
+/* This file assumes POSIX-draft like ACLs
+   (Linux, FreeBSD, MacOS X, IRIX, Tru64).  */
+
 /* Return the number of entries in ACL.  */
 
 int
 acl_entries (acl_t acl)
 {
-  char *t;
-  int entries = 0;
-  char *text = acl_to_text (acl, NULL);
-  if (! text)
-    return -1;
-  for (t = text; *t; t++)
-    entries += (*t == '\n');
-  acl_free_text (text);
-  return entries;
+  int count = 0;
+
+  if (acl != NULL)
+    {
+#if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD, MacOS X */
+      acl_entry_t ace;
+      int at_end;
+
+      for (at_end = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
+	   !at_end;
+	   at_end = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
+	count++;
+#else /* IRIX, Tru64 */
+# if HAVE_ACL_TO_SHORT_TEXT /* IRIX */
+      /* Don't use acl_get_entry: it is undocumented.  */
+      count = acl->acl_cnt;
+# endif
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+      /* Don't use acl_get_entry: it takes only one argument and does not
+	 work.  */
+      count = acl->acl_num;
+# endif
+#endif
+    }
+
+  return count;
 }
diff --git a/lib/copy-acl.c b/lib/copy-acl.c
index c9b8935761..2a32f7d0d8 100644
--- a/lib/copy-acl.c
+++ b/lib/copy-acl.c
@@ -72,8 +72,7 @@ qcopy_acl (const char *src_name, int source_desc, const char *dst_name,
 
 	  acl_free (acl);
 	  /* On most hosts with MODE_INSIDE_ACL an ACL is trivial if n == 3,
-	     and it cannot be less than 3.  On IRIX 6.5 it is also trivial if
-	     n == -1.
+	     and it cannot be less than 3.
 	     For simplicity and safety, assume the ACL is trivial if n <= 3.
 	     Also see file-has-acl.c for some of the other possibilities;
 	     it's not clear whether that complexity is needed here.  */