00001
00002
00003
00004
00005
00006
00007 #include "wvfdstream.h"
00008 #include "wvmoniker.h"
00009 #include "wvlinkerhack.h"
00010
00011 WV_LINK(WvConStream);
00012
00013
00014 class _WvConStream : public WvFDStream
00015 {
00016 public:
00017 bool isopen;
00018
00019 _WvConStream(int _rfd, int _wfd);
00020 virtual ~_WvConStream();
00021 virtual void close();
00022 virtual bool isok() const;
00023 };
00024
00025
00026 static IWvStream *create_stdin(WvStringParm s)
00027 {
00028 return new _WvConStream(0, -1);
00029 }
00030 static IWvStream *create_stdout(WvStringParm s)
00031 {
00032 return new _WvConStream(-1, 1);
00033 }
00034 static IWvStream *create_stderr(WvStringParm s)
00035 {
00036 return new _WvConStream(-1, 2);
00037 }
00038 static IWvStream *create_stdio(WvStringParm s)
00039 {
00040 return new _WvConStream(0, 1);
00041 }
00042
00043 static WvMoniker<IWvStream> reg0("stdin", create_stdin);
00044 static WvMoniker<IWvStream> reg1("stdout", create_stdout);
00045 static WvMoniker<IWvStream> reg2("stderr", create_stderr);
00046 static WvMoniker<IWvStream> reg3("stdio", create_stdio);
00047
00048
00049
00050 _WvConStream::_WvConStream(int _rfd, int _wfd) : WvFDStream(_rfd, _wfd)
00051 {
00052 isopen = true;
00053 }
00054
00055
00056 _WvConStream::~_WvConStream()
00057 {
00058 close();
00059 }
00060
00061
00062 void _WvConStream::close()
00063 {
00064 isopen = false;
00065 setfd(-1);
00066 WvFDStream::close();
00067 }
00068
00069
00070 bool _WvConStream::isok() const
00071 {
00072 return isopen;
00073 }
00074
00075
00076
00077 #ifdef _WIN32
00078
00079 #include "streams.h"
00080 SocketFromFDMaker _zero(_dup(0), fd2socket_fwd, false);
00081 SocketFromFDMaker _one(1, socket2fd_fwd, true);
00082 SocketFromFDMaker _two(2, socket2fd_fwd, true);
00083
00084 static _WvConStream _wvcon(_zero.GetSocket(), _one.GetSocket());
00085 static _WvConStream _wvin(_zero.GetSocket(), -1);
00086 static _WvConStream _wvout(-1, _one.GetSocket());
00087 static _WvConStream _wverr(-1, _two.GetSocket());
00088
00089 #else // _WIN32
00090
00091 static _WvConStream _wvcon(0, 1);
00092 static _WvConStream _wvin(0, -1);
00093 static _WvConStream _wvout(-1, 1);
00094 static _WvConStream _wverr(-1, 2);
00095
00096 #endif // !_WIN32
00097
00098 WvStream *wvcon = &_wvcon;
00099 WvStream *wvin = &_wvin;
00100 WvStream *wvout = &_wvout;
00101 WvStream *wverr = &_wverr;
00102