X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fpipe2.c;h=18098c4b4ec93e8e624216dff2ba983709a7eaf7;hb=4fe68d4176b4f0da64660bb9ce0f5412a6bb24de;hp=4fa014f82b43b5b701c972ac58c9a5af764ed8cc;hpb=d60f3b0c6b0f93a601acd1cfd3923f94ca05abb0;p=gnulib.git diff --git a/lib/pipe2.c b/lib/pipe2.c index 4fa014f82..18098c4b4 100644 --- a/lib/pipe2.c +++ b/lib/pipe2.c @@ -24,6 +24,7 @@ #include #include "binary-io.h" +#include "nonblocking.h" #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Native Woe32 API. */ @@ -55,34 +56,37 @@ pipe2 (int fd[2], int flags) } #endif -#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -/* Native Woe32 API. */ - /* Check the supported flags. */ - if ((flags & ~(O_CLOEXEC | O_BINARY | O_TEXT)) != 0) + if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_BINARY | O_TEXT)) != 0) { errno = EINVAL; return -1; } - return _pipe (fd, 4096, flags); +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Native Woe32 API. */ -#else -/* Unix API. */ + if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0) + return -1; - /* Check the supported flags. */ - if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_TEXT | O_BINARY)) != 0) + if (flags & O_NONBLOCK) { - errno = EINVAL; - return -1; + if (set_nonblocking_flag (fd[0], true) != 0 + || set_nonblocking_flag (fd[1], true) != 0) + goto fail; } + return 0; + +#else +/* Unix API. */ + if (pipe (fd) < 0) return -1; /* POSIX says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on - both fd[0] amd fd[1]. */ + both fd[0] and fd[1]. */ if (flags & O_NONBLOCK) { @@ -121,6 +125,8 @@ pipe2 (int fd[2], int flags) return 0; +#endif + fail: { int saved_errno = errno; @@ -129,6 +135,4 @@ pipe2 (int fd[2], int flags) errno = saved_errno; return -1; } - -#endif }