Skip to content

Commit 1c15afb

Browse files
author
Junio C Hamano
committed
xread/xwrite: do not worry about EINTR at calling sites.
We had errno==EINTR check after read(2)/write(2) sprinkled all over the places, always doing continue. Consolidate them into xread()/xwrite() wrapper routines. Credits for suggestion goes to HPA -- bugs are mine. Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 1fdfd05 commit 1c15afb

File tree

9 files changed

+46
-63
lines changed

9 files changed

+46
-63
lines changed

apply.c

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,11 @@ static void *read_patch_file(int fd, unsigned long *sizep)
8484
buffer = xrealloc(buffer, alloc);
8585
nr = alloc - size;
8686
}
87-
nr = read(fd, buffer + size, nr);
87+
nr = xread(fd, buffer + size, nr);
8888
if (!nr)
8989
break;
90-
if (nr < 0) {
91-
if (errno == EAGAIN)
92-
continue;
90+
if (nr < 0)
9391
die("git-apply: read returned %s", strerror(errno));
94-
}
9592
size += nr;
9693
}
9794
*sizep = size;
@@ -1006,13 +1003,8 @@ static int read_old_data(struct stat *st, const char *path, void *buf, unsigned
10061003
return error("unable to open %s", path);
10071004
got = 0;
10081005
for (;;) {
1009-
int ret = read(fd, buf + got, size - got);
1010-
if (ret < 0) {
1011-
if (errno == EAGAIN)
1012-
continue;
1013-
break;
1014-
}
1015-
if (!ret)
1006+
int ret = xread(fd, buf + got, size - got);
1007+
if (ret <= 0)
10161008
break;
10171009
got += ret;
10181010
}
@@ -1600,12 +1592,9 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
16001592
if (fd < 0)
16011593
return -1;
16021594
while (size) {
1603-
int written = write(fd, buf, size);
1604-
if (written < 0) {
1605-
if (errno == EINTR || errno == EAGAIN)
1606-
continue;
1595+
int written = xwrite(fd, buf, size);
1596+
if (written < 0)
16071597
die("writing file %s: %s", path, strerror(errno));
1608-
}
16091598
if (!written)
16101599
die("out of space writing file %s", path);
16111600
buf += written;

cat-file.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,8 @@ int main(int argc, char **argv)
5555
die("git-cat-file %s: bad file", argv[2]);
5656

5757
while (size > 0) {
58-
long ret = write(1, buf, size);
58+
long ret = xwrite(1, buf, size);
5959
if (ret < 0) {
60-
if (errno == EAGAIN)
61-
continue;
6260
/* Ignore epipe */
6361
if (errno == EPIPE)
6462
break;

copy.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,27 @@ int copy_fd(int ifd, int ofd)
66
int len;
77
char buffer[8192];
88
char *buf = buffer;
9-
len = read(ifd, buffer, sizeof(buffer));
9+
len = xread(ifd, buffer, sizeof(buffer));
1010
if (!len)
1111
break;
1212
if (len < 0) {
1313
int read_error;
14-
if (errno == EAGAIN)
15-
continue;
1614
read_error = errno;
1715
close(ifd);
1816
return error("copy-fd: read returned %s",
1917
strerror(read_error));
2018
}
21-
while (1) {
22-
int written = write(ofd, buf, len);
19+
while (len) {
20+
int written = xwrite(ofd, buf, len);
2321
if (written > 0) {
2422
buf += written;
2523
len -= written;
26-
if (!len)
27-
break;
2824
}
29-
if (!written)
25+
else if (!written)
3026
return error("copy-fd: write returned 0");
31-
if (errno == EAGAIN || errno == EINTR)
32-
continue;
33-
return error("copy-fd: write returned %s",
34-
strerror(errno));
27+
else
28+
return error("copy-fd: write returned %s",
29+
strerror(errno));
3530
}
3631
}
3732
close(ifd);

csum-file.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ static int sha1flush(struct sha1file *f, unsigned int count)
1515
void *buf = f->buffer;
1616

1717
for (;;) {
18-
int ret = write(f->fd, buf, count);
18+
int ret = xwrite(f->fd, buf, count);
1919
if (ret > 0) {
2020
buf += ret;
2121
count -= ret;
@@ -25,8 +25,6 @@ static int sha1flush(struct sha1file *f, unsigned int count)
2525
}
2626
if (!ret)
2727
die("sha1 file '%s' write error. Out of diskspace", f->name);
28-
if (errno == EAGAIN || errno == EINTR)
29-
continue;
3028
die("sha1 file '%s' write error (%s)", f->name, strerror(errno));
3129
}
3230
}

git-compat-util.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,28 @@ static inline void *xcalloc(size_t nmemb, size_t size)
8484
return ret;
8585
}
8686

87+
static inline ssize_t xread(int fd, void *buf, size_t len)
88+
{
89+
ssize_t nr;
90+
while (1) {
91+
nr = read(fd, buf, len);
92+
if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
93+
continue;
94+
return nr;
95+
}
96+
}
97+
98+
static inline ssize_t xwrite(int fd, const void *buf, size_t len)
99+
{
100+
ssize_t nr;
101+
while (1) {
102+
nr = write(fd, buf, len);
103+
if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
104+
continue;
105+
return nr;
106+
}
107+
}
108+
87109
/* Sane ctype - no locale, and works with signed chars */
88110
#undef isspace
89111
#undef isdigit

mktag.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,9 @@ int main(int argc, char **argv)
116116
// Read the signature
117117
size = 0;
118118
for (;;) {
119-
int ret = read(0, buffer + size, MAXSIZE - size);
120-
if (!ret)
119+
int ret = xread(0, buffer + size, MAXSIZE - size);
120+
if (ret <= 0)
121121
break;
122-
if (ret < 0) {
123-
if (errno == EAGAIN)
124-
continue;
125-
break;
126-
}
127122
size += ret;
128123
}
129124

pkt-line.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,14 @@
1919
static void safe_write(int fd, const void *buf, unsigned n)
2020
{
2121
while (n) {
22-
int ret = write(fd, buf, n);
22+
int ret = xwrite(fd, buf, n);
2323
if (ret > 0) {
2424
buf += ret;
2525
n -= ret;
2626
continue;
2727
}
2828
if (!ret)
2929
die("write error (disk full?)");
30-
if (errno == EAGAIN || errno == EINTR)
31-
continue;
3230
die("write error (%s)", strerror(errno));
3331
}
3432
}
@@ -68,12 +66,9 @@ static void safe_read(int fd, void *buffer, unsigned size)
6866
int n = 0;
6967

7068
while (n < size) {
71-
int ret = read(fd, buffer + n, size - n);
72-
if (ret < 0) {
73-
if (errno == EINTR || errno == EAGAIN)
74-
continue;
69+
int ret = xread(fd, buffer + n, size - n);
70+
if (ret < 0)
7571
die("read error (%s)", strerror(errno));
76-
}
7772
if (!ret)
7873
die("unexpected EOF");
7974
n += ret;

tar-tree.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,8 @@ struct path_prefix {
3434
static void reliable_write(void *buf, unsigned long size)
3535
{
3636
while (size > 0) {
37-
long ret = write(1, buf, size);
37+
long ret = xwrite(1, buf, size);
3838
if (ret < 0) {
39-
if (errno == EAGAIN)
40-
continue;
4139
if (errno == EPIPE)
4240
exit(0);
4341
die("git-tar-tree: %s", strerror(errno));

unpack-objects.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,10 @@ static void * fill(int min)
3131
offset = 0;
3232
}
3333
do {
34-
int ret = read(0, buffer + len, sizeof(buffer) - len);
34+
int ret = xread(0, buffer + len, sizeof(buffer) - len);
3535
if (ret <= 0) {
3636
if (!ret)
3737
die("early EOF");
38-
if (errno == EAGAIN || errno == EINTR)
39-
continue;
4038
die("read error on input: %s", strerror(errno));
4139
}
4240
len += ret;
@@ -299,14 +297,9 @@ int main(int argc, char **argv)
299297

300298
/* Write the last part of the buffer to stdout */
301299
while (len) {
302-
int ret = write(1, buffer + offset, len);
303-
if (!ret)
304-
break;
305-
if (ret < 0) {
306-
if (errno == EAGAIN || errno == EINTR)
307-
continue;
300+
int ret = xwrite(1, buffer + offset, len);
301+
if (ret <= 0)
308302
break;
309-
}
310303
len -= ret;
311304
offset += ret;
312305
}

0 commit comments

Comments
 (0)