Re: [PATCH 3/7] strbuf: introduce strbuf_read_cmd helper
- From
Eric Sunshine <sunshine@sunshineco.com>
- Date
- Mar 22, 2015, 19:36 UTC
- Message-ID
- <CAPig+cR5Ur4xOKZ6K=bOwOVM8bHHjJJXHxzCbvYBhqOTtD6dXg@mail.gmail.com>
- In-Reply-To
- <20150322100724.GC11615@peff.net>
On Sun, Mar 22, 2015 at 6:07 AM, Jeff King <peff@peff.net> wrote:
Show 18 quoted lines
> 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@peff.net> > --- > 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()Show 30 quoted lines
> 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