xref: /inferno-os/libbio/bwrite.c (revision 72335078034e3cd7edcb1739556b405a3e1e9bf8)
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