Thread (41 messages) 41 messages, 4 authors, 2022-08-20
STALE1394d

[PATCH v2 2/6] nonblock: support Windows

From: Jeff King <hidden>
Date: 2022-08-17 06:05:30
Subsystem: the rest · Maintainer: Linus Torvalds

From: René Scharfe <redacted>

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 <redacted>
Signed-off-by: Jeff King <redacted>
---
 compat/nonblock.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
diff --git a/compat/nonblock.c b/compat/nonblock.c
index b08105a21d..9694ebdb1d 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)
-- 
2.37.2.881.gb57357660c
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help