diff options
Diffstat (limited to 'src/nix.cc')
-rw-r--r-- | src/nix.cc | 10 |
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; } |