On Jul 3 14:37, Ken Brown wrote: > Patch attached. LGTM, but make this master (i .e., 3.4) only.
Thanks, Corinna > From 28cd29d99fe6d1a54c8dad04854bda10743737d3 Mon Sep 17 00:00:00 2001 > From: Ken Brown <kbr...@cornell.edu> > Date: Sat, 2 Jul 2022 15:12:40 -0400 > Subject: [PATCH] Cygwin: implement getfacl(1) for socket files > > Do this by defining the acl_get method for the fhandler_socket_local > and fhandler_socket_unix classes. Also define acl_set for these > classes. > > Partially addresses: https://cygwin.com/pipermail/cygwin/2022-July/251768.html > --- > winsup/cygwin/fhandler.h | 4 ++ > winsup/cygwin/release/3.3.6 | 3 ++ > winsup/cygwin/sec_posixacl.cc | 76 +++++++++++++++++++++++++++++++++++ > 3 files changed, 83 insertions(+) > > diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h > index d5ec56a6d..cb5e08fa3 100644 > --- a/winsup/cygwin/fhandler.h > +++ b/winsup/cygwin/fhandler.h > @@ -861,6 +861,8 @@ class fhandler_socket_local: public fhandler_socket_wsock > int fchmod (mode_t newmode); > int fchown (uid_t newuid, gid_t newgid); > int facl (int, int, struct acl *); > + struct __acl_t *acl_get (uint32_t); > + int acl_set (struct __acl_t *, uint32_t); > int link (const char *); > > /* from here on: CLONING */ > @@ -1143,6 +1145,8 @@ class fhandler_socket_unix : public fhandler_socket > int fchmod (mode_t newmode); > int fchown (uid_t newuid, gid_t newgid); > int facl (int, int, struct acl *); > + struct __acl_t *acl_get (uint32_t); > + int acl_set (struct __acl_t *, uint32_t); > int link (const char *); > > /* select.cc */ > diff --git a/winsup/cygwin/release/3.3.6 b/winsup/cygwin/release/3.3.6 > index 44a7bcf9d..b18691428 100644 > --- a/winsup/cygwin/release/3.3.6 > +++ b/winsup/cygwin/release/3.3.6 > @@ -26,3 +26,6 @@ Bug Fixes > - Fix a console problem that the text longer than 1024 bytes cannot > be pasted correctly. > Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251764.html > + > +- Don't error out if getfacl(1) is called on a socket file. > + Partially addresses: > https://cygwin.com/pipermail/cygwin/2022-July/251768.html > diff --git a/winsup/cygwin/sec_posixacl.cc b/winsup/cygwin/sec_posixacl.cc > index e7e5a9c3e..c2daa3309 100644 > --- a/winsup/cygwin/sec_posixacl.cc > +++ b/winsup/cygwin/sec_posixacl.cc > @@ -633,6 +633,44 @@ fhandler_disk_file::acl_get (acl_type_t type) > return acl; > } > > +acl_t > +fhandler_socket_local::acl_get (acl_type_t type) > +{ > + if (!dev ().isfs ()) > + /* acl_get_fd on a socket. */ > + return fhandler_base::acl_get (type); > + > + /* acl_get_fd on a socket opened with O_PATH or acl_get_file on a > + socket file. */ > + if (get_flags () & O_PATH) > + { > + set_errno (EBADF); > + return NULL; > + } > + fhandler_disk_file fh (pc); > + return fh.acl_get (type); > +} > + > +#ifdef __WITH_AF_UNIX > +acl_t > +fhandler_socket_unix::acl_get (acl_type_t type) > +{ > + if (!dev ().isfs ()) > + /* acl_get_fd on a socket. */ > + return fhandler_base::acl_get (type); > + > + /* acl_get_fd on a socket opened with O_PATH or acl_get_file on a > + socket file. */ > + if (get_flags () & O_PATH) > + { > + set_errno (EBADF); > + return NULL; > + } > + fhandler_disk_file fh (pc); > + return fh.acl_get (type); > +} > +#endif > + > extern "C" acl_t > acl_get_fd (int fd) > { > @@ -765,6 +803,44 @@ fhandler_disk_file::acl_set (acl_t acl, acl_type_t type) > return ret; > } > > +int > +fhandler_socket_local::acl_set (acl_t acl, acl_type_t type) > +{ > + if (!dev ().isfs ()) > + /* acl_set_fd on a socket. */ > + return fhandler_base::acl_set (acl, type); > + > + /* acl_set_fd on a socket opened with O_PATH or acl_set_file on a > + socket file. */ > + if (get_flags () & O_PATH) > + { > + set_errno (EBADF); > + return -1; > + } > + fhandler_disk_file fh (pc); > + return fh.acl_set (acl, type); > +} > + > +#ifdef __WITH_AF_UNIX > +int > +fhandler_socket_unix::acl_set (acl_t acl, acl_type_t type) > +{ > + if (!dev ().isfs ()) > + /* acl_set_fd on a socket. */ > + return fhandler_base::acl_set (acl, type); > + > + /* acl_set_fd on a socket opened with O_PATH or acl_set_file on a > + socket file. */ > + if (get_flags () & O_PATH) > + { > + set_errno (EBADF); > + return -1; > + } > + fhandler_disk_file fh (pc); > + return fh.acl_set (acl, type); > +} > +#endif > + > extern "C" int > acl_set_fd (int fd, acl_t acl) > { > -- > 2.36.1 >