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>
This commit is contained in:
Junio C Hamano
2005-12-19 16:18:28 -08:00
parent 1fdfd05db2
commit 1c15afb934
9 changed files with 46 additions and 63 deletions

View File

@ -31,12 +31,10 @@ static void * fill(int min)
offset = 0;
}
do {
int ret = read(0, buffer + len, sizeof(buffer) - len);
int ret = xread(0, buffer + len, sizeof(buffer) - len);
if (ret <= 0) {
if (!ret)
die("early EOF");
if (errno == EAGAIN || errno == EINTR)
continue;
die("read error on input: %s", strerror(errno));
}
len += ret;
@ -299,14 +297,9 @@ int main(int argc, char **argv)
/* Write the last part of the buffer to stdout */
while (len) {
int ret = write(1, buffer + offset, len);
if (!ret)
int ret = xwrite(1, buffer + offset, len);
if (ret <= 0)
break;
if (ret < 0) {
if (errno == EAGAIN || errno == EINTR)
continue;
break;
}
len -= ret;
offset += ret;
}