]> git.ipfire.org Git - thirdparty/git.git/commitdiff
nonblock: support Windows
authorRené Scharfe <l.s.r@web.de>
Wed, 17 Aug 2022 06:05:25 +0000 (02:05 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Aug 2022 16:21:40 +0000 (09:21 -0700)
Implement enable_pipe_nonblock() using the Windows API. This works only
for pipes, but that is sufficient for this limited interface. Despite
the API calls used, it handles both "named" and anonymous pipes from our
pipe() emulation.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/nonblock.c

index b08105a21da1318c71fa2804f5f05eb0bf22482e..9694ebdb1d7af1cd272883a2378d6c22771e34c9 100644 (file)
@@ -12,6 +12,33 @@ int enable_pipe_nonblock(int fd)
        return fcntl(fd, F_SETFL, flags);
 }
 
+#elif defined(GIT_WINDOWS_NATIVE)
+
+#include "win32.h"
+
+int enable_pipe_nonblock(int fd)
+{
+       HANDLE h = (HANDLE)_get_osfhandle(fd);
+       DWORD mode;
+       DWORD type = GetFileType(h);
+       if (type == FILE_TYPE_UNKNOWN && GetLastError() != NO_ERROR) {
+               errno = EBADF;
+               return -1;
+       }
+       if (type != FILE_TYPE_PIPE)
+               BUG("unsupported file type: %lu", type);
+       if (!GetNamedPipeHandleState(h, &mode, NULL, NULL, NULL, NULL, 0)) {
+               errno = err_win_to_posix(GetLastError());
+               return -1;
+       }
+       mode |= PIPE_NOWAIT;
+       if (!SetNamedPipeHandleState(h, &mode, NULL, NULL)) {
+               errno = err_win_to_posix(GetLastError());
+               return -1;
+       }
+       return 0;
+}
+
 #else
 
 int enable_pipe_nonblock(int fd)