Skip to content

Commit

Permalink
Split run_command into two halves (start/finish)
Browse files Browse the repository at this point in the history
If the calling process wants to send data to stdin of a
child process it will need to arrange for a pipe and get
the child process running, feed data to it, then wait
for the child process to finish.  So we split the run
function into two halves, allowing callers to first
start the child then later finish it.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Shawn O. Pearce authored and Junio C Hamano committed Mar 12, 2007
1 parent f100089 commit ebcb5d1
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 7 deletions.
26 changes: 19 additions & 7 deletions run-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@
#include "run-command.h"
#include "exec_cmd.h"

int run_command(struct child_process *cmd)
int start_command(struct child_process *cmd)
{
pid_t pid = fork();

if (pid < 0)
cmd->pid = fork();
if (cmd->pid < 0)
return -ERR_RUN_COMMAND_FORK;
if (!pid) {
if (!cmd->pid) {
if (cmd->no_stdin) {
int fd = open("/dev/null", O_RDWR);
dup2(fd, 0);
Expand All @@ -23,17 +22,22 @@ int run_command(struct child_process *cmd)
}
die("exec %s failed.", cmd->argv[0]);
}
return 0;
}

int finish_command(struct child_process *cmd)
{
for (;;) {
int status, code;
pid_t waiting = waitpid(pid, &status, 0);
pid_t waiting = waitpid(cmd->pid, &status, 0);

if (waiting < 0) {
if (errno == EINTR)
continue;
error("waitpid failed (%s)", strerror(errno));
return -ERR_RUN_COMMAND_WAITPID;
}
if (waiting != pid)
if (waiting != cmd->pid)
return -ERR_RUN_COMMAND_WAITPID_WRONG_PID;
if (WIFSIGNALED(status))
return -ERR_RUN_COMMAND_WAITPID_SIGNAL;
Expand All @@ -47,6 +51,14 @@ int run_command(struct child_process *cmd)
}
}

int run_command(struct child_process *cmd)
{
int code = start_command(cmd);
if (code)
return code;
return finish_command(cmd);
}

int run_command_v_opt(const char **argv, int opt)
{
struct child_process cmd;
Expand Down
3 changes: 3 additions & 0 deletions run-command.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,14 @@ enum {

struct child_process {
const char **argv;
pid_t pid;
unsigned no_stdin:1;
unsigned git_cmd:1; /* if this is to be git sub-command */
unsigned stdout_to_stderr:1;
};

int start_command(struct child_process *);
int finish_command(struct child_process *);
int run_command(struct child_process *);

#define RUN_COMMAND_NO_STDIN 1
Expand Down

0 comments on commit ebcb5d1

Please sign in to comment.