diff --git a/lib/System/Unix/Program.inc b/lib/System/Unix/Program.inc index d0dade1f8ca..6ff69ca133e 100644 --- a/lib/System/Unix/Program.inc +++ b/lib/System/Unix/Program.inc @@ -84,8 +84,16 @@ Program::FindProgramByName(const std::string& progName) { return Path(); } -static bool RedirectFD(const std::string &File, int FD, std::string* ErrMsg) { - if (File.empty()) return false; // Noop +static bool RedirectIO(const Path *Path, int FD, std::string* ErrMsg) { + if (Path == 0) + // Noop + return false; + std::string File; + if (Path->isEmpty()) + // Redirect empty paths to /dev/null + File = "/dev/null"; + else + File = Path->toString(); // Open the file int InFD = open(File.c_str(), FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666); @@ -162,27 +170,11 @@ Program::ExecuteAndWait(const Path& path, case 0: { // Redirect file descriptors... if (redirects) { - if (redirects[0]) { - if (redirects[0]->isEmpty()) { - if (RedirectFD("/dev/null",0,ErrMsg)) { return -1; } - } else { - if (RedirectFD(redirects[0]->toString(), 0,ErrMsg)) { return -1; } - } - } - if (redirects[1]) { - if (redirects[1]->isEmpty()) { - if (RedirectFD("/dev/null",1,ErrMsg)) { return -1; } - } else { - if (RedirectFD(redirects[1]->toString(),1,ErrMsg)) { return -1; } - } - } + if (RedirectIO(redirects[0], 0, ErrMsg)) { return -1; } + if (RedirectIO(redirects[1], 1, ErrMsg)) { return -1; } if (redirects[1] && redirects[2] && *(redirects[1]) != *(redirects[2])) { - if (redirects[2]->isEmpty()) { - if (RedirectFD("/dev/null",2,ErrMsg)) { return -1; } - } else { - if (RedirectFD(redirects[2]->toString(), 2,ErrMsg)) { return -1; } - } + if (RedirectIO(redirects[2], 2, ErrMsg)) { return -1; } } else if (-1 == dup2(1,2)) { MakeErrMsg(ErrMsg, "Can't redirect"); return -1; diff --git a/lib/System/Win32/Program.inc b/lib/System/Win32/Program.inc index cb002132bfe..52eb9677ffb 100644 --- a/lib/System/Win32/Program.inc +++ b/lib/System/Win32/Program.inc @@ -77,10 +77,12 @@ static HANDLE RedirectIO(const Path *path, int fd, std::string* ErrMsg) { 0, TRUE, DUPLICATE_SAME_ACCESS); return h; } - - const char *fname = path->toString().c_str(); - if (*fname == 0) + + const char *fname; + if (path->isEmpty()) fname = "NUL"; + else + fname = path->toString().c_str(); SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa);