aboutsummaryrefslogtreecommitdiffstats
path: root/src/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/util.c b/src/util.c
index 4654789..299dee8 100644
--- a/src/util.c
+++ b/src/util.c
@@ -112,18 +112,34 @@ int
writeall(int fd, void *buf, size_t n)
{
char *buffer = buf;
- size_t ptr = 0;
ssize_t r;
- while (ptr < n) {
+ while (n) {
r = write(fd, buffer, n);
if (r < 0)
return -1;
- buffer += (size_t)ptr;
- n -= (size_t)ptr;
+ buffer += (size_t)r;
+ n -= (size_t)r;
}
return 0;
}
+ssize_t
+readall(int fd, void *buf, size_t n)
+{
+ char *buffer = buf;
+ size_t ptr = 0;
+ ssize_t r;
+ for (;;) {
+ r = read(fd, buffer + ptr, n - ptr);
+ if (r < 0)
+ return -1;
+ if (r == 0)
+ break;
+ r += (size_t)r;
+ }
+ return r;
+}
+
static inline pid_t
enfork(int status)