13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier long
Bwrite(Biobufhdr * bp,void * ap,long count)63e12c5d1SDavid du Colombier Bwrite(Biobufhdr *bp, void *ap, long count)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier long c;
93e12c5d1SDavid du Colombier uchar *p;
103e12c5d1SDavid du Colombier int i, n, oc;
11*9a747e4fSDavid du Colombier char errbuf[ERRMAX];
123e12c5d1SDavid du Colombier
133e12c5d1SDavid du Colombier p = ap;
143e12c5d1SDavid du Colombier c = count;
153e12c5d1SDavid du Colombier oc = bp->ocount;
163e12c5d1SDavid du Colombier
173e12c5d1SDavid du Colombier while(c > 0) {
183e12c5d1SDavid du Colombier n = -oc;
193e12c5d1SDavid du Colombier if(n > c)
203e12c5d1SDavid du Colombier n = c;
213e12c5d1SDavid du Colombier if(n == 0) {
223e12c5d1SDavid du Colombier if(bp->state != Bwactive)
233e12c5d1SDavid du Colombier return Beof;
243e12c5d1SDavid du Colombier i = write(bp->fid, bp->bbuf, bp->bsize);
253e12c5d1SDavid du Colombier if(i != bp->bsize) {
26*9a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
277dd7cddfSDavid du Colombier if(strstr(errbuf, "interrupt") == nil)
283e12c5d1SDavid du Colombier bp->state = Binactive;
29*9a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
303e12c5d1SDavid du Colombier return Beof;
313e12c5d1SDavid du Colombier }
323e12c5d1SDavid du Colombier bp->offset += i;
333e12c5d1SDavid du Colombier oc = -bp->bsize;
343e12c5d1SDavid du Colombier continue;
353e12c5d1SDavid du Colombier }
363e12c5d1SDavid du Colombier memmove(bp->ebuf+oc, p, n);
373e12c5d1SDavid du Colombier oc += n;
383e12c5d1SDavid du Colombier c -= n;
393e12c5d1SDavid du Colombier p += n;
403e12c5d1SDavid du Colombier }
413e12c5d1SDavid du Colombier bp->ocount = oc;
423e12c5d1SDavid du Colombier return count-c;
433e12c5d1SDavid du Colombier }
44