On 2024-10-01 14:42, Bruno Haible wrote:

../../gllib/file-has-acl.c:427:21: error: use of undeclared identifier 
'acl_extended_file'
                   ? acl_extended_file

Thanks, fixed by installing the attached.
From 9256d97e074bbae33bbd188e742daccfb72022de Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Tue, 1 Oct 2024 19:51:50 -0700
Subject: [PATCH] file-has-acl.c: port back to macOS
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Problem reported by Bruno Haible in:
https://lists.gnu.org/r/bug-gnulib/2024-10/msg00000.html
* lib/file-has-acl.c (file_has_aclinfo): Don’t attempt to link to
acl_extended_file if !HAVE_ACL_EXTENDED_FILE.  Most of this patch
consists of indenting changes; the real change is to use ‘#if’
rather than ‘if’.
---
 ChangeLog          |  10 +++++
 lib/file-has-acl.c | 109 +++++++++++++++++++++------------------------
 2 files changed, 62 insertions(+), 57 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 7d88adbb21..75f8a2a541 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2024-10-01  Paul Eggert  <egg...@cs.ucla.edu>
+
+	file-has-acl.c: port back to macOS
+	Problem reported by Bruno Haible in:
+	https://lists.gnu.org/r/bug-gnulib/2024-10/msg00000.html
+	* lib/file-has-acl.c (file_has_aclinfo): Don’t attempt to link to
+	acl_extended_file if !HAVE_ACL_EXTENDED_FILE.  Most of this patch
+	consists of indenting changes; the real change is to use ‘#if’
+	rather than ‘if’.
+
 2024-10-01  Bruno Haible  <br...@clisp.org>
 
 	localename-unsafe: Modernize locale name mapping.
diff --git a/lib/file-has-acl.c b/lib/file-has-acl.c
index 944f0d2200..f29414de67 100644
--- a/lib/file-has-acl.c
+++ b/lib/file-has-acl.c
@@ -418,76 +418,71 @@ file_has_aclinfo (char const *name, struct stat const *sb,
       /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
       int ret;
 
-      if (HAVE_ACL_EXTENDED_FILE) /* Linux */
+#  if HAVE_ACL_EXTENDED_FILE /* Linux */
+        /* On Linux, acl_extended_file is an optimized function: It only
+           makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for
+           ACL_TYPE_DEFAULT.  */
+      ret = ((flags & ACL_SYMLINK_FOLLOW
+              ? acl_extended_file
+              : acl_extended_file_nofollow)
+             (name));
+#  elif HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
+      /* On Mac OS X, acl_get_file (name, ACL_TYPE_ACCESS)
+         and acl_get_file (name, ACL_TYPE_DEFAULT)
+         always return NULL / EINVAL.  There is no point in making
+         these two useless calls.  The real ACL is retrieved through
+         acl_get_file (name, ACL_TYPE_EXTENDED).  */
+      acl_t acl = acl_get_file (name, ACL_TYPE_EXTENDED);
+      if (acl)
         {
-          /* On Linux, acl_extended_file is an optimized function: It only
-             makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for
-             ACL_TYPE_DEFAULT.  */
-          ret = ((flags & ACL_SYMLINK_FOLLOW
-                  ? acl_extended_file
-                  : acl_extended_file_nofollow)
-                 (name));
+          ret = acl_extended_nontrivial (acl);
+          acl_free (acl);
         }
-      else /* FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
-        {
-#  if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
-          /* On Mac OS X, acl_get_file (name, ACL_TYPE_ACCESS)
-             and acl_get_file (name, ACL_TYPE_DEFAULT)
-             always return NULL / EINVAL.  There is no point in making
-             these two useless calls.  The real ACL is retrieved through
-             acl_get_file (name, ACL_TYPE_EXTENDED).  */
-          acl_t acl = acl_get_file (name, ACL_TYPE_EXTENDED);
-          if (acl)
-            {
-              ret = acl_extended_nontrivial (acl);
-              acl_free (acl);
-            }
-          else
-            ret = -1;
+      else
+        ret = -1;
 #  else /* FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */
-          acl_t acl = acl_get_file (name, ACL_TYPE_ACCESS);
-          if (acl)
-            {
-              int saved_errno;
+      acl_t acl = acl_get_file (name, ACL_TYPE_ACCESS);
+      if (acl)
+        {
+          int saved_errno;
 
-              ret = acl_access_nontrivial (acl);
-              saved_errno = errno;
-              acl_free (acl);
-              errno = saved_errno;
+          ret = acl_access_nontrivial (acl);
+          saved_errno = errno;
+          acl_free (acl);
+          errno = saved_errno;
 #   if HAVE_ACL_FREE_TEXT /* Tru64 */
-              /* On OSF/1, acl_get_file (name, ACL_TYPE_DEFAULT) always
-                 returns NULL with errno not set.  There is no point in
-                 making this call.  */
+          /* On OSF/1, acl_get_file (name, ACL_TYPE_DEFAULT) always
+             returns NULL with errno not set.  There is no point in
+             making this call.  */
 #   else /* FreeBSD, IRIX, Cygwin >= 2.5 */
-              /* On Linux, FreeBSD, IRIX, acl_get_file (name, ACL_TYPE_ACCESS)
-                 and acl_get_file (name, ACL_TYPE_DEFAULT) on a directory
-                 either both succeed or both fail; it depends on the
-                 file system.  Therefore there is no point in making the second
-                 call if the first one already failed.  */
-              if (ret == 0 && S_ISDIR (sb->st_mode))
+          /* On Linux, FreeBSD, IRIX, acl_get_file (name, ACL_TYPE_ACCESS)
+             and acl_get_file (name, ACL_TYPE_DEFAULT) on a directory
+             either both succeed or both fail; it depends on the
+             file system.  Therefore there is no point in making the second
+             call if the first one already failed.  */
+          if (ret == 0 && S_ISDIR (sb->st_mode))
+            {
+              acl = acl_get_file (name, ACL_TYPE_DEFAULT);
+              if (acl)
                 {
-                  acl = acl_get_file (name, ACL_TYPE_DEFAULT);
-                  if (acl)
-                    {
 #    ifdef __CYGWIN__ /* Cygwin >= 2.5 */
-                      ret = acl_access_nontrivial (acl);
-                      saved_errno = errno;
-                      acl_free (acl);
-                      errno = saved_errno;
+                  ret = acl_access_nontrivial (acl);
+                  saved_errno = errno;
+                  acl_free (acl);
+                  errno = saved_errno;
 #    else
-                      ret = (0 < acl_entries (acl));
-                      acl_free (acl);
+                  ret = (0 < acl_entries (acl));
+                  acl_free (acl);
 #    endif
-                    }
-                  else
-                    ret = -1;
                 }
-#   endif
+              else
+                ret = -1;
             }
-          else
-            ret = -1;
-#  endif
+#   endif
         }
+      else
+        ret = -1;
+#  endif
       if (ret < 0)
         return - acl_errno_valid (errno);
       return ret;
-- 
2.43.0

Reply via email to