Re: [PATCH v4 19/27] wrapper.c: wrapper to open a file, fprintf then close
- From
Torsten Bögershausen <tboegi@web.de>
- Date
- Mar 1, 2014, 17:11 UTC
- Message-ID
- <531214BC.3070704@web.de>
- In-Reply-To
- <1393675983-3232-20-git-send-email-pclouds@gmail.com>
On 2014-03-01 13.12, Nguyễn Thái Ngọc Duy wrote:
Show 46 quoted lines
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> cache.h | 2 ++
> wrapper.c | 31 +++++++++++++++++++++++++++++++
> 2 files changed, 33 insertions(+)
>
> diff --git a/cache.h b/cache.h
> index 98b5dd3..99b86d9 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -1239,6 +1239,8 @@ static inline ssize_t write_str_in_full(int fd, const char *str)
> {
> return write_in_full(fd, str, strlen(str));
> }
> +__attribute__((format (printf,3,4)))
> +extern int write_file(const char *path, int fatal, const char *fmt, ...);
>
> /* pager.c */
> extern void setup_pager(void);
> diff --git a/wrapper.c b/wrapper.c
> index 0cc5636..5ced50d 100644
> --- a/wrapper.c
> +++ b/wrapper.c
> @@ -455,3 +455,34 @@ struct passwd *xgetpwuid_self(void)
> errno ? strerror(errno) : _("no such user"));
> return pw;
> }
> +
> +int write_file(const char *path, int fatal, const char *fmt, ...)
> +{
> + struct strbuf sb = STRBUF_INIT;
> + int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
> + va_list params;
> + if (fd < 0) {
> + if (fatal)
> + die_errno(_("could not open %s for writing"), path);
> + return -1;
> + }
> + va_start(params, fmt);
> + strbuf_vaddf(&sb, fmt, params);
> + va_end(params);
> + if (write_in_full(fd, sb.buf, sb.len) != sb.len) {
> + int err = errno;
> + close(fd);
> + errno = err;
> + strbuf_release(&sb);Micro nit: Today we now what strbuf_release() is doing, but if we ever change the implementation, it is 3% safer to keep err a little bit longer like this:
> + strbuf_release(&sb); > + errno = err;