NtQueryInformationFile hangs if it's called on the read side handle of
a pipe while another thread or process is performing a blocking read.
Avoid select potentially hanging by calling NtQueryInformationFile
only on the write side of the pipe and using PeekNamedPipe otherwise.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
static int
pipe_data_available (int fd, fhandler_base *fh, HANDLE h, bool writing)
{
+ if (fh->get_device () == FH_PIPER)
+ {
+ DWORD nbytes_in_pipe;
+ if (!writing && PeekNamedPipe (h, NULL, 0, NULL, &nbytes_in_pipe, NULL))
+ return nbytes_in_pipe > 0;
+ return -1;
+ }
+
IO_STATUS_BLOCK iosb = {{0}, 0};
FILE_PIPE_LOCAL_INFORMATION fpli = {0};
NTSTATUS status;