#include <fcntl.h>
#include "binary-io.h"
-#include "nonblocking.h"
+#include "verify.h"
+
+#if GNULIB_defined_O_NONBLOCK
+# include "nonblocking.h"
+#endif
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
/* Native Woe32 API. */
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
/* Native Woe32 API. */
+ if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0)
+ return -1;
+
+ /* O_NONBLOCK handling.
+ On native Windows platforms, O_NONBLOCK is defined by gnulib. Use the
+ functions defined by the gnulib module 'nonblocking'. */
+# if GNULIB_defined_O_NONBLOCK
if (flags & O_NONBLOCK)
{
- int result = _pipe (fd, 4096, flags & ~O_NONBLOCK);
- if (result != 0)
- return result;
if (set_nonblocking_flag (fd[0], true) != 0
|| set_nonblocking_flag (fd[1], true) != 0)
- {
- int saved_errno = errno;
- close (fd[0]);
- close (fd[1]);
- result = -1;
- errno = saved_errno;
- }
- return result;
+ goto fail;
}
- return _pipe (fd, 4096, flags);
+# else
+ verify (O_NONBLOCK == 0);
+# endif
+
+ return 0;
#else
/* Unix API. */
says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on
both fd[0] and fd[1]. */
+ /* O_NONBLOCK handling.
+ On Unix platforms, O_NONBLOCK is defined by the system. Use fcntl(). */
if (flags & O_NONBLOCK)
{
int fcntl_flags;
return 0;
+#endif
+
fail:
{
int saved_errno = errno;
errno = saved_errno;
return -1;
}
-
-#endif
}