about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libutil/archive.cc17
1 files changed, 6 insertions, 11 deletions
diff --git a/src/libutil/archive.cc b/src/libutil/archive.cc
index 2b8fb2f10adb..27b1726ad046 100644
--- a/src/libutil/archive.cc
+++ b/src/libutil/archive.cc
@@ -79,19 +79,15 @@ static void dumpContents(const Path & path, unsigned int size,
     if (fd == -1) throw SysError(format("opening file `%1%'") % path);
     
     unsigned char buf[65536];
+    unsigned int left = size;
 
-    unsigned int total = 0;
-    ssize_t n;
-    while ((n = read(fd, buf, sizeof(buf)))) {
-        checkInterrupt();
-        if (n == -1) throw SysError("reading file " + path);
-        total += n;
+    while (left >= 0) {
+        size_t n = left > sizeof(buf) ? sizeof(buf) : left;
+        readFull(fd, buf, n);
+        left -= n;
         sink(buf, n);
     }
 
-    if (total != size)
-        throw SysError("file changed while reading it: " + path);
-
     writePadding(size, sink);
 }
 
@@ -231,8 +227,7 @@ static void restoreContents(int fd, const Path & path, RestoreSource & source)
         unsigned int n = sizeof(buf);
         if (n > left) n = left;
         source(buf, n);
-        if (write(fd, buf, n) != (ssize_t) n)
-            throw SysError("writing file " + path);
+        writeFull(fd, buf, n);
         left -= n;
     }