1 #include "lib9.h"
2 #include <bio.h>
3
4 long
Bwrite(Biobuf * bp,void * ap,long count)5 Bwrite(Biobuf *bp, void *ap, long count)
6 {
7 long c;
8 uchar *p;
9 int i, n, oc;
10 char errbuf[ERRMAX];
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 errstr(errbuf, sizeof errbuf);
26 if(strstr(errbuf, "interrupt") == nil)
27 bp->state = Binactive;
28 errstr(errbuf, sizeof errbuf);
29 return Beof;
30 }
31 bp->offset += i;
32 oc = -bp->bsize;
33 continue;
34 }
35 memmove(bp->ebuf+oc, p, n);
36 oc += n;
37 c -= n;
38 p += n;
39 }
40 bp->ocount = oc;
41 return count-c;
42 }
43