X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=run-command.c;h=ca67ee9333e1f4125678fe607f44d75becc3cf7e;hb=f8ba655ee4131e5c73c28a4ea854b24ce4058e1e;hp=5117f627c86de68ed9f3da36e9e0c7b41a6e4691;hpb=b1bf95bba26c8de1581f401dcab1f743bad7fc1d;p=git.git diff --git a/run-command.c b/run-command.c index 5117f627..ca67ee93 100644 --- a/run-command.c +++ b/run-command.c @@ -1,16 +1,27 @@ #include "cache.h" #include "run-command.h" #include +#include "exec_cmd.h" -static int run_external_command(int argc, const 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); - return -ERR_RUN_COMMAND_EXEC; + 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; @@ -36,6 +47,11 @@ static int run_external_command(int argc, const 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; @@ -43,10 +59,8 @@ int run_command(const char *cmd, ...) const char *arg; va_list param; - fprintf(stderr, "run-command %s (%d)\n", cmd, ERR_RUN_COMMAND_EXEC); - va_start(param, cmd); - argv[0] = cmd; + argv[0] = (char*) cmd; argc = 1; while (argc < MAX_RUN_COMMAND_ARGS) { arg = argv[argc++] = va_arg(param, char *); @@ -56,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_external_command(argc, argv); + return run_command_v_opt(argc, argv, 0); }