diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2007-03-10 03:28:00 -0500 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-03-11 22:49:34 -0700 |
commit | f1000898d43a30f6a0d3bbde7b4927e97913d010 (patch) | |
tree | 0e3b57faeb21bef705f753382f3f6867ab62431e | |
parent | afdb269c76cb965cf8bbb1012c2ec0e2bf7172b1 (diff) | |
download | git-f1000898d43a30f6a0d3bbde7b4927e97913d010.tar.gz |
Start defining a more sophisticated run_command
There are a number of places where we do some variation of
fork()+exec() but we also need to setup redirection in the process,
much like what run_command does for us already with its option flags.
It would be nice to reuse more of the run_command logic, especially
as that non-fork API helps us to port to odd platforms like Win32.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | run-command.c | 25 | ||||
-rw-r--r-- | run-command.h | 9 |
2 files changed, 27 insertions, 7 deletions
diff --git a/run-command.c b/run-command.c index 94ace50a25..1fb7fa5a8d 100644 --- a/run-command.c +++ b/run-command.c @@ -2,26 +2,26 @@ #include "run-command.h" #include "exec_cmd.h" -int run_command_v_opt(const char **argv, int flags) +int run_command(struct child_process *cmd) { pid_t pid = fork(); if (pid < 0) return -ERR_RUN_COMMAND_FORK; if (!pid) { - if (flags & RUN_COMMAND_NO_STDIN) { + if (cmd->no_stdin) { int fd = open("/dev/null", O_RDWR); dup2(fd, 0); close(fd); } - if (flags & RUN_COMMAND_STDOUT_TO_STDERR) + if (cmd->stdout_to_stderr) dup2(2, 1); - if (flags & RUN_GIT_CMD) { - execv_git_cmd(argv); + if (cmd->git_cmd) { + execv_git_cmd(cmd->argv); } else { - execvp(argv[0], (char *const*) argv); + execvp(cmd->argv[0], (char *const*) cmd->argv); } - die("exec %s failed.", argv[0]); + die("exec %s failed.", cmd->argv[0]); } for (;;) { int status, code; @@ -46,3 +46,14 @@ int run_command_v_opt(const char **argv, int flags) return 0; } } + +int run_command_v_opt(const char **argv, int opt) +{ + struct child_process cmd; + memset(&cmd, 0, sizeof(cmd)); + cmd.argv = argv; + cmd.no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0; + cmd.git_cmd = opt & RUN_GIT_CMD ? 1 : 0; + cmd.stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0; + return run_command(&cmd); +} diff --git a/run-command.h b/run-command.h index 2646d38ac7..f9db2a7f8c 100644 --- a/run-command.h +++ b/run-command.h @@ -10,6 +10,15 @@ enum { ERR_RUN_COMMAND_WAITPID_NOEXIT, }; +struct child_process { + const char **argv; + unsigned no_stdin:1; + unsigned git_cmd:1; /* if this is to be git sub-command */ + unsigned stdout_to_stderr:1; +}; + +int run_command(struct child_process *); + #define RUN_COMMAND_NO_STDIN 1 #define RUN_GIT_CMD 2 /*If this is to be git sub-command */ #define RUN_COMMAND_STDOUT_TO_STDERR 4 |