Re: [PATCH v2] pipe_command(): mark stdin descriptor as non-blocking
- From
René Scharfe <l.s.r@web.de>
- Date
- Aug 7, 2022, 10:14 UTC
- Message-ID
- <362560ca-1e37-bab3-e508-4d5bf5429e66@web.de>
- In-Reply-To
- <Yu05GjncDaGRTgce@coredump.intra.peff.net>
Am 05.08.2022 um 17:36 schrieb Jeff King:
Show 20 quoted lines
> On Wed, Aug 03, 2022 at 11:56:13PM +0200, René Scharfe wrote:
> >> int enable_nonblock(int fd)
>> {
>> + DWORD mode;
>> + HANDLE handle = winansi_get_osfhandle(fd);
>> + if (!handle)
>> + return -1;
>> + if (!GetNamedPipeHandleState(handle, &mode, NULL, NULL, NULL, NULL, 0))
>> + return -1;
>> + if (mode & PIPE_NOWAIT)
>> + return 0;
>> + mode |= PIPE_NOWAIT;
>> + if (!SetNamedPipeHandleState(handle, &mode, NULL, NULL))
>> + return -1;
>> return 0;
>> }
>
> This looks plausibly correct to me. ;) We might want to change the name
> of the compat layer to enable_pipe_nonblock(), since one assumes from
> the function names this only works for pipes.Or how about this? Squashable. Needs testing.
--- >8 --- Subject: [PATCH] nonblock: support Windows
Implement enable_nonblock() using the Windows API. Supports only named and anonymous pipes for now, which suffices for the current caller.
Signed-off-by: René Scharfe <l.s.r@web.de> --- compat/nonblock.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
diff --git a/compat/nonblock.c b/compat/nonblock.c index 897c099010..78923cd2c3 100644 --- a/compat/nonblock.c +++ b/compat/nonblock.c @@ -14,9 +14,40 @@ int enable_nonblock(int fd) #else +#ifdef GIT_WINDOWS_NATIVE + +#include "win32.h" + +int enable_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_nonblock(int fd) { return 0; } #endif + +#endif -- 2.37.1.windows.1