WvStreams
wvsystem.cc
00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * A more convenient wrapper around WvSubProc.  See wvsystem.h.
00006  */
00007 #include "wvsystem.h"
00008 #include <unistd.h>
00009 #include <fcntl.h>
00010 #include <sys/types.h>
00011 
00012 WvSystem::~WvSystem()
00013 {
00014     go();
00015 }
00016 
00017 
00018 void WvSystem::init(const char * const *argv)
00019 {
00020     started = false;
00021     WvSubProc::preparev(argv[0], argv);
00022 }
00023 
00024 
00025 // open a given filename or device, making sure it has the given fd.  If
00026 // there is an open file on that fd already, it gets closed.
00027 static void fd_open(int fd, WvStringParm file, int mode)
00028 {
00029     ::close(fd);
00030     int nfd = ::open(file, mode, 0666);
00031     if (nfd < 0)
00032         return;
00033     if (nfd != fd)
00034     {
00035         ::dup2(nfd, fd);
00036         ::close(nfd);
00037     }
00038 }
00039 
00040 
00041 // overrides WvSubProc::fork().
00042 int WvSystem::fork(int *waitfd)
00043 {
00044     int pid = WvSubProc::fork(waitfd);
00045     if (!pid) // child
00046     {
00047         if (!fdfiles[0].isnull())
00048             fd_open(0, fdfiles[0], O_RDONLY);
00049         if (!fdfiles[1].isnull())
00050             fd_open(1, fdfiles[1], O_WRONLY|O_CREAT);
00051         if (!fdfiles[2].isnull())
00052             fd_open(2, fdfiles[2], O_WRONLY|O_CREAT);
00053     }
00054     
00055     return pid;
00056 }
00057 
00058 
00059 int WvSystem::go()
00060 {
00061     if (!started)
00062     {
00063         WvSubProc::start_again();
00064         started = true;
00065     }
00066     WvSubProc::wait(-1, false);
00067     return WvSubProc::estatus;
00068 }
00069 
00070 
00071 WvSystem &WvSystem::infile(WvStringParm filename)
00072 {
00073     fdfiles[0] = filename;
00074     return *this;
00075 }
00076 
00077 
00078 WvSystem &WvSystem::outfile(WvStringParm filename)
00079 {
00080     fdfiles[1] = filename;
00081     return *this;
00082 }
00083 
00084 
00085 WvSystem &WvSystem::errfile(WvStringParm filename)
00086 {
00087     fdfiles[2] = filename;
00088     return *this;
00089 }
00090 
00091