support for connect_cin
pipe is now non blocking by default
This commit is contained in:
		@@ -9,6 +9,10 @@
 | 
				
			|||||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
					    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $Log$
 | 
					    $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
 | 
					    Revision 1.5  2004/08/28 16:21:25  marc
 | 
				
			||||||
    mrw-c++-0.92 (mrw)
 | 
					    mrw-c++-0.92 (mrw)
 | 
				
			||||||
    - new file: version.cpp
 | 
					    - new file: version.cpp
 | 
				
			||||||
@@ -33,6 +37,7 @@
 | 
				
			|||||||
#define __MRW_UNISTD_HPP__
 | 
					#define __MRW_UNISTD_HPP__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <unistd.h> // pipe, close
 | 
					#include <unistd.h> // pipe, close
 | 
				
			||||||
 | 
					#include <fcntl.h> // fcntl (O_NONBLOCK)
 | 
				
			||||||
#include <errno.h> // errno
 | 
					#include <errno.h> // errno
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace mrw {
 | 
					namespace mrw {
 | 
				
			||||||
@@ -51,13 +56,22 @@ namespace mrw {
 | 
				
			|||||||
    int _lastError;
 | 
					    int _lastError;
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    /// creates a unix pipe
 | 
					    /// 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[0] = -1;
 | 
				
			||||||
      _fd[1] = -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;
 | 
					          _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
 | 
					    /// destructor closes pipe if still open
 | 
				
			||||||
    ~Pipe() throw(std::bad_exception) {
 | 
					    ~Pipe() throw(std::bad_exception) {
 | 
				
			||||||
@@ -92,6 +106,13 @@ namespace mrw {
 | 
				
			|||||||
    int error() throw() {
 | 
					    int error() throw() {
 | 
				
			||||||
      return _lastError;
 | 
					      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
 | 
					    /// connect output stream to @c stdout
 | 
				
			||||||
    void connect_cout() throw(std::bad_exception) {
 | 
					    void connect_cout() throw(std::bad_exception) {
 | 
				
			||||||
      while (::dup2(_fd[1], 1)==-1) if (errno!=EINTR) {
 | 
					      while (::dup2(_fd[1], 1)==-1) if (errno!=EINTR) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user