diff options
| -rw-r--r-- | llvm/lib/System/Unix/Program.inc | 34 | ||||
| -rw-r--r-- | llvm/lib/System/Win32/Program.inc | 8 | 
2 files changed, 18 insertions, 24 deletions
diff --git a/llvm/lib/System/Unix/Program.inc b/llvm/lib/System/Unix/Program.inc index d0dade1f8ca..6ff69ca133e 100644 --- a/llvm/lib/System/Unix/Program.inc +++ b/llvm/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/llvm/lib/System/Win32/Program.inc b/llvm/lib/System/Win32/Program.inc index cb002132bfe..52eb9677ffb 100644 --- a/llvm/lib/System/Win32/Program.inc +++ b/llvm/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);  | 

