summaryrefslogtreecommitdiff
path: root/run-command.c
diff options
context:
space:
mode:
Diffstat (limited to 'run-command.c')
-rw-r--r--run-command.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/run-command.c b/run-command.c
index 15e2e74..b3a35dd 100644
--- a/run-command.c
+++ b/run-command.c
@@ -117,18 +117,6 @@ static inline void close_pair(int fd[2])
close(fd[1]);
}
-#ifndef GIT_WINDOWS_NATIVE
-static inline void dup_devnull(int to)
-{
- int fd = open("/dev/null", O_RDWR);
- if (fd < 0)
- die_errno(_("open /dev/null failed"));
- if (dup2(fd, to) < 0)
- die_errno(_("dup2(%d,%d) failed"), fd, to);
- close(fd);
-}
-#endif
-
static char *locate_in_PATH(const char *file)
{
const char *p = getenv("PATH");
@@ -444,12 +432,20 @@ fail_pipe:
#ifndef GIT_WINDOWS_NATIVE
{
int notify_pipe[2];
+ int null_fd = -1;
char **childenv;
struct argv_array argv = ARGV_ARRAY_INIT;
if (pipe(notify_pipe))
notify_pipe[0] = notify_pipe[1] = -1;
+ if (cmd->no_stdin || cmd->no_stdout || cmd->no_stderr) {
+ null_fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ if (null_fd < 0)
+ die_errno(_("open /dev/null failed"));
+ set_cloexec(null_fd);
+ }
+
prepare_cmd(&argv, cmd);
childenv = prep_childenv(cmd->env);
@@ -473,7 +469,7 @@ fail_pipe:
atexit(notify_parent);
if (cmd->no_stdin)
- dup_devnull(0);
+ dup2(null_fd, 0);
else if (need_in) {
dup2(fdin[0], 0);
close_pair(fdin);
@@ -483,7 +479,7 @@ fail_pipe:
}
if (cmd->no_stderr)
- dup_devnull(2);
+ dup2(null_fd, 2);
else if (need_err) {
dup2(fderr[1], 2);
close_pair(fderr);
@@ -493,7 +489,7 @@ fail_pipe:
}
if (cmd->no_stdout)
- dup_devnull(1);
+ dup2(null_fd, 1);
else if (cmd->stdout_to_stderr)
dup2(2, 1);
else if (need_out) {
@@ -553,6 +549,8 @@ fail_pipe:
}
close(notify_pipe[0]);
+ if (null_fd >= 0)
+ close(null_fd);
argv_array_clear(&argv);
free(childenv);
}