From: Paul Eggert Date: Mon, 7 Apr 2025 08:45:17 +0000 (-0700) Subject: file-has-acl: port symlink code to Cygwin X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=41e7b7e0d159d8ac0eb385964119f350ac9dfc3f;p=gnulib.git 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 if needed for this. (HAVE_ACL_GET_LINK_NP): Define this if defining acl_get_link_np. --- diff --git a/ChangeLog b/ChangeLog index 05c48f05da..a3813695f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2025-04-07 Paul Eggert + + 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 if needed for this. + (HAVE_ACL_GET_LINK_NP): Define this if defining acl_get_link_np. + 2025-04-07 Simon Josefsson maintainer-makefile: Avoid submodule-checks fail without submodules. diff --git a/lib/file-has-acl.c b/lib/file-has-acl.c index 179e805bd4..66b920c1ab 100644 --- a/lib/file-has-acl.c +++ b/lib/file-has-acl.c @@ -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 +# 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