#include #include #include #include using std::list; using std::pair; using std::make_pair; static list > redirs; void Redirect(int fd, const char *fn, int mode) { int d = dup(fd); int f = open(fn, mode, 0644); dup2(f, fd); redirs.push_front(make_pair(fd, d)); } void RedirectOut(int fd, const char *fn) { Redirect(fd, fn, O_WRONLY | O_CREAT | O_TRUNC); } void RedirectIn(int fd, const char *fn) { Redirect(fd, fn, O_RDONLY); } void Redirect(int fd, const char *fn) { Redirect(fd, fn, O_RDWR | O_CREAT | O_APPEND); } void Unredirect(int fd) { list >::iterator i; for(i=redirs.begin(); i!=redirs.end(); ++i) if(i->first == fd) { dup2(i->second, fd); close(i->second); redirs.erase(i); return; } }