diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 1289122ae..dc58acc2b 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1276,7 +1276,7 @@ class fhandler_fifo: public fhandler_base bool __reg2 wait (HANDLE); NTSTATUS npfs_handle (HANDLE &); HANDLE create_pipe_instance (bool); - NTSTATUS open_pipe (); + NTSTATUS open_pipe (HANDLE&); int add_client_handler (); void delete_client_handler (int); bool listen_client (); diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index 1a1610998..4d05727cb 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -194,9 +194,9 @@ fhandler_fifo::create_pipe_instance (bool first) return ph; } -/* Called when a FIFO is opened for writing. */ +/* Connect to a pipe instance. */ NTSTATUS -fhandler_fifo::open_pipe () +fhandler_fifo::open_pipe (HANDLE& ph) { NTSTATUS status; HANDLE npfsh; @@ -204,7 +204,6 @@ fhandler_fifo::open_pipe () OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK io; ULONG sharing; - HANDLE ph = NULL; status = npfs_handle (npfsh); if (!NT_SUCCESS (status)) @@ -214,8 +213,6 @@ fhandler_fifo::open_pipe () npfsh, NULL); sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; status = NtOpenFile (&ph, access, &attr, &io, sharing, 0); - if (NT_SUCCESS (status)) - set_handle (ph); return status; } @@ -472,16 +469,19 @@ fhandler_fifo::open (int flags, mode_t) /* If we're a duplexer, create the pipe and the first client handler. */ if (duplexer) { + HANDLE ph = NULL; + if (add_client_handler () < 0) { res = error_errno_set; goto out; } - NTSTATUS status = open_pipe (); + NTSTATUS status = open_pipe (ph); if (NT_SUCCESS (status)) { record_connection (fc_handler[0]); - set_pipe_non_blocking (get_handle (), flags & O_NONBLOCK); + set_handle (ph); + set_pipe_non_blocking (ph, flags & O_NONBLOCK); } else { @@ -525,7 +525,7 @@ fhandler_fifo::open (int flags, mode_t) res = error_errno_set; goto out; } - NTSTATUS status = open_pipe (); + NTSTATUS status = open_pipe (get_handle ()); if (NT_SUCCESS (status)) { set_pipe_non_blocking (get_handle (), flags & O_NONBLOCK);