|
|
|
@ -117,18 +117,6 @@ static inline void close_pair(int fd[2])
@@ -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:
@@ -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:
@@ -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:
@@ -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:
@@ -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:
@@ -553,6 +549,8 @@ fail_pipe:
|
|
|
|
|
} |
|
|
|
|
close(notify_pipe[0]); |
|
|
|
|
|
|
|
|
|
if (null_fd >= 0) |
|
|
|
|
close(null_fd); |
|
|
|
|
argv_array_clear(&argv); |
|
|
|
|
free(childenv); |
|
|
|
|
} |
|
|
|
|