| #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 |