wrapper.c: wrapper to open a file, fprintf then close

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Nov 30, 2014 at 15:24 UTC 316e53e68c7c4d89876524f7f010685ebfe7be1e
2 files changed +33
cache.h
+2
@@ -1499,6 +1499,8 @@ static inline ssize_t write_str_in_full(int fd, const char *str)
1499 {
1500 return write_in_full(fd, str, strlen(str));
1501 }
1502 +__attribute__((format (printf, 3, 4)))
1503 +extern int write_file(const char *path, int fatal, const char *fmt, ...);
1504
1505 /* pager.c */
1506 extern void setup_pager(void);
wrapper.c
+31
@@ -550,3 +550,34 @@ char *xgetcwd(void)
550 die_errno(_("unable to get current working directory"));
551 return strbuf_detach(&sb, NULL);
552 }
553 +
554 +int write_file(const char *path, int fatal, const char *fmt, ...)
555 +{
556 + struct strbuf sb = STRBUF_INIT;
557 + va_list params;
558 + int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
559 + if (fd < 0) {
560 + if (fatal)
561 + die_errno(_("could not open %s for writing"), path);
562 + return -1;
563 + }
564 + va_start(params, fmt);
565 + strbuf_vaddf(&sb, fmt, params);
566 + va_end(params);
567 + if (write_in_full(fd, sb.buf, sb.len) != sb.len) {
568 + int err = errno;
569 + close(fd);
570 + strbuf_release(&sb);
571 + errno = err;
572 + if (fatal)
573 + die_errno(_("could not write to %s"), path);
574 + return -1;
575 + }
576 + strbuf_release(&sb);
577 + if (close(fd)) {
578 + if (fatal)
579 + die_errno(_("could not close %s"), path);
580 + return -1;
581 + }
582 + return 0;
583 +}