about summary refs log tree commit diff
path: root/src/exec.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/exec.cc')
-rw-r--r--src/exec.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/exec.cc b/src/exec.cc
index fdfb467cca71..d4ee88f8aaf6 100644
--- a/src/exec.cc
+++ b/src/exec.cc
@@ -34,6 +34,9 @@ public:
 };
 
 
+static string pathNullDevice = "/dev/null";
+
+
 /* Run a program. */
 void runProgram(const string & program, 
     const Strings & args, const Environment & env)
@@ -97,6 +100,13 @@ void runProgram(const string & program,
             if (dup2(STDERR_FILENO, STDOUT_FILENO) == -1)
                 throw SysError("cannot dup stderr into stdout");
 
+	    /* Reroute stdin to /dev/null. */
+	    int fdDevNull = open(pathNullDevice.c_str(), O_RDWR);
+	    if (fdDevNull == -1)
+		throw SysError(format("cannot open `%1%'") % pathNullDevice);
+	    if (dup2(fdDevNull, STDIN_FILENO) == -1)
+		throw SysError("cannot dup null device into stdin");
+
             /* Execute the program.  This should not return. */
             execve(program.c_str(), (char * *) argArr, (char * *) envArr);