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