xref: /plan9-contrib/sys/src/libbio/bwrite.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 
5 long
6 Bwrite(Biobufhdr *bp, void *ap, long count)
7 {
8 	long c;
9 	uchar *p;
10 	int i, n, oc;
11 
12 	p = ap;
13 	c = count;
14 	oc = bp->ocount;
15 
16 	while(c > 0) {
17 		n = -oc;
18 		if(n > c)
19 			n = c;
20 		if(n == 0) {
21 			if(bp->state != Bwactive)
22 				return Beof;
23 			i = write(bp->fid, bp->bbuf, bp->bsize);
24 			if(i != bp->bsize) {
25 				bp->state = Binactive;
26 				return Beof;
27 			}
28 			bp->offset += i;
29 			oc = -bp->bsize;
30 			continue;
31 		}
32 		memmove(bp->ebuf+oc, p, n);
33 		oc += n;
34 		c -= n;
35 		p += n;
36 	}
37 	bp->ocount = oc;
38 	return count-c;
39 }
40