X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=run-command.c;h=61908682b9b251ac49ae655522a3143476a888ea;hb=501524e938aee0b9691fe7fb1abf5eb17a23132f;hp=5787a5095548c6530a4d987705a3189ed57356c4;hpb=3f81fc82743ccd4fd7157f1f1db41605eb018fb9;p=git.git diff --git a/run-command.c b/run-command.c index 5787a5095..61908682b 100644 --- a/run-command.c +++ b/run-command.c @@ -1,28 +1,39 @@ #include "cache.h" #include "run-command.h" #include +#include "exec_cmd.h" -int run_command_v(int argc, char **argv) +int run_command_v_opt(int argc, const char **argv, int flags) { pid_t pid = fork(); if (pid < 0) return -ERR_RUN_COMMAND_FORK; if (!pid) { - execvp(argv[0], (char *const*) argv); + if (flags & RUN_COMMAND_NO_STDIO) { + int fd = open("/dev/null", O_RDWR); + dup2(fd, 0); + dup2(fd, 1); + close(fd); + } + if (flags & RUN_GIT_CMD) { + execv_git_cmd(argv); + } else { + execvp(argv[0], (char *const*) argv); + } die("exec %s failed.", argv[0]); } for (;;) { int status, code; - int retval = waitpid(pid, &status, 0); + pid_t waiting = waitpid(pid, &status, 0); - if (retval < 0) { + if (waiting < 0) { if (errno == EINTR) continue; - error("waitpid failed (%s)", strerror(retval)); + error("waitpid failed (%s)", strerror(errno)); return -ERR_RUN_COMMAND_WAITPID; } - if (retval != pid) + if (waiting != pid) return -ERR_RUN_COMMAND_WAITPID_WRONG_PID; if (WIFSIGNALED(status)) return -ERR_RUN_COMMAND_WAITPID_SIGNAL; @@ -36,10 +47,15 @@ int run_command_v(int argc, char **argv) } } +int run_command_v(int argc, const char **argv) +{ + return run_command_v_opt(argc, argv, 0); +} + int run_command(const char *cmd, ...) { int argc; - char *argv[MAX_RUN_COMMAND_ARGS]; + const char *argv[MAX_RUN_COMMAND_ARGS]; const char *arg; va_list param; @@ -54,5 +70,5 @@ int run_command(const char *cmd, ...) va_end(param); if (MAX_RUN_COMMAND_ARGS <= argc) return error("too many args to run %s", cmd); - return run_command_v(argc, argv); + return run_command_v_opt(argc, argv, 0); }