If __WITH_AF_UNIX is defined when Cygwin is built, then a named AF_UNIX socket is represented by a reparse point with a Cygwin-specific tag and GUID. Make such files recognizable as reparse points (but not as sockets) even if __WITH_AF_UNIX is not defined. That way utilities such as 'ls' and 'rm' still behave reasonably.
This requires two changes: - Define the GUID __cygwin_socket_guid unconditionally. - Make check_reparse_point_target return PATH_REP on a reparse point of this type if __WITH_AF_UNIX is not defined. --- winsup/cygwin/fhandler_socket_unix.cc | 17 +++++++++-------- winsup/cygwin/path.cc | 10 ++++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc index d7bb1090e..429aa8a90 100644 --- a/winsup/cygwin/fhandler_socket_unix.cc +++ b/winsup/cygwin/fhandler_socket_unix.cc @@ -8,9 +8,17 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ +#include "winsup.h" + +GUID __cygwin_socket_guid = { + .Data1 = 0xefc1714d, + .Data2 = 0x7b19, + .Data3 = 0x4407, + .Data4 = { 0xba, 0xb3, 0xc5, 0xb1, 0xf9, 0x2c, 0xb8, 0x8c } +}; + #ifdef __WITH_AF_UNIX -#include "winsup.h" #include <w32api/winioctl.h> #include <asm/byteorder.h> #include <unistd.h> @@ -124,13 +132,6 @@ class af_unix_pkt_hdr_t (void *)(((PBYTE)(_p)) + AF_UNIX_PKT_OFFSETOF_DATA (_p)); \ }) -GUID __cygwin_socket_guid = { - .Data1 = 0xefc1714d, - .Data2 = 0x7b19, - .Data3 = 0x4407, - .Data4 = { 0xba, 0xb3, 0xc5, 0xb1, 0xf9, 0x2c, 0xb8, 0x8c } -}; - /* Some error conditions on pipes have multiple status codes, unfortunately. */ #define STATUS_PIPE_NO_INSTANCE_AVAILABLE(status) \ ({ NTSTATUS _s = (status); \ diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 2e3208d2d..4f5f03a76 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2476,8 +2476,7 @@ check_reparse_point_string (PUNICODE_STRING subst) /* Return values: <0: Negative errno. 0: Not a reparse point recognized by us. - >0: PATH_SYMLINK | PATH_REP for symlink or directory mount point, - PATH_SOCKET | PATH_REP for AF_UNIX socket. + >0: Path flags for a recognized reparse point, always including PATH_REP. */ int check_reparse_point_target (HANDLE h, bool remote, PREPARSE_DATA_BUFFER rp, @@ -2618,15 +2617,18 @@ check_reparse_point_target (HANDLE h, bool remote, PREPARSE_DATA_BUFFER rp, } return -EIO; } -#ifdef __WITH_AF_UNIX else if (rp->ReparseTag == IO_REPARSE_TAG_CYGUNIX) { PREPARSE_GUID_DATA_BUFFER rgp = (PREPARSE_GUID_DATA_BUFFER) rp; if (memcmp (CYGWIN_SOCKET_GUID, &rgp->ReparseGuid, sizeof (GUID)) == 0) +#ifdef __WITH_AF_UNIX return PATH_SOCKET | PATH_REP; +#else + /* Recognize this as a reparse point but not as a socket. */ + return PATH_REP; +#endif } -#endif /* __WITH_AF_UNIX */ return 0; } -- 2.28.0