xref: /plan9/sys/src/libbio/bwrite.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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