4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-22 16:49:45 +08:00

Cygwin: AF_UNIX: allow opening with the O_PATH flag

This was done for the fhandler_socket_local class in commits
3a2191653a, 141437d374, and 477121317d, but the fhandler_socket_unix
class was overlooked.
This commit is contained in:
Ken Brown 2021-02-23 11:48:46 -05:00
parent 2911d50e70
commit 949fe7bec5
2 changed files with 25 additions and 0 deletions

View File

@ -1111,6 +1111,7 @@ class fhandler_socket_unix : public fhandler_socket
int getsockname (struct sockaddr *name, int *namelen); int getsockname (struct sockaddr *name, int *namelen);
int getpeername (struct sockaddr *name, int *namelen); int getpeername (struct sockaddr *name, int *namelen);
int shutdown (int how); int shutdown (int how);
int open (int flags, mode_t mode = 0);
int close (); int close ();
int getpeereid (pid_t *pid, uid_t *euid, gid_t *egid); int getpeereid (pid_t *pid, uid_t *euid, gid_t *egid);
ssize_t recvmsg (struct msghdr *msg, int flags); ssize_t recvmsg (struct msghdr *msg, int flags);

View File

@ -1208,6 +1208,11 @@ fhandler_socket_unix::~fhandler_socket_unix ()
int int
fhandler_socket_unix::dup (fhandler_base *child, int flags) fhandler_socket_unix::dup (fhandler_base *child, int flags)
{ {
if (get_flags () & O_PATH)
/* We're viewing the socket as a disk file, but fhandler_base::dup
suffices here. */
return fhandler_base::dup (child, flags);
if (fhandler_socket::dup (child, flags)) if (fhandler_socket::dup (child, flags))
{ {
__seterrno (); __seterrno ();
@ -1801,9 +1806,23 @@ fhandler_socket_unix::shutdown (int how)
return 0; return 0;
} }
int
fhandler_socket_unix::open (int flags, mode_t mode)
{
/* We don't support opening sockets unless O_PATH is specified. */
if (flags & O_PATH)
return open_fs (flags, mode);
set_errno (EOPNOTSUPP);
return 0;
}
int int
fhandler_socket_unix::close () fhandler_socket_unix::close ()
{ {
if (get_flags () & O_PATH)
return fhandler_base::close ();
HANDLE evt = InterlockedExchangePointer (&cwt_termination_evt, NULL); HANDLE evt = InterlockedExchangePointer (&cwt_termination_evt, NULL);
HANDLE thr = InterlockedExchangePointer (&connect_wait_thr, NULL); HANDLE thr = InterlockedExchangePointer (&connect_wait_thr, NULL);
if (thr) if (thr)
@ -2281,6 +2300,11 @@ fhandler_socket_unix::ioctl (unsigned int cmd, void *p)
int int
fhandler_socket_unix::fcntl (int cmd, intptr_t arg) fhandler_socket_unix::fcntl (int cmd, intptr_t arg)
{ {
if (get_flags () & O_PATH)
/* We're viewing the socket as a disk file, but
fhandler_base::fcntl suffices here. */
return fhandler_base::fcntl (cmd, arg);
int ret = -1; int ret = -1;
switch (cmd) switch (cmd)