On Sun, Mar 22, 2015 at 6:07 AM, Jeff King <peff@xxxxxxxx> wrote: > Something as simple as reading the stdout from a command > turns out to be rather hard to do right. Doing: > > if (!run_command(&cmd)) > strbuf_read(&buf, cmd.out, 0); > > can result in deadlock if the child process produces a large > amount of output. [...] > > Let's introduce a strbuf helper that can make this a bit > simpler for callers to do right. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > This is really at the intersection of the strbuf and > run-command APIs, so you could argue for it being part of > either It is logically quite like the strbuf_read_file() > function, so I put it there. It does feel like a layering violation. If moved to the run-command API, it could given one of the following names or something better: run_command_capture() capture_command() command_capture() run_command_with_output() capture_output() > diff --git a/strbuf.h b/strbuf.h > index 1883494..93a50da 100644 > --- a/strbuf.h > +++ b/strbuf.h > @@ -1,6 +1,8 @@ > #ifndef STRBUF_H > #define STRBUF_H > > +struct child_process; > + > /** > * strbuf's are meant to be used with all the usual C string and memory > * APIs. Given that the length of the buffer is known, it's often better to > @@ -373,6 +375,14 @@ extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint); > extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint); > > /** > + * Execute the given command, capturing its stdout in the given strbuf. > + * Returns -1 if starting the command fails or reading fails, and otherwise > + * returns the exit code of the command. The output collected in the > + * buffer is kept even if the command returns a non-zero exit. > + */ > +int strbuf_read_cmd(struct strbuf *sb, struct child_process *cmd, size_t hint); > + > +/** > * Read a line from a FILE *, overwriting the existing contents > * of the strbuf. The second argument specifies the line > * terminator character, typically `'\n'`. > -- > 2.3.3.618.ga041503 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html