X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=write_or_die.c;h=e4c8e225fd232dfd642aa13d7ae5b64b9827c915;hb=6fd6aec44fe79dff61fd37a5fec2456c5458b574;hp=e125e11d3b63e3dab9077d7b414e83e7ff7d16ad;hpb=d794d9e70ebb8c767b04f25c03290ef305cd31ab;p=git.git diff --git a/write_or_die.c b/write_or_die.c index e125e11d3..e4c8e225f 100644 --- a/write_or_die.c +++ b/write_or_die.c @@ -34,13 +34,18 @@ void maybe_flush_or_die(FILE *f, const char *desc) return; } if (fflush(f)) { - if (errno == EPIPE) + /* + * On Windows, EPIPE is returned only by the first write() + * after the reading end has closed its handle; subsequent + * write()s return EINVAL. + */ + if (errno == EPIPE || errno == EINVAL) exit(0); die("write failure on %s: %s", desc, strerror(errno)); } } -int read_in_full(int fd, void *buf, size_t count) +ssize_t read_in_full(int fd, void *buf, size_t count) { char *p = buf; ssize_t total = 0; @@ -57,7 +62,7 @@ int read_in_full(int fd, void *buf, size_t count) return total; } -int write_in_full(int fd, const void *buf, size_t count) +ssize_t write_in_full(int fd, const void *buf, size_t count) { const char *p = buf; ssize_t total = 0; @@ -78,6 +83,13 @@ int write_in_full(int fd, const void *buf, size_t count) return total; } +void fsync_or_die(int fd, const char *msg) +{ + if (fsync(fd) < 0) { + die("%s: fsync error (%s)", msg, strerror(errno)); + } +} + void write_or_die(int fd, const void *buf, size_t count) { if (write_in_full(fd, buf, count) < 0) {