137da2899SCharles.Forsyth #include "lib9.h"
237da2899SCharles.Forsyth #include <bio.h>
337da2899SCharles.Forsyth
437da2899SCharles.Forsyth long
Bwrite(Biobuf * bp,void * ap,long count)537da2899SCharles.Forsyth Bwrite(Biobuf *bp, void *ap, long count)
637da2899SCharles.Forsyth {
737da2899SCharles.Forsyth long c;
837da2899SCharles.Forsyth uchar *p;
937da2899SCharles.Forsyth int i, n, oc;
10*72335078SCharles Forsyth char errbuf[ERRMAX];
1137da2899SCharles.Forsyth
1237da2899SCharles.Forsyth p = ap;
1337da2899SCharles.Forsyth c = count;
1437da2899SCharles.Forsyth oc = bp->ocount;
1537da2899SCharles.Forsyth
1637da2899SCharles.Forsyth while(c > 0) {
1737da2899SCharles.Forsyth n = -oc;
1837da2899SCharles.Forsyth if(n > c)
1937da2899SCharles.Forsyth n = c;
2037da2899SCharles.Forsyth if(n == 0) {
2137da2899SCharles.Forsyth if(bp->state != Bwactive)
2237da2899SCharles.Forsyth return Beof;
2337da2899SCharles.Forsyth i = write(bp->fid, bp->bbuf, bp->bsize);
2437da2899SCharles.Forsyth if(i != bp->bsize) {
25*72335078SCharles Forsyth errstr(errbuf, sizeof errbuf);
26*72335078SCharles Forsyth if(strstr(errbuf, "interrupt") == nil)
2737da2899SCharles.Forsyth bp->state = Binactive;
28*72335078SCharles Forsyth errstr(errbuf, sizeof errbuf);
2937da2899SCharles.Forsyth return Beof;
3037da2899SCharles.Forsyth }
3137da2899SCharles.Forsyth bp->offset += i;
3237da2899SCharles.Forsyth oc = -bp->bsize;
3337da2899SCharles.Forsyth continue;
3437da2899SCharles.Forsyth }
3537da2899SCharles.Forsyth memmove(bp->ebuf+oc, p, n);
3637da2899SCharles.Forsyth oc += n;
3737da2899SCharles.Forsyth c -= n;
3837da2899SCharles.Forsyth p += n;
3937da2899SCharles.Forsyth }
4037da2899SCharles.Forsyth bp->ocount = oc;
4137da2899SCharles.Forsyth return count-c;
4237da2899SCharles.Forsyth }
43