run-command: don't die in child when duping /dev/null

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Brandon Williams
2017-04-19 16:13:23 -07:00
committed by Junio C Hamano
parent ae25394b4c
commit db015a284e

View File

@ -117,18 +117,6 @@ static inline void close_pair(int fd[2])
close(fd[1]); 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) static char *locate_in_PATH(const char *file)
{ {
const char *p = getenv("PATH"); const char *p = getenv("PATH");
@ -444,12 +432,20 @@ fail_pipe:
#ifndef GIT_WINDOWS_NATIVE #ifndef GIT_WINDOWS_NATIVE
{ {
int notify_pipe[2]; int notify_pipe[2];
int null_fd = -1;
char **childenv; char **childenv;
struct argv_array argv = ARGV_ARRAY_INIT; struct argv_array argv = ARGV_ARRAY_INIT;
if (pipe(notify_pipe)) if (pipe(notify_pipe))
notify_pipe[0] = notify_pipe[1] = -1; 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); prepare_cmd(&argv, cmd);
childenv = prep_childenv(cmd->env); childenv = prep_childenv(cmd->env);
@ -473,7 +469,7 @@ fail_pipe:
atexit(notify_parent); atexit(notify_parent);
if (cmd->no_stdin) if (cmd->no_stdin)
dup_devnull(0); dup2(null_fd, 0);
else if (need_in) { else if (need_in) {
dup2(fdin[0], 0); dup2(fdin[0], 0);
close_pair(fdin); close_pair(fdin);
@ -483,7 +479,7 @@ fail_pipe:
} }
if (cmd->no_stderr) if (cmd->no_stderr)
dup_devnull(2); dup2(null_fd, 2);
else if (need_err) { else if (need_err) {
dup2(fderr[1], 2); dup2(fderr[1], 2);
close_pair(fderr); close_pair(fderr);
@ -493,7 +489,7 @@ fail_pipe:
} }
if (cmd->no_stdout) if (cmd->no_stdout)
dup_devnull(1); dup2(null_fd, 1);
else if (cmd->stdout_to_stderr) else if (cmd->stdout_to_stderr)
dup2(2, 1); dup2(2, 1);
else if (need_out) { else if (need_out) {
@ -553,6 +549,8 @@ fail_pipe:
} }
close(notify_pipe[0]); close(notify_pipe[0]);
if (null_fd >= 0)
close(null_fd);
argv_array_clear(&argv); argv_array_clear(&argv);
free(childenv); free(childenv);
} }