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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52230 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matthijs Kooijman 2008-06-12 10:47:18 +00:00
parent 4c54067f67
commit 905261efed
2 changed files with 18 additions and 24 deletions

View File

@ -84,8 +84,16 @@ Program::FindProgramByName(const std::string& progName) {
return Path(); return Path();
} }
static bool RedirectFD(const std::string &File, int FD, std::string* ErrMsg) { static bool RedirectIO(const Path *Path, int FD, std::string* ErrMsg) {
if (File.empty()) return false; // Noop 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 // Open the file
int InFD = open(File.c_str(), FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666); 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: { case 0: {
// Redirect file descriptors... // Redirect file descriptors...
if (redirects) { if (redirects) {
if (redirects[0]) { if (RedirectIO(redirects[0], 0, ErrMsg)) { return -1; }
if (redirects[0]->isEmpty()) { if (RedirectIO(redirects[1], 1, ErrMsg)) { return -1; }
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 (redirects[1] && redirects[2] && if (redirects[1] && redirects[2] &&
*(redirects[1]) != *(redirects[2])) { *(redirects[1]) != *(redirects[2])) {
if (redirects[2]->isEmpty()) { if (RedirectIO(redirects[2], 2, ErrMsg)) { return -1; }
if (RedirectFD("/dev/null",2,ErrMsg)) { return -1; }
} else {
if (RedirectFD(redirects[2]->toString(), 2,ErrMsg)) { return -1; }
}
} else if (-1 == dup2(1,2)) { } else if (-1 == dup2(1,2)) {
MakeErrMsg(ErrMsg, "Can't redirect"); MakeErrMsg(ErrMsg, "Can't redirect");
return -1; return -1;

View File

@ -77,10 +77,12 @@ static HANDLE RedirectIO(const Path *path, int fd, std::string* ErrMsg) {
0, TRUE, DUPLICATE_SAME_ACCESS); 0, TRUE, DUPLICATE_SAME_ACCESS);
return h; return h;
} }
const char *fname = path->toString().c_str(); const char *fname;
if (*fname == 0) if (path->isEmpty())
fname = "NUL"; fname = "NUL";
else
fname = path->toString().c_str();
SECURITY_ATTRIBUTES sa; SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa); sa.nLength = sizeof(sa);