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
Bread(Biobufhdr * bp,void * ap,long count)63e12c5d1SDavid du Colombier Bread(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, ic;
113e12c5d1SDavid du Colombier
123e12c5d1SDavid du Colombier p = ap;
133e12c5d1SDavid du Colombier c = count;
143e12c5d1SDavid du Colombier ic = bp->icount;
153e12c5d1SDavid du Colombier
163e12c5d1SDavid du Colombier while(c > 0) {
173e12c5d1SDavid du Colombier n = -ic;
183e12c5d1SDavid du Colombier if(n > c)
193e12c5d1SDavid du Colombier n = c;
203e12c5d1SDavid du Colombier if(n == 0) {
213e12c5d1SDavid du Colombier if(bp->state != Bractive)
223e12c5d1SDavid du Colombier break;
233e12c5d1SDavid du Colombier i = read(bp->fid, bp->bbuf, bp->bsize);
243e12c5d1SDavid du Colombier if(i <= 0) {
253e12c5d1SDavid du Colombier bp->state = Bracteof;
263e12c5d1SDavid du Colombier if(i < 0)
273e12c5d1SDavid du Colombier bp->state = Binactive;
283e12c5d1SDavid du Colombier break;
293e12c5d1SDavid du Colombier }
30219b2ee8SDavid du Colombier bp->gbuf = bp->bbuf;
313e12c5d1SDavid du Colombier bp->offset += i;
32219b2ee8SDavid du Colombier if(i < bp->bsize) {
333e12c5d1SDavid du Colombier memmove(bp->ebuf-i, bp->bbuf, i);
34219b2ee8SDavid du Colombier bp->gbuf = bp->ebuf-i;
35219b2ee8SDavid du Colombier }
363e12c5d1SDavid du Colombier ic = -i;
373e12c5d1SDavid du Colombier continue;
383e12c5d1SDavid du Colombier }
393e12c5d1SDavid du Colombier memmove(p, bp->ebuf+ic, n);
403e12c5d1SDavid du Colombier c -= n;
413e12c5d1SDavid du Colombier ic += n;
423e12c5d1SDavid du Colombier p += n;
433e12c5d1SDavid du Colombier }
443e12c5d1SDavid du Colombier bp->icount = ic;
45*59cc4ca5SDavid du Colombier if(count == c && bp->state == Binactive)
46*59cc4ca5SDavid du Colombier return -1;
473e12c5d1SDavid du Colombier return count-c;
483e12c5d1SDavid du Colombier }
49