1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include "git-compat-util.h"
#include "nonblock.h"
#ifdef O_NONBLOCK
int enable_pipe_nonblock(int fd)
{
int flags = fcntl(fd, F_GETFL);
if (flags < 0)
return -1;
flags |= O_NONBLOCK;
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 UNUSED)
{
errno = ENOSYS;
return -1;
}
#endif
|