diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 0df25aa40..f5ed61cc4 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1294,6 +1294,7 @@ public: int open (int, mode_t); off_t lseek (off_t offset, int whence); int close (); + int fcntl (int cmd, intptr_t); int dup (fhandler_base *child, int); bool isfifo () const { return true; } void set_close_on_exec (bool val); diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index ac2196c92..a1e395bf6 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -891,6 +891,22 @@ fhandler_fifo::close () return fhandler_base::close () || ret; } +/* If we're a writer, keep the nonblocking state of the windows pipe + in sync with our nonblocking state. */ +int +fhandler_fifo::fcntl (int cmd, intptr_t arg) +{ + if (cmd != F_SETFL || !writer) + return fhandler_base::fcntl (cmd, arg); + + const bool was_nonblocking = is_nonblocking (); + int res = fhandler_base::fcntl (cmd, arg); + const bool now_nonblocking = is_nonblocking (); + if (now_nonblocking != was_nonblocking) + set_pipe_non_blocking (get_handle (), now_nonblocking); + return res; +} + int fhandler_fifo::dup (fhandler_base *child, int flags) {