about summary refs log tree commit diff
path: root/misc/subr.c
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2006-02-05 11:34:18 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2006-02-05 11:34:18 +0000
commit38418fcd2bb0d6ae159fecbb527bfa02ea9c9c3e (patch)
tree0deadf5fac6fca207d04826a68b97bd4277ca369 /misc/subr.c
parent65f3eb2185e3cb9ed91f3c76d68673fc0b8d4d4c (diff)
downloadbtpd-38418fcd2bb0d6ae159fecbb527bfa02ea9c9c3e.tar.gz
btpd-38418fcd2bb0d6ae159fecbb527bfa02ea9c9c3e.zip
Add functions read_fully and write_fully. They are simpler alternatives to
read and write on blocking sockets.

Diffstat (limited to 'misc/subr.c')
-rw-r--r--misc/subr.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/misc/subr.c b/misc/subr.c
index 729d588..e16a7dc 100644
--- a/misc/subr.c
+++ b/misc/subr.c
@@ -174,3 +174,35 @@ rand_between(long min, long max)
 {
     return min + (long)rint((double)random() * (max - min) / RAND_MAX);
 }
+
+int
+write_fully(int fd, const void *buf, size_t len)
+{
+    ssize_t nw;
+    size_t off = 0;
+
+    while (off < len) {
+        nw = write(fd, buf + off, len - off);
+        if (nw == -1)
+            return errno;
+        off += nw;
+    }
+    return 0;
+}
+
+int
+read_fully(int fd, void *buf, size_t len)
+{
+    ssize_t nread;
+    size_t off = 0;
+
+    while (off < len) {
+        nread = read(fd, buf + off, len - off);
+        if (nread == 0)
+            return ECONNRESET;
+        else if (nread == -1)
+            return errno;
+        off += nread;
+    }
+    return 0;
+}