]> Savannah Git Hosting - gnulib.git/commitdiff
file-has-acl: port symlink code to Cygwin
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 7 Apr 2025 08:45:17 +0000 (01:45 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 7 Apr 2025 08:45:37 +0000 (01:45 -0700)
Problem reported by Corinna Vinschen in:
https://lists.gnu.org/r/bug-gnulib/2025-03/msg00112.html
* lib/file-has-acl.c (acl_get_link_np): New static function,
defined only if needed; include <fcntl.h> if needed for this.
(HAVE_ACL_GET_LINK_NP): Define this if defining acl_get_link_np.

ChangeLog
lib/file-has-acl.c

index 05c48f05da18b3fbeee1ac82aeff17533bf767ff..a3813695f6d4e89c97a5860d758c1d5c0e34adf6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2025-04-07  Paul Eggert  <eggert@cs.ucla.edu>
+
+       file-has-acl: port symlink code to Cygwin
+       Problem reported by Corinna Vinschen in:
+       https://lists.gnu.org/r/bug-gnulib/2025-03/msg00112.html
+       * lib/file-has-acl.c (acl_get_link_np): New static function,
+       defined only if needed; include <fcntl.h> if needed for this.
+       (HAVE_ACL_GET_LINK_NP): Define this if defining acl_get_link_np.
+
 2025-04-07  Simon Josefsson  <simon@josefsson.org>
 
        maintainer-makefile: Avoid submodule-checks fail without submodules.
index 179e805bd48824fe471661d2bf65c12943af7239..66b920c1ab24dfdd49045cab290e817748c30472 100644 (file)
@@ -362,6 +362,29 @@ acl_nfs4_nontrivial (uint32_t *xattr, ssize_t nbytes)
 }
 #endif
 
+#if (!USE_LINUX_XATTR && USE_ACL && HAVE_ACL_GET_FD \
+     && !HAVE_ACL_EXTENDED_FILE && !HAVE_ACL_TYPE_EXTENDED \
+     && !HAVE_ACL_GET_LINK_NP)
+# include <fcntl.h>
+# ifdef O_PATH
+
+/* Like acl_get_file, but do not follow symbolic links.  */
+static acl_t
+acl_get_link_np (char const *name, acl_type_t type)
+{
+  int fd = open (name, O_PATH | O_NOFOLLOW);
+  if (fd < 0)
+    return NULL;
+  acl_t r = acl_get_fd (fd);
+  int err = errno;
+  close (fd);
+  errno = err;
+  return r;
+}
+#  define HAVE_ACL_GET_LINK_NP 1
+# endif
+#endif
+
 /* Return 1 if NAME has a nontrivial access control list,
    0 if ACLs are not supported, or if NAME has no or only a base ACL,
    and -1 (setting errno) on error.  Note callers can determine
@@ -467,7 +490,7 @@ file_has_aclinfo (MAYBE_UNUSED char const *restrict name,
       ret = -1;
 #   else /* FreeBSD, NetBSD >= 10, IRIX, Tru64, Cygwin >= 2.5 */
     acl_t (*acl_get_file_or_link) (char const *, acl_type_t) = acl_get_file;
-#    if HAVE_ACL_GET_LINK_NP /* FreeBSD, NetBSD >= 10 */
+#    if HAVE_ACL_GET_LINK_NP /* FreeBSD, NetBSD >= 10, Cygwin >= 2.5 */
     if (! (flags & ACL_SYMLINK_FOLLOW))
       acl_get_file_or_link = acl_get_link_np;
 #    endif