mirror of
https://github.com/git/git.git
synced 2024-11-24 18:33:43 +08:00
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:
parent
10f743389c
commit
24b56ae4ae
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user