/** @file
$ Id $
$ Date $
$ Author $
@ copy & copy ; Marc W & auml ; ckerlin
@ license LGPL , see file < a href = " license.html " > COPYING < / a >
$ Log $
Revision 1.5 2004 / 08 / 28 16 : 21 : 25 marc
mrw - c + + - 0.92 ( mrw )
- new file : version . cpp
- new file header for all sources
- work around warning in mrw : : auto < T >
- possibility to compile without log4cxx
- work around bugs in demangle . h and libiberty . h
- corrections in documentation
- added simple tracing mechanism
- more warnings
- small corrections in Auto < > : : Free and a new test for it
- possibility to compile without stack trace
Revision 1.4 2004 / 08 / 25 08 : 35 : 09 marc
change in file header
Revision 1.3 2004 / 08 / 25 08 : 22 : 19 marc
added file 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 ( ) throw ( std : : bad_exception ) : _lastError ( - 1 ) {
_fd [ 0 ] = - 1 ;
_fd [ 1 ] = - 1 ;
if ( : : pipe ( _fd ) = = - 1 )
{
_lastError = errno ;
}
}
/// destructor closes pipe if still open
~ Pipe ( ) throw ( std : : bad_exception ) {
close ( ) ;
}
/// closes pipe if open
void close ( ) throw ( std : : bad_exception ) {
close_in ( ) ;
close_out ( ) ;
}
/// closes input pipe if open
void close_in ( ) throw ( std : : bad_exception ) {
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 ( ) throw ( std : : bad_exception ) {
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 ( ) throw ( ) {
return _lastError = = - 1 ;
}
/** @return last error code, -1 if no error */
int error ( ) throw ( ) {
return _lastError ;
}
/// connect output stream to @c stdout
void connect_cout ( ) throw ( std : : bad_exception ) {
while ( : : dup2 ( _fd [ 1 ] , 1 ) = = - 1 ) if ( errno ! = EINTR ) {
_lastError = errno ;
return ;
}
}
/// connect output stream to @c stderr
void connect_cerr ( ) throw ( std : : bad_exception ) {
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 ( ) throw ( std : : bad_exception ) {
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 ( ) throw ( std : : bad_exception ) {
return _fd [ 1 ] ;
}
} ;
//@}
}
# endif