#ifndef __MRW_UNISTD_HPP__ #define __MRW_UNISTD_HPP__ #include // pipe, close #include // errno namespace mrw { /** @addtogroup AutoTools */ //@{ /// class that implements an unnamed UNIX pipe /** Implements a UNIX pipe that is automatically closed in destructor and offers some facilities. */ class pipe { private: /// the filedescriptor, [0] to read and [1] to write int _fd[2]; int _lastError; public: /// creates a unix pipe pipe(): _lastError(-1) { _fd[0] = -1; _fd[1] = -1; if (::pipe(_fd)==-1) { _lastError=errno; } } /// destructor closes pipe if still open ~pipe() { close(); } /// closes pipe if open void close() { close_in(); close_out(); } /// closes input pipe if open void close_in() { if (_fd[0]!=-1) while (::close(_fd[0])==-1) if (errno!=EINTR) { _lastError = errno; break; } _fd[0] = -1; } /// closes output pipe if open void close_out() { if (_fd[1]!=-1) while (::close(_fd[1])==-1) if (errno!=EINTR) { _lastError = errno; break; } _fd[1] = -1; } /// @return true if no error occured operator bool() { return _lastError == -1; } /// @return last error code, -1 if no error int error() { return _lastError; } /// connect output stream to @c stdout void connect_cout() { while (::dup2(_fd[1], 1)==-1) if (errno!=EINTR) { _lastError = errno; return; } } /// connect output stream to @c stderr void connect_cerr() { while (::dup2(_fd[1], 2)==-1) if (errno!=EINTR) { _lastError = errno; return; } } /// get an input stream /** @return stream to read from @note invalid after destruction or @c close or @c close_in */ int istream() { return _fd[0]; } /// get an output stream /** @return stream to write to @note invalid after destruction or @c close or @c close_out */ int ostream() { return _fd[1]; } }; //@} } #endif