summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd_fsck.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/cmd_fsck.c b/cmd_fsck.c
index 81e589b4..262ac1bc 100644
--- a/cmd_fsck.c
+++ b/cmd_fsck.c
@@ -35,7 +35,7 @@ static void setnonblocking(int fd)
static int do_splice(int rfd, int wfd)
{
- char buf[4096];
+ char buf[4096], *b = buf;
int r = read(rfd, buf, sizeof(buf));
if (r < 0 && errno == EAGAIN)
@@ -44,8 +44,13 @@ static int do_splice(int rfd, int wfd)
return r;
if (!r)
return 1;
- if (write(wfd, buf, r) != r)
- die("write error");
+ do {
+ ssize_t w = write(wfd, b, r);
+ if (w < 0)
+ die("%s: write error: %m", __func__);
+ r -= w;
+ b += w;
+ } while (r);
return 0;
}