git
1#include "git-compat-util.h"
2#include "nonblock.h"
3
4#ifdef O_NONBLOCK
5
6int enable_pipe_nonblock(int fd)
7{
8int flags = fcntl(fd, F_GETFL);
9if (flags < 0)
10return -1;
11flags |= O_NONBLOCK;
12return fcntl(fd, F_SETFL, flags);
13}
14
15#elif defined(GIT_WINDOWS_NATIVE)
16
17#include "win32.h"
18
19int enable_pipe_nonblock(int fd)
20{
21HANDLE h = (HANDLE)_get_osfhandle(fd);
22DWORD mode;
23DWORD type = GetFileType(h);
24if (type == FILE_TYPE_UNKNOWN && GetLastError() != NO_ERROR) {
25errno = EBADF;
26return -1;
27}
28if (type != FILE_TYPE_PIPE)
29BUG("unsupported file type: %lu", type);
30if (!GetNamedPipeHandleState(h, &mode, NULL, NULL, NULL, NULL, 0)) {
31errno = err_win_to_posix(GetLastError());
32return -1;
33}
34mode |= PIPE_NOWAIT;
35if (!SetNamedPipeHandleState(h, &mode, NULL, NULL)) {
36errno = err_win_to_posix(GetLastError());
37return -1;
38}
39return 0;
40}
41
42#else
43
44int enable_pipe_nonblock(int fd UNUSED)
45{
46errno = ENOSYS;
47return -1;
48}
49
50#endif
51