From 834f0df3850c2b115e2febbf5b6bdafbe88651e2 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 11 Nov 2016 11:33:21 +0300 Subject: Add fdopen_pipe() --- butl/fdstream.cxx | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'butl/fdstream.cxx') diff --git a/butl/fdstream.cxx b/butl/fdstream.cxx index 16801ed..6ebfaf2 100644 --- a/butl/fdstream.cxx +++ b/butl/fdstream.cxx @@ -6,14 +6,14 @@ #ifndef _WIN32 # include // open(), O_*, fcntl() -# include // close(), read(), write(), lseek(), dup(), ssize_t, - // STD*_FILENO +# include // close(), read(), write(), lseek(), dup(), pipe(), + // ssize_t, STD*_FILENO # include // writev(), iovec # include // S_I* # include // off_t #else # include // _close(), _read(), _write(), _setmode(), _sopen(), - // _lseek(), _dup() + // _lseek(), _dup(), _pipe() # include // _SH_DENYNO # include // _fileno(), stdin, stdout, stderr # include // _O_* @@ -816,6 +816,18 @@ namespace butl return fdmode (STDERR_FILENO, m); } + fdpipe + fdopen_pipe (fdopen_mode m) + { + assert (m == fdopen_mode::none || m == fdopen_mode::binary); + + int pd[2]; + if (pipe (pd) == -1) + throw_ios_failure (errno); + + return {auto_fd (pd[0]), auto_fd (pd[1])}; + } + #else bool @@ -914,5 +926,19 @@ namespace butl return fdmode (fd, m); } + fdpipe + fdopen_pipe (fdopen_mode m) + { + assert (m == fdopen_mode::none || m == fdopen_mode::binary); + + int pd[2]; + if (_pipe ( + pd, + 64 * 1024, // Set buffer size to 64K. + _O_NOINHERIT | (m == fdopen_mode::none ? _O_TEXT : _O_BINARY)) == -1) + throw_ios_failure (errno); + + return {auto_fd (pd[0]), auto_fd (pd[1])}; + } #endif } -- cgit v1.1