From f1000898d43a30f6a0d3bbde7b4927e97913d010 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Sat, 10 Mar 2007 03:28:00 -0500 Subject: 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 Signed-off-by: Junio C Hamano diff --git a/run-command.c b/run-command.c index 94ace50..1fb7fa5 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 2646d38..f9db2a7 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 -- cgit v0.10.2-6-g49f6