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:

committed by
Junio C Hamano

parent
ae25394b4c
commit
db015a284e
@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user