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
This commit is contained in:
Ken Brown 2022-07-02 15:12:40 -04:00
parent 1503d14af1
commit 72f855f32b
3 changed files with 82 additions and 0 deletions

View File

@ -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 */

View File

@ -25,3 +25,5 @@ What changed:
Bug Fixes
---------
- Don't error out if getfacl(1) is called on a socket file.
Partially addresses: https://cygwin.com/pipermail/cygwin/2022-July/251768.html

View File

@ -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)
{