Browse Source

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>
maint
Nguyễn Thái Ngọc Duy 10 years ago committed by Junio C Hamano
parent
commit
316e53e68c
  1. 2
      cache.h
  2. 31
      wrapper.c

2
cache.h

@ -1499,6 +1499,8 @@ static inline ssize_t write_str_in_full(int fd, const char *str)
{ {
return write_in_full(fd, str, strlen(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 */ /* pager.c */
extern void setup_pager(void); extern void setup_pager(void);

31
wrapper.c

@ -550,3 +550,34 @@ char *xgetcwd(void)
die_errno(_("unable to get current working directory")); die_errno(_("unable to get current working directory"));
return strbuf_detach(&sb, NULL); return strbuf_detach(&sb, NULL);
} }

int write_file(const char *path, int fatal, const char *fmt, ...)
{
struct strbuf sb = STRBUF_INIT;
va_list params;
int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
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);
strbuf_release(&sb);
errno = err;
if (fatal)
die_errno(_("could not write to %s"), path);
return -1;
}
strbuf_release(&sb);
if (close(fd)) {
if (fatal)
die_errno(_("could not close %s"), path);
return -1;
}
return 0;
}

Loading…
Cancel
Save