From 24b56ae4aecc937a246efb94d283f54a7f59c7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Wed, 17 Aug 2022 02:05:25 -0400 Subject: nonblock: support Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 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) -- cgit v0.10.2-6-g49f6