summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené Scharfe <l.s.r@web.de>2022-08-17 06:05:25 (GMT)
committerJunio C Hamano <gitster@pobox.com>2022-08-17 16:21:40 (GMT)
commit24b56ae4aecc937a246efb94d283f54a7f59c7f1 (patch)
treeaf2c12bd211b960c757baa5670ebfeda79376c0a
parent10f743389ca9a92720fb9c3d15f647888d82c297 (diff)
downloadgit-24b56ae4aecc937a246efb94d283f54a7f59c7f1.zip
git-24b56ae4aecc937a246efb94d283f54a7f59c7f1.tar.gz
git-24b56ae4aecc937a246efb94d283f54a7f59c7f1.tar.bz2
nonblock: support Windows
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>
-rw-r--r--compat/nonblock.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/compat/nonblock.c b/compat/nonblock.c
index b08105a..9694ebd 100644
--- a/compat/nonblock.c
+++ b/compat/nonblock.c
@@ -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)