git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/4] Teach run-command about stdout redirection

From
Shawn O. Pearce <spearce@spearce.org>
Date
Mar 12, 2007, 18:37 UTC
Message-ID
<20070312183745.GB15996@spearce.org>

Some potential callers of the run_command family of functions need to control not only the stdin redirection of the child, but also the stdout redirection of the child. This can now be setup much like the already existing stdin redirection.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 run-command.c |   30 +++++++++++++++++++++++++++++-
 run-command.h |    2 ++
 2 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/run-command.c b/run-command.c
index bef9775..d20a6ef 100644
--- a/run-command.c
+++ b/run-command.c
@@ -11,7 +11,8 @@ static inline void close_pair(int fd[2])
 int start_command(struct child_process *cmd)
 {
 	int need_in = !cmd->no_stdin && cmd->in < 0;
-	int fdin[2];
+	int need_out = !cmd->stdout_to_stderr && cmd->out < 0;
+	int fdin[2], fdout[2];
 
 	if (need_in) {
 		if (pipe(fdin) < 0)
@@ -20,10 +21,22 @@ int start_command(struct child_process *cmd)
 		cmd->close_in = 1;
 	}
 
+	if (need_out) {
+		if (pipe(fdout) < 0) {
+			if (need_in)
+				close_pair(fdin);
+			return -ERR_RUN_COMMAND_PIPE;
+		}
+		cmd->out = fdout[0];
+		cmd->close_out = 1;
+	}
+
 	cmd->pid = fork();
 	if (cmd->pid < 0) {
 		if (need_in)
 			close_pair(fdin);
+		if (need_out)
+			close_pair(fdout);
 		return -ERR_RUN_COMMAND_FORK;
 	}
 
@@ -42,6 +55,14 @@ int start_command(struct child_process *cmd)
 
 		if (cmd->stdout_to_stderr)
 			dup2(2, 1);
+		else if (need_out) {
+			dup2(fdout[1], 1);
+			close_pair(fdout);
+		} else if (cmd->out > 1) {
+			dup2(cmd->out, 1);
+			close(cmd->out);
+		}
+
 		if (cmd->git_cmd) {
 			execv_git_cmd(cmd->argv);
 		} else {
@@ -55,6 +76,11 @@ int start_command(struct child_process *cmd)
 	else if (cmd->in)
 		close(cmd->in);
 
+	if (need_out)
+		close(fdout[1]);
+	else if (cmd->out > 1)
+		close(cmd->out);
+
 	return 0;
 }
 
@@ -62,6 +88,8 @@ int finish_command(struct child_process *cmd)
 {
 	if (cmd->close_in)
 		close(cmd->in);
+	if (cmd->close_out)
+		close(cmd->out);
 
 	for (;;) {
 		int status, code;
diff --git a/run-command.h b/run-command.h
index ff09067..1c9126b 100644
--- a/run-command.h
+++ b/run-command.h
@@ -15,7 +15,9 @@ struct child_process {
 	const char **argv;
 	pid_t pid;
 	int in;
+	int out;
 	unsigned close_in:1;
+	unsigned close_out:1;
 	unsigned no_stdin:1;
 	unsigned git_cmd:1; /* if this is to be git sub-command */
 	unsigned stdout_to_stderr:1;
-- 
1.5.0.3.985.gcf0b4
Message 1 of 1 in “Teach run-command about stdout redirection”
  1. 2/4 Teach run-command about stdout redirectionShawn O. Pearce, Mar 12, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.