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>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2014-11-30 15:24:45 +07:00 коммит произвёл Junio C Hamano
Родитель 31e26ebcb5
Коммит 316e53e68c
2 изменённых файлов: 33 добавлений и 0 удалений

Просмотреть файл

@ -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));
}
__attribute__((format (printf, 3, 4)))
extern int write_file(const char *path, int fatal, const char *fmt, ...);
/* pager.c */
extern void setup_pager(void);

Просмотреть файл

@ -550,3 +550,34 @@ char *xgetcwd(void)
die_errno(_("unable to get current working directory"));
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;
}