From f2d854e34bb91ca7cf5a1d7befb48d4b21285498 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Thu, 12 Jun 2008 10:47:18 +0000 Subject: [PATCH] Make I/O redirection handling in sys::Program a bit more consistent. No functional changes. Win32 code is untested, but should work fine. In the unix variant, rename RedirectFD to RedirectIO and let that function handle empty and null paths instead of doing that in the caller 3 times. This is the same as win32 already does it. In the win32 variant, use Path::isEmpty() instead of checking the resulting c_str() manually. This is the same as unix already does it. llvm-svn: 52230 --- lib/System/Unix/Program.inc | 34 +++++++++++++--------------------- lib/System/Win32/Program.inc | 8 +++++--- 2 files changed, 18 insertions(+), 24 deletions(-) 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);