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>
This commit is contained in:
René Scharfe 2022-08-17 02:05:25 -04:00 committed by Junio C Hamano
parent 10f743389c
commit 24b56ae4ae

View 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)