summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthijs Kooijman <matthijs@stdin.nl>2008-06-12 10:47:18 +0000
committerMatthijs Kooijman <matthijs@stdin.nl>2008-06-12 10:47:18 +0000
commit905261efed461e2b9dd505a2569f7f9315906c71 (patch)
tree525dc9b463bb7e575ca76ff4ce844a004162f658
parent4c54067f67a13999c301a484fda215b9a15a7281 (diff)
downloadllvm-905261efed461e2b9dd505a2569f7f9315906c71.tar.gz
llvm-905261efed461e2b9dd505a2569f7f9315906c71.tar.bz2
llvm-905261efed461e2b9dd505a2569f7f9315906c71.tar.xz
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
-rw-r--r--lib/System/Unix/Program.inc34
-rw-r--r--lib/System/Win32/Program.inc8
2 files changed, 18 insertions, 24 deletions
diff --git a/lib/System/Unix/Program.inc b/lib/System/Unix/Program.inc
index d0dade1f8c..6ff69ca133 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 cb002132bf..52eb9677ff 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);