On Sun, Mar 22, 2015 at 6:07 AM, Jeff King <[email protected]> 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 <[email protected]>
> ---
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html