cvsserver: Add support for packed refs
[gitweb.git] / write_or_die.c
index 32f99140205f8969d8a884b3cf9448eec3f1dd16..e4c8e225fd232dfd642aa13d7ae5b64b9827c915 100644 (file)
@@ -34,7 +34,12 @@ 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));
        }
@@ -78,6 +83,13 @@ ssize_t 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) {