2022-08-17 14:04:55 +08:00
|
|
|
#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);
|
|
|
|
}
|
|
|
|
|
2022-08-17 14:05:25 +08:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
2022-08-17 14:04:55 +08:00
|
|
|
#else
|
|
|
|
|
2022-10-18 09:05:12 +08:00
|
|
|
int enable_pipe_nonblock(int fd UNUSED)
|
2022-08-17 14:04:55 +08:00
|
|
|
{
|
|
|
|
errno = ENOSYS;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|