On 25/09/2020 14:19, Ken Brown wrote:
On 9/24/2020 8:01 AM, Michael McMahon wrote:
On 24/09/2020 12:26, Ken Brown wrote:
On 9/23/2020 7:25 AM, Michael McMahon via Cygwin wrote:
Hi,
I searched for related issues but haven't found anything.
I am having some trouble with Windows native Unix domain sockets
(a recent feature in Windows 10 and 2019 server) and Cygwin.
I think I possibly know the cause since I had to investigate a similar
looking issue on another platform built on Windows.
The problem is that cygwin commands don't seem to recognise native Unix
domain sockets correctly. For example, the socket "foo.sock" should
have the same ownership and similar permissions to other files
in the example below:
$ ls -lrt
total 2181303
-rw-r--r-- 1 mimcmah None 1259 Sep 23 10:22 test.c
-rwxr-xr-x 1 mimcmah None 3680 Sep 23 10:22
test.obj
-rwxr-xr-x 1 mimcmah None 121344 Sep 23 10:22
test.exe
-rw-r----- 1 Unknown+User Unknown+Group 0 Sep 23 10:23
foo.sock
-rw-r--r-- 1 mimcmah None 144356 Sep 23 10:27
check.ot
A bigger problem is that foo.sock can't be deleted with the cygwin "rm"
command.
$ rm -f foo.sock
rm: cannot remove 'foo.sock': Permission denied
$ chmod 777 foo.sock
chmod: changing permissions of 'foo.sock': Permission denied
$ cmd /c del foo.sock
But, native Windows commands are okay, as the third example shows.
I think the problem may relate to the way native Unix domain sockets
are
implemented in Windows and the resulting special handling required.
They are implemented as NTFS reparse points and when opening them
with CreateFile, you need to specify the FILE_FLAG_OPEN_REPARSE_POINT
flag. Otherwise, you get an ERROR_CANT_ACCESS_FILE. There are other
complications unfortunately, which I'd be happy to discuss further.
But, to reproduce it, you can compile the attached code snippet
which creates foo.sock in the current directory. Obviously, this
only works on recent versions of Windows 10 and 2019 server.
Cygwin doesn't currently support native Windows AF_UNIX sockets, as
you've discovered. See
https://urldefense.com/v3/__https://cygwin.com/pipermail/cygwin/2020-June/245088.html__;!!GqivPVa7Brio!P7lIFI4rYAtWh8_DtCbRCxT-M_E4vwQ0qwzQ0p656T73BpJ0jbUkLI_bXdA6mmSL9lJcSQ$
for the current state of AF_UNIX sockets on Cygwin, including the
possibility of using native Windows AF_UNIX sockets on systems that
support them.
If all you want is for Cygwin to recognize such sockets and allow you
to apply rm, chmod, etc., I don't think it would be hard to add that
capability. But I doubt if that's all you want.
Further discussion of this will have to wait until Corinna is available.
Thanks for the info. It's mainly about recognition of sockets for
regular commands. Since these objects can exist on Windows filesystems
now, potentially created by any kind of Windows application,
it would be great if Cygwin could handle them, irrespective of whether
the Cygwin development environment does. Though that sounds like a
good idea too.
I think this has a simple fix (attached), but I can't easily test it
because your test program doesn't compile for me. First, I got
$ gcc -o native_unix_socket native_unix_socket.c
native_unix_socket.c:5:10: fatal error: WS2tcpip.h: No such file or
directory
5 | #include <WS2tcpip.h>
| ^~~~~~~~~~~~
compilation terminated.
I fixed this by making the include file name lower case. (My system is
case sensitive, so it matters.)
Next:
$ gcc -o native_unix_socket native_unix_socket.c
native_unix_socket.c:8:10: fatal error: afunix.h: No such file or directory
8 | #include <afunix.h>
| ^~~~~~~~~~
compilation terminated.
There's no file afunix.h in the Cygwin distribution, but I located it
online and pasted in the contents. The program now compiles but fails
to link:
$ gcc -o native_unix_socket native_unix_socket.c
/usr/lib/gcc/x86_64-pc-cygwin/10/../../../../x86_64-pc-cygwin/bin/ld:
/tmp/cc74urPr.o:native_unix_socket.c:(.text+0x3b): undefined reference
to `__imp_WSAStartup'
/tmp/cc74urPr.o:native_unix_socket.c:(.text+0x3b): relocation truncated
to fit: R_X86_64_PC32 against undefined symbol `__imp_WSAStartup'
/usr/lib/gcc/x86_64-pc-cygwin/10/../../../../x86_64-pc-cygwin/bin/ld:
/tmp/cc74urPr.o:native_unix_socket.c:(.text+0xf2): undefined reference
to `__imp_WSAGetLastError'
/tmp/cc74urPr.o:native_unix_socket.c:(.text+0xf2): relocation truncated
to fit: R_X86_64_PC32 against undefined symbol `__imp_WSAGetLastError'
/usr/lib/gcc/x86_64-pc-cygwin/10/../../../../x86_64-pc-cygwin/bin/ld:
/tmp/cc74urPr.o:native_unix_socket.c:(.text+0x13d): undefined reference
to `__imp_WSAGetLastError'
/tmp/cc74urPr.o:native_unix_socket.c:(.text+0x13d): relocation truncated
to fit: R_X86_64_PC32 against undefined symbol `__imp_WSAGetLastError'
collect2: error: ld returned 1 exit status
This is probably easy to fix too, but I don't feel like tracking it
down. Please send compilation instructions (that use Cygwin tools).
Ken
Hi
Sorry, I had compiled it in a native Visual C environment.
Assuming you have afunix.h in the current directory.
gcc -o native_unix_socket -I. native_unix_socket.c -lws2_32
should do it.
Michael.
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple