]> git.ipfire.org Git - thirdparty/git.git/blame - write_or_die.c
config-set: check write-in-full returns in set_multivar
[thirdparty/git.git] / write_or_die.c
CommitLineData
7230e6d0
RS
1#include "cache.h"
2
93d26e4c 3int read_in_full(int fd, void *buf, size_t count)
75025ccd
SP
4{
5 char *p = buf;
93d26e4c
AW
6 ssize_t total = 0;
7 ssize_t loaded = 0;
75025ccd
SP
8
9 while (count > 0) {
10 loaded = xread(fd, p, count);
93d26e4c
AW
11 if (loaded <= 0) {
12 if (total)
13 return total;
14 else
15 return loaded;
16 }
75025ccd
SP
17 count -= loaded;
18 p += loaded;
93d26e4c 19 total += loaded;
75025ccd 20 }
93d26e4c
AW
21
22 return total;
23}
24
25void read_or_die(int fd, void *buf, size_t count)
26{
27 ssize_t loaded;
28
29 loaded = read_in_full(fd, buf, count);
30 if (loaded == 0)
31 die("unexpected end of file");
32 else if (loaded < 0)
33 die("read error (%s)", strerror(errno));
75025ccd
SP
34}
35
93822c22 36int write_in_full(int fd, const void *buf, size_t count)
7230e6d0
RS
37{
38 const char *p = buf;
93822c22 39 ssize_t total = 0;
7230e6d0
RS
40
41 while (count > 0) {
f6aa66cb
LT
42 size_t written = xwrite(fd, p, count);
43 if (written < 0)
44 return -1;
45 if (!written) {
46 errno = ENOSPC;
47 return -1;
7230e6d0
RS
48 }
49 count -= written;
50 p += written;
93822c22 51 total += written;
7230e6d0 52 }
93822c22
AW
53
54 return total;
7230e6d0 55}
7cf67205 56
93822c22 57void write_or_die(int fd, const void *buf, size_t count)
7cf67205 58{
93822c22 59 ssize_t written;
7cf67205 60
93822c22
AW
61 written = write_in_full(fd, buf, count);
62 if (written == 0)
63 die("disk full?");
64 else if (written < 0) {
65 if (errno == EPIPE)
66 exit(0);
67 die("write error (%s)", strerror(errno));
e0814056 68 }
e0814056
AW
69}
70
71int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)
72{
73 ssize_t written;
74
75 written = write_in_full(fd, buf, count);
76 if (written == 0) {
77 fprintf(stderr, "%s: disk full?\n", msg);
78 return 0;
79 }
80 else if (written < 0) {
81 if (errno == EPIPE)
82 exit(0);
83 fprintf(stderr, "%s: write error (%s)\n",
84 msg, strerror(errno));
85 return 0;
7cf67205
CC
86 }
87
88 return 1;
89}
825cee7b 90
e0814056 91int write_or_whine(int fd, const void *buf, size_t count, const char *msg)
825cee7b 92{
825cee7b
AW
93 ssize_t written;
94
e0814056
AW
95 written = write_in_full(fd, buf, count);
96 if (written == 0) {
97 fprintf(stderr, "%s: disk full?\n", msg);
98 return 0;
99 }
100 else if (written < 0) {
101 fprintf(stderr, "%s: write error (%s)\n",
102 msg, strerror(errno));
103 return 0;
825cee7b
AW
104 }
105
106 return 1;
107}