From: René Scharfe Date: Wed, 17 Aug 2022 06:05:25 +0000 (-0400) Subject: nonblock: support Windows X-Git-Tag: v2.38.0-rc0~63^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=24b56ae4aecc937a246efb94d283f54a7f59c7f1;p=thirdparty%2Fgit.git 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 Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- 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)