summaryrefslogtreecommitdiff
path: root/sys/src/libbio/breadn.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-10-06 00:39:05 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-10-06 00:39:05 +0200
commitc0c9a9927f413e70f59158a10c460b1927985f44 (patch)
tree8455dbc351cf7c3536f21027a1ab56c407d585cc /sys/src/libbio/breadn.c
parent7e744bda2bfe0c664890b0f844591793fb08c976 (diff)
libbio: add Breadn
Diffstat (limited to 'sys/src/libbio/breadn.c')
-rw-r--r--sys/src/libbio/breadn.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/sys/src/libbio/breadn.c b/sys/src/libbio/breadn.c
new file mode 100644
index 000000000..fa335873f
--- /dev/null
+++ b/sys/src/libbio/breadn.c
@@ -0,0 +1,26 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+long
+Breadn(Biobufhdr *bp, void *data, long len)
+{
+ char *e, *p;
+ int n;
+
+ p = data;
+ e = p + len;
+ if(e < p){
+ Berror(bp, "invalid read length");
+ return -1;
+ }
+ while(p < e){
+ if((n = Bread(bp, p, e - p)) <= 0){
+ if(n < 0 && p == data)
+ return -1;
+ break;
+ }
+ p += n;
+ }
+ return p - (char*)data;
+}