aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nix.cc12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/nix.cc b/src/nix.cc
index 19c73165c..8fc0fa2c3 100644
--- a/src/nix.cc
+++ b/src/nix.cc
@@ -250,11 +250,13 @@ struct StdinSource : RestoreSource
{
virtual void operator () (const unsigned char * data, unsigned int len)
{
- ssize_t res = read(STDIN_FILENO, (char *) data, len);
- if (res == -1)
- throw SysError("reading from stdin");
- if (res != (ssize_t) len)
- throw Error("not enough data available on stdin");
+ 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");
+ len -= res;
+ data += res;
+ }
}
};