summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_fifo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_fifo.cc')
-rw-r--r--winsup/cygwin/fhandler_fifo.cc26
1 files changed, 22 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc
index 00b8f2a50..137e4a7ac 100644
--- a/winsup/cygwin/fhandler_fifo.cc
+++ b/winsup/cygwin/fhandler_fifo.cc
@@ -86,13 +86,26 @@ fhandler_fifo::open (int flags, mode_t)
LPSECURITY_ATTRIBUTES sa_buf =
sec_user ((PSECURITY_ATTRIBUTES) char_sa_buf, cygheap->user.sid());
mode |= FILE_FLAG_OVERLAPPED;
- HANDLE h = CreateNamedPipe(npname, mode, FIFO_PIPE_MODE,
- PIPE_UNLIMITED_INSTANCES, 0, 0,
- NMPWAIT_WAIT_FOREVER, sa_buf);
+
+ HANDLE h;
+ DWORD err;
+ bool nonblocking_write = !!((flags & (O_WRONLY | O_NONBLOCK)) == (O_WRONLY | O_NONBLOCK));
+ if (nonblocking_write)
+ {
+ h = INVALID_HANDLE_VALUE;
+ err = ERROR_ACCESS_DENIED;
+ }
+ else
+ {
+ h = CreateNamedPipe(npname, mode, FIFO_PIPE_MODE,
+ PIPE_UNLIMITED_INSTANCES, 0, 0,
+ NMPWAIT_WAIT_FOREVER, sa_buf);
+ err = GetLastError ();
+ }
if (h != INVALID_HANDLE_VALUE)
wait_state = fifo_wait_for_client;
else
- switch (GetLastError ())
+ switch (err)
{
case ERROR_ACCESS_DENIED:
h = open_nonserver (npname, low_flags, sa_buf);
@@ -101,6 +114,11 @@ fhandler_fifo::open (int flags, mode_t)
wait_state = fifo_wait_for_server;
break;
}
+ if (nonblocking_write && GetLastError () == ERROR_FILE_NOT_FOUND)
+ {
+ set_errno (ENXIO);
+ break;
+ }
/* fall through intentionally */
default:
__seterrno ();