Add functions to support console redirection
authorMikko Rasa <tdb@tdb.fi>
Wed, 30 May 2012 19:00:56 +0000 (19:00 +0000)
committerMikko Rasa <tdb@tdb.fi>
Wed, 30 May 2012 19:00:56 +0000 (19:00 +0000)
source/io/base.cpp
source/io/base.h
source/io/console.cpp
source/io/console.h

index bf4c82018dc60d9a6d4ddd18be350468f9a4c0a0..052d464becb6f793cb774c32e38c4fa40e686721 100644 (file)
@@ -57,5 +57,10 @@ void Base::set_eof()
        }
 }
 
+const Handle &Base::get_handle(Mode)
+{
+       throw logic_error("Base::get_handle");
+}
+
 } // namespace IO
 } // namespace Msp
index 61819cfe8144c782dae9e8749d971c3f336aa641..3d862169177f1711c6a9d3820e4fb3f97a6b94ca 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_IO_BASE_H_
 
 #include <sigc++/sigc++.h>
+#include "handle.h"
 #include "mode.h"
 #include "poll.h"
 
@@ -88,6 +89,10 @@ protected:
 public:
        /** Returns the end-of-file flag. */
        bool eof() const { return eof_flag; }
+
+       /** Returns the system-level handle for the object.  Used by Console to
+       perform redirections. */
+       virtual const Handle &get_handle(Mode);
 };
 
 } // namespace IO
index d06b894e10dda771f11773999b18e8ee92c2d204..259f80fbdf5ca21802099d9108c779f1bb9c0f53 100644 (file)
@@ -1,5 +1,6 @@
 #ifndef WIN32
 #include <errno.h>
+#include <unistd.h>
 #include <fcntl.h>
 #include <termios.h>
 #include <sys/ioctl.h>
@@ -125,6 +126,16 @@ void Console::get_size(unsigned &rows, unsigned &cols)
 #endif
 }
 
+void Console::redirect(Base &other)
+{
+       Handle other_handle = other.get_handle(mode&M_RDWR);
+#ifdef WIN32
+       SetStdHandle(stream_to_sys(stream), *other_handle);
+#else
+       dup2(*other_handle, *handle);
+#endif
+}
+
 unsigned Console::do_write(const char *buf, unsigned len)
 {
        check_access(M_WRITE);
index 5b4158fc90b533a96d7399da08d41d45b7887b30..d29ef003998c005c32d83305003e0b83377a8dd4 100644 (file)
@@ -46,6 +46,11 @@ public:
        Console. */
        void get_size(unsigned &rows, unsigned &cols);
 
+       /** Redirects input from or output to another I/O object.  This performs a
+       system-level redirect.  Closing the other object won't affect the
+       redirection. */
+       void redirect(Base &);
+
 protected:
        virtual unsigned do_write(const char *, unsigned);
        virtual unsigned do_read(char *, unsigned);