larsxschnei...@gmail.com writes:

> From: Lars Schneider <larsxschnei...@gmail.com>
>
> packet_write_fmt() would die in case of a write error even though for
> some callers an error would be acceptable. Add packet_write_fmt_gently()
> which writes a formatted pkt-line and returns `0` for success and `-1`
> for an error.
>
> Signed-off-by: Lars Schneider <larsxschnei...@gmail.com>
> ---
>  pkt-line.c | 12 ++++++++++++
>  pkt-line.h |  1 +
>  2 files changed, 13 insertions(+)
>
> diff --git a/pkt-line.c b/pkt-line.c
> index e8adc0f..3e8b2fb 100644
> --- a/pkt-line.c
> +++ b/pkt-line.c
> @@ -137,6 +137,18 @@ void packet_write_fmt(int fd, const char *fmt, ...)
>       write_or_die(fd, buf.buf, buf.len);
>  }
>  
> +int packet_write_fmt_gently(int fd, const char *fmt, ...)
> +{
> +     static struct strbuf buf = STRBUF_INIT;
> +     va_list args;
> +
> +     strbuf_reset(&buf);
> +     va_start(args, fmt);
> +     format_packet(&buf, fmt, args);
> +     va_end(args);
> +     return (write_in_full(fd, buf.buf, buf.len) == buf.len ? 0 : -1);
> +}

Even though its only a handful lines, it is a bit ugly to have a
completely copied implementation only to have _gently().  I suspect
that you should be able to

        static int packet_write_fmt_1(int fd, int gently,
                                        const char *fmt, va_list args)
        {
                struct strbuf buf = STRBUF_INIT;
                size_t count;

                format_packet(&buf, fmt, args);
                
                count = write_in_full(fd, buf.buf, buf.len);
                if (count == buf.len)
                        return 0;
                if (!gently) {
                        check_pipe(errno);
                        die_errno("write error");
                }
                return -1;
        }

and then share that between the existing one:

        void packet_write_fmt(int fd, const char *fmt, ...)
        {
                va_list args;
                va_start(args, fmt);
                packet_write_fmt_1(fd, 0, fmt, args);
                va_end(args);
        }

and the new one:

        void packet_write_fmt_gently(int fd, const char *fmt, ...)
        {
                int status;
                va_list args;
                va_start(args, fmt);
                status = packet_write_fmt_1(fd, 1, fmt, args);
                va_end(args);
                return status;
        }

>  void packet_buf_write(struct strbuf *buf, const char *fmt, ...)
>  {
>       va_list args;
> diff --git a/pkt-line.h b/pkt-line.h
> index 1902fb3..3caea77 100644
> --- a/pkt-line.h
> +++ b/pkt-line.h
> @@ -23,6 +23,7 @@ void packet_flush(int fd);
>  void packet_write_fmt(int fd, const char *fmt, ...) __attribute__((format 
> (printf, 2, 3)));
>  void packet_buf_flush(struct strbuf *buf);
>  void packet_buf_write(struct strbuf *buf, const char *fmt, ...) 
> __attribute__((format (printf, 2, 3)));
> +int packet_write_fmt_gently(int fd, const char *fmt, ...) 
> __attribute__((format (printf, 2, 3)));
>  
>  /*
>   * Read a packetized line into the buffer, which must be at least size bytes
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to