summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>2014-01-15 00:31:35 +0000
committerMarc Espie <espie@cvs.openbsd.org>2014-01-15 00:31:35 +0000
commitbdce60a2a46f398713376ed804f2d15f0ff15a1e (patch)
treecad4711257e92b6df2897475882b6576a5fbeda1
parent91c44e3ea297825ce56fa2c9ecfd74257e131c43 (diff)
pipes mean read/write may short out.
okay tedu@
-rw-r--r--usr.bin/signify/signify.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/usr.bin/signify/signify.c b/usr.bin/signify/signify.c
index 9bc6bacedc9..cf9e239657a 100644
--- a/usr.bin/signify/signify.c
+++ b/usr.bin/signify/signify.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: signify.c,v 1.37 2014/01/14 21:34:30 tedu Exp $ */
+/* $OpenBSD: signify.c,v 1.38 2014/01/15 00:31:34 espie Exp $ */
/*
* Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
*
@@ -120,12 +120,15 @@ static void
readall(int fd, void *buf, size_t len, const char *filename)
{
ssize_t x;
-
- x = read(fd, buf, len);
- if (x == -1) {
- err(1, "read from %s", filename);
- } else if (x != len) {
- errx(1, "short read from %s", filename);
+
+ while (len != 0) {
+ x = read(fd, buf, len);
+ if (x == -1)
+ err(1, "read from %s", filename);
+ else {
+ len -= x;
+ buf = (char*)buf + x;
+ }
}
}
@@ -200,12 +203,15 @@ static void
writeall(int fd, const void *buf, size_t len, const char *filename)
{
ssize_t x;
-
- x = write(fd, buf, len);
- if (x == -1) {
- err(1, "write to %s", filename);
- } else if (x != len) {
- errx(1, "short write to %s", filename);
+
+ while (len != 0) {
+ x = write(fd, buf, len);
+ if (x == -1)
+ err(1, "write to %s", filename);
+ else {
+ len -= x;
+ buf = (char*)buf + x;
+ }
}
}