#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