* [PATCH 5/8] Teach run_command how to setup a stdin pipe
@ 2007-03-10 8:28 Shawn O. Pearce
2007-03-10 16:54 ` Johannes Schindelin
0 siblings, 1 reply; 4+ messages in thread
From: Shawn O. Pearce @ 2007-03-10 8:28 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Sometimes callers trying to use run_command to execute a child
process will want to setup a pipe or file descriptor to redirect
into the child's stdin.
This idea is completely stolen from builtin-bundle's fork_with_pipe,
written by Johannes Schindelin. All credit (and blame) should lie
with Dscho. ;-)
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
run-command.c | 35 ++++++++++++++++++++++++++++++++++-
run-command.h | 3 +++
2 files changed, 37 insertions(+), 1 deletions(-)
diff --git a/run-command.c b/run-command.c
index a866a06..03ff7bc 100644
--- a/run-command.c
+++ b/run-command.c
@@ -4,15 +4,39 @@
int start_command(struct child_process *cmd)
{
+ int need_in = !cmd->no_stdin && cmd->in < 0;
+ int fdin[2];
+
+ if (need_in) {
+ if (pipe(fdin) < 0)
+ return -ERR_RUN_COMMAND_PIPE;
+ cmd->in = fdin[1];
+ cmd->close_in = 1;
+ }
+
cmd->pid = fork();
- if (cmd->pid < 0)
+ if (cmd->pid < 0) {
+ if (need_in) {
+ close(fdin[0]);
+ close(fdin[1]);
+ }
return -ERR_RUN_COMMAND_FORK;
+ }
+
if (!cmd->pid) {
if (cmd->no_stdin) {
int fd = open("/dev/null", O_RDWR);
dup2(fd, 0);
close(fd);
+ } else if (need_in) {
+ dup2(fdin[0], 0);
+ close(fdin[0]);
+ close(fdin[1]);
+ } else if (cmd->in) {
+ dup2(cmd->in, 0);
+ close(cmd->in);
}
+
if (cmd->stdout_to_stderr)
dup2(2, 1);
if (cmd->git_cmd) {
@@ -22,11 +46,20 @@ int start_command(struct child_process *cmd)
}
die("exec %s failed.", cmd->argv[0]);
}
+
+ if (need_in)
+ close(fdin[0]);
+ else if (cmd->in)
+ close(cmd->in);
+
return 0;
}
int finish_command(struct child_process *cmd)
{
+ if (cmd->close_in)
+ close(cmd->in);
+
for (;;) {
int status, code;
pid_t waiting = waitpid(cmd->pid, &status, 0);
diff --git a/run-command.h b/run-command.h
index 24cdb4e..ff09067 100644
--- a/run-command.h
+++ b/run-command.h
@@ -4,6 +4,7 @@
enum {
ERR_RUN_COMMAND_FORK = 10000,
ERR_RUN_COMMAND_EXEC,
+ ERR_RUN_COMMAND_PIPE,
ERR_RUN_COMMAND_WAITPID,
ERR_RUN_COMMAND_WAITPID_WRONG_PID,
ERR_RUN_COMMAND_WAITPID_SIGNAL,
@@ -13,6 +14,8 @@ enum {
struct child_process {
const char **argv;
pid_t pid;
+ int in;
+ unsigned close_in: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.942.g299f
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH 5/8] Teach run_command how to setup a stdin pipe
2007-03-10 8:28 [PATCH 5/8] Teach run_command how to setup a stdin pipe Shawn O. Pearce
@ 2007-03-10 16:54 ` Johannes Schindelin
2007-03-11 1:45 ` Shawn O. Pearce
0 siblings, 1 reply; 4+ messages in thread
From: Johannes Schindelin @ 2007-03-10 16:54 UTC (permalink / raw)
To: Shawn O. Pearce; +Cc: Junio C Hamano, git
Hi,
On Sat, 10 Mar 2007, Shawn O. Pearce wrote:
> Sometimes callers trying to use run_command to execute a child process
> will want to setup a pipe or file descriptor to redirect into the
> child's stdin.
>
> This idea is completely stolen from builtin-bundle's fork_with_pipe,
> written by Johannes Schindelin. All credit (and blame) should lie with
> Dscho. ;-)
;-)
Thank you for starting this thread. I think it makes a lot of sense in the
face of the MinGW port. (I am not interested in the hook stuff personally,
so I'll not comment on that.)
Ciao,
Dscho
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 5/8] Teach run_command how to setup a stdin pipe
2007-03-10 16:54 ` Johannes Schindelin
@ 2007-03-11 1:45 ` Shawn O. Pearce
2007-03-11 2:07 ` Johannes Schindelin
0 siblings, 1 reply; 4+ messages in thread
From: Shawn O. Pearce @ 2007-03-11 1:45 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Junio C Hamano, git
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> On Sat, 10 Mar 2007, Shawn O. Pearce wrote:
>
> > Sometimes callers trying to use run_command to execute a child process
> > will want to setup a pipe or file descriptor to redirect into the
> > child's stdin.
> >
> > This idea is completely stolen from builtin-bundle's fork_with_pipe,
> > written by Johannes Schindelin. All credit (and blame) should lie with
> > Dscho. ;-)
>
> ;-)
>
> Thank you for starting this thread. I think it makes a lot of sense in the
> face of the MinGW port. (I am not interested in the hook stuff personally,
> so I'll not comment on that.)
I'd like to see run_command learn how to also redirect stdout,
then replace fork_with_pipe in builtin-bundle with run_command.
We should be able to also improve some of our other more direct
uses of fork to use run_command at that point too.
I don't know squat about MinGW, so I don't know if having the
run_command abstraction really helps there or not, but I know we
tried to make it with the good intentions of being able to use it
to wrap that asinine CreateProcess() thing that Win32 has...
--
Shawn.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 5/8] Teach run_command how to setup a stdin pipe
2007-03-11 1:45 ` Shawn O. Pearce
@ 2007-03-11 2:07 ` Johannes Schindelin
0 siblings, 0 replies; 4+ messages in thread
From: Johannes Schindelin @ 2007-03-11 2:07 UTC (permalink / raw)
To: Shawn O. Pearce; +Cc: Junio C Hamano, git
Hi,
On Sat, 10 Mar 2007, Shawn O. Pearce wrote:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> > On Sat, 10 Mar 2007, Shawn O. Pearce wrote:
> >
> > > Sometimes callers trying to use run_command to execute a child
> > > process will want to setup a pipe or file descriptor to redirect
> > > into the child's stdin.
> > >
> > > This idea is completely stolen from builtin-bundle's fork_with_pipe,
> > > written by Johannes Schindelin. All credit (and blame) should lie
> > > with Dscho. ;-)
> >
> > ;-)
> >
> > Thank you for starting this thread. I think it makes a lot of sense in
> > the face of the MinGW port. (I am not interested in the hook stuff
> > personally, so I'll not comment on that.)
>
> I'd like to see run_command learn how to also redirect stdout, then
> replace fork_with_pipe in builtin-bundle with run_command. We should be
> able to also improve some of our other more direct uses of fork to use
> run_command at that point too.
I concur.
> I don't know squat about MinGW, so I don't know if having the
> run_command abstraction really helps there or not, but I know we tried
> to make it with the good intentions of being able to use it to wrap that
> asinine CreateProcess() thing that Win32 has...
There is only one place that I am aware of, where this is not enough: For
the shallow thing, upload-pack fork()s but does not execute another
program, but lists all the objects to be uploaded. (For shallow, this
_cannot_ be an external process, since it mucks with the commits which are
to be treated as shallow).
Ciao,
Dscho
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-03-11 2:07 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-10 8:28 [PATCH 5/8] Teach run_command how to setup a stdin pipe Shawn O. Pearce
2007-03-10 16:54 ` Johannes Schindelin
2007-03-11 1:45 ` Shawn O. Pearce
2007-03-11 2:07 ` Johannes Schindelin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox