diff --git a/mrw/unistd.hpp b/mrw/unistd.hpp index ca08b57..404d85f 100644 --- a/mrw/unistd.hpp +++ b/mrw/unistd.hpp @@ -9,6 +9,10 @@ @license LGPL, see file COPYING $Log$ + Revision 1.6 2004/12/14 20:32:10 marc + support for connect_cin + pipe is now non blocking by default + Revision 1.5 2004/08/28 16:21:25 marc mrw-c++-0.92 (mrw) - new file: version.cpp @@ -33,6 +37,7 @@ #define __MRW_UNISTD_HPP__ #include // pipe, close +#include // fcntl (O_NONBLOCK) #include // errno namespace mrw { @@ -51,13 +56,22 @@ namespace mrw { int _lastError; public: /// creates a unix pipe - Pipe() throw(std::bad_exception): _lastError(-1) { + /** @param blocking Flag whether the pipe is blocking (default: no) */ + Pipe(bool blocking=false) throw(std::bad_exception): _lastError(-1) { _fd[0] = -1; _fd[1] = -1; - if (::pipe(_fd)==-1) - { + if (::pipe(_fd)==-1) { + _lastError=errno; + return; + } + if (!blocking) { + int val(fcntl(_fd[0], F_GETFL, 0)); + if (fcntl(_fd[0], F_SETFL, (val!=-1?val:0)|O_NONBLOCK) == -1) _lastError=errno; - } + val = fcntl(_fd[1], F_GETFL, 0); + if (fcntl(_fd[1], F_SETFL, (val!=-1?val:0)|O_NONBLOCK) == -1) + _lastError=errno; + } } /// destructor closes pipe if still open ~Pipe() throw(std::bad_exception) { @@ -92,6 +106,13 @@ namespace mrw { int error() throw() { return _lastError; } + /// connect input stream to @c stdin + void connect_cin() throw(std::bad_exception) { + while (::dup2(_fd[0], 0)==-1) if (errno!=EINTR) { + _lastError = errno; + return; + } + } /// connect output stream to @c stdout void connect_cout() throw(std::bad_exception) { while (::dup2(_fd[1], 1)==-1) if (errno!=EINTR) {