diff options
Diffstat (limited to 'write_or_die.c')
-rw-r--r-- | write_or_die.c | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/write_or_die.c b/write_or_die.c index e7f82639ff..a119e1d208 100644 --- a/write_or_die.c +++ b/write_or_die.c @@ -33,45 +33,40 @@ void read_or_die(int fd, void *buf, size_t count) die("read error (%s)", strerror(errno)); } -void write_or_die(int fd, const void *buf, size_t count) +int write_in_full(int fd, const void *buf, size_t count) { const char *p = buf; - ssize_t written; + ssize_t total = 0; + ssize_t written = 0; while (count > 0) { written = xwrite(fd, p, count); - if (written == 0) - die("disk full?"); - else if (written < 0) { - if (errno == EPIPE) - exit(0); - die("write error (%s)", strerror(errno)); + if (written <= 0) { + if (total) + return total; + else + return written; } count -= written; p += written; + total += written; } + + return total; } -int write_in_full(int fd, const void *buf, size_t count) +void write_or_die(int fd, const void *buf, size_t count) { - const char *p = buf; - ssize_t total = 0; - ssize_t wcount = 0; + ssize_t written; - while (count > 0) { - wcount = xwrite(fd, p, count); - if (wcount <= 0) { - if (total) - return total; - else - return wcount; - } - count -= wcount; - p += wcount; - total += wcount; + written = write_in_full(fd, buf, count); + if (written == 0) + die("disk full?"); + else if (written < 0) { + if (errno == EPIPE) + exit(0); + die("write error (%s)", strerror(errno)); } - - return wcount; } int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg) |