/** @file
$ Log $
Revision 1.3 2004 / 08 / 25 08 : 22 : 19 marc
added file header
@ copy & copy ; Copyright 2004 , $ Date $ $ Author $
@ author $ Author $
@ date $ Date $
@ version $ Header $
*/
# ifndef __MRW_UNISTD_HPP__
# define __MRW_UNISTD_HPP__
# include <unistd.h> // pipe, close
# include <errno.h> // errno
namespace mrw {
/** @addtogroup AutoTools */
//@{
/** @brief class that implements an unnamed UNIX pipe
@ pre # include < mrw / unistd . hpp >
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