about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nix.cc10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/nix.cc b/src/nix.cc
index ae016824d1f9..fe762798e799 100644
--- a/src/nix.cc
+++ b/src/nix.cc
@@ -216,8 +216,12 @@ struct StdoutSink : DumpSink
     virtual void operator ()
         (const unsigned char * data, unsigned int len)
     {
-        if (write(STDOUT_FILENO, (char *) data, len) != (ssize_t) len)
-            throw SysError("writing to stdout");
+        while (len) {
+            ssize_t res = write(STDOUT_FILENO, (char *) data, len);
+            if (res == -1) throw SysError("writing to stdout");
+            len -= res;
+            data += res;
+        }
     }
 };
 
@@ -249,7 +253,7 @@ struct StdinSource : RestoreSource
         while (len) {
             ssize_t res = read(STDIN_FILENO, (char *) data, len);
             if (res == -1) throw SysError("reading from stdin");
-            if (res == 0) throw SysError("unexpected end-of-file on stdin");
+            if (res == 0) throw Error("unexpected end-of-file on stdin");
             len -= res;
             data += res;
         }