Merge branch 'lw/daemon-log-destination'
[git] / write_or_die.c
1 #include "cache.h"
2 #include "run-command.h"
3
4 /*
5  * Some cases use stdio, but want to flush after the write
6  * to get error handling (and to get better interactive
7  * behaviour - not buffering excessively).
8  *
9  * Of course, if the flush happened within the write itself,
10  * we've already lost the error code, and cannot report it any
11  * more. So we just ignore that case instead (and hope we get
12  * the right error code on the flush).
13  *
14  * If the file handle is stdout, and stdout is a file, then skip the
15  * flush entirely since it's not needed.
16  */
17 void maybe_flush_or_die(FILE *f, const char *desc)
18 {
19         static int skip_stdout_flush = -1;
20         struct stat st;
21         char *cp;
22
23         if (f == stdout) {
24                 if (skip_stdout_flush < 0) {
25                         cp = getenv("GIT_FLUSH");
26                         if (cp)
27                                 skip_stdout_flush = (atoi(cp) == 0);
28                         else if ((fstat(fileno(stdout), &st) == 0) &&
29                                  S_ISREG(st.st_mode))
30                                 skip_stdout_flush = 1;
31                         else
32                                 skip_stdout_flush = 0;
33                 }
34                 if (skip_stdout_flush && !ferror(f))
35                         return;
36         }
37         if (fflush(f)) {
38                 check_pipe(errno);
39                 die_errno("write failure on '%s'", desc);
40         }
41 }
42
43 void fprintf_or_die(FILE *f, const char *fmt, ...)
44 {
45         va_list ap;
46         int ret;
47
48         va_start(ap, fmt);
49         ret = vfprintf(f, fmt, ap);
50         va_end(ap);
51
52         if (ret < 0) {
53                 check_pipe(errno);
54                 die_errno("write error");
55         }
56 }
57
58 void fsync_or_die(int fd, const char *msg)
59 {
60         if (fsync(fd) < 0) {
61                 die_errno("fsync error on '%s'", msg);
62         }
63 }
64
65 void write_or_die(int fd, const void *buf, size_t count)
66 {
67         if (write_in_full(fd, buf, count) < 0) {
68                 check_pipe(errno);
69                 die_errno("write error");
70         }
71 }