short i/o: clean up the naming for the write_{in,or}_xxx family
[git] / write_or_die.c
1 #include "cache.h"
2
3 void read_or_die(int fd, void *buf, size_t count)
4 {
5         char *p = buf;
6         ssize_t loaded;
7
8         while (count > 0) {
9                 loaded = xread(fd, p, count);
10                 if (loaded == 0)
11                         die("unexpected end of file");
12                 else if (loaded < 0)
13                         die("read error (%s)", strerror(errno));
14                 count -= loaded;
15                 p += loaded;
16         }
17 }
18
19 void write_or_die(int fd, const void *buf, size_t count)
20 {
21         const char *p = buf;
22         ssize_t written;
23
24         while (count > 0) {
25                 written = xwrite(fd, p, count);
26                 if (written == 0)
27                         die("disk full?");
28                 else if (written < 0) {
29                         if (errno == EPIPE)
30                                 exit(0);
31                         die("write error (%s)", strerror(errno));
32                 }
33                 count -= written;
34                 p += written;
35         }
36 }
37
38 int write_in_full(int fd, const void *buf, size_t count)
39 {
40         const char *p = buf;
41         ssize_t total = 0;
42         ssize_t wcount = 0;
43
44         while (count > 0) {
45                 wcount = xwrite(fd, p, count);
46                 if (wcount <= 0) {
47                         if (total)
48                                 return total;
49                         else
50                                 return wcount;
51                 }
52                 count -= wcount;
53                 p += wcount;
54                 total += wcount;
55         }
56
57         return wcount;
58 }
59
60 int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)
61 {
62         ssize_t written;
63
64         written = write_in_full(fd, buf, count);
65         if (written == 0) {
66                 fprintf(stderr, "%s: disk full?\n", msg);
67                 return 0;
68         }
69         else if (written < 0) {
70                 if (errno == EPIPE)
71                         exit(0);
72                 fprintf(stderr, "%s: write error (%s)\n",
73                         msg, strerror(errno));
74                 return 0;
75         }
76
77         return 1;
78 }
79
80 int write_or_whine(int fd, const void *buf, size_t count, const char *msg)
81 {
82         ssize_t written;
83
84         written = write_in_full(fd, buf, count);
85         if (written == 0) {
86                 fprintf(stderr, "%s: disk full?\n", msg);
87                 return 0;
88         }
89         else if (written < 0) {
90                 fprintf(stderr, "%s: write error (%s)\n",
91                         msg, strerror(errno));
92                 return 0;
93         }
94
95         return 1;
96 }