xref: /plan9/sys/src/libbio/binit.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier static	Biobufhdr*	wbufs[20];
63e12c5d1SDavid du Colombier static	int		atexitflag;
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier static
93e12c5d1SDavid du Colombier void
103e12c5d1SDavid du Colombier batexit(void)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	Biobufhdr *bp;
133e12c5d1SDavid du Colombier 	int i;
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier 	for(i=0; i<nelem(wbufs); i++) {
163e12c5d1SDavid du Colombier 		bp = wbufs[i];
173e12c5d1SDavid du Colombier 		if(bp != 0) {
183e12c5d1SDavid du Colombier 			wbufs[i] = 0;
193e12c5d1SDavid du Colombier 			Bflush(bp);
203e12c5d1SDavid du Colombier 		}
213e12c5d1SDavid du Colombier 	}
223e12c5d1SDavid du Colombier }
233e12c5d1SDavid du Colombier 
243e12c5d1SDavid du Colombier static
253e12c5d1SDavid du Colombier void
263e12c5d1SDavid du Colombier deinstall(Biobufhdr *bp)
273e12c5d1SDavid du Colombier {
283e12c5d1SDavid du Colombier 	int i;
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier 	for(i=0; i<nelem(wbufs); i++)
313e12c5d1SDavid du Colombier 		if(wbufs[i] == bp)
323e12c5d1SDavid du Colombier 			wbufs[i] = 0;
333e12c5d1SDavid du Colombier }
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier static
363e12c5d1SDavid du Colombier void
373e12c5d1SDavid du Colombier install(Biobufhdr *bp)
383e12c5d1SDavid du Colombier {
393e12c5d1SDavid du Colombier 	int i;
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier 	deinstall(bp);
423e12c5d1SDavid du Colombier 	for(i=0; i<nelem(wbufs); i++)
433e12c5d1SDavid du Colombier 		if(wbufs[i] == 0) {
443e12c5d1SDavid du Colombier 			wbufs[i] = bp;
453e12c5d1SDavid du Colombier 			break;
463e12c5d1SDavid du Colombier 		}
473e12c5d1SDavid du Colombier 	if(atexitflag == 0) {
483e12c5d1SDavid du Colombier 		atexitflag = 1;
493e12c5d1SDavid du Colombier 		atexit(batexit);
503e12c5d1SDavid du Colombier 	}
513e12c5d1SDavid du Colombier }
523e12c5d1SDavid du Colombier 
533e12c5d1SDavid du Colombier int
543e12c5d1SDavid du Colombier Binits(Biobufhdr *bp, int f, int mode, uchar *p, int size)
553e12c5d1SDavid du Colombier {
563e12c5d1SDavid du Colombier 
573e12c5d1SDavid du Colombier 	p += Bungetsize;	/* make room for Bungets */
583e12c5d1SDavid du Colombier 	size -= Bungetsize;
593e12c5d1SDavid du Colombier 
603e12c5d1SDavid du Colombier 	switch(mode) {
613e12c5d1SDavid du Colombier 	default:
623e12c5d1SDavid du Colombier 		fprint(2, "Bopen: unknown mode %d\n", mode);
633e12c5d1SDavid du Colombier 		return Beof;
643e12c5d1SDavid du Colombier 
653e12c5d1SDavid du Colombier 	case OREAD:
663e12c5d1SDavid du Colombier 		bp->state = Bractive;
673e12c5d1SDavid du Colombier 		bp->ocount = 0;
683e12c5d1SDavid du Colombier 		break;
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier 	case OWRITE:
713e12c5d1SDavid du Colombier 		install(bp);
723e12c5d1SDavid du Colombier 		bp->state = Bwactive;
733e12c5d1SDavid du Colombier 		bp->ocount = -size;
743e12c5d1SDavid du Colombier 		break;
753e12c5d1SDavid du Colombier 	}
763e12c5d1SDavid du Colombier 	bp->bbuf = p;
773e12c5d1SDavid du Colombier 	bp->ebuf = p+size;
783e12c5d1SDavid du Colombier 	bp->bsize = size;
793e12c5d1SDavid du Colombier 	bp->icount = 0;
80*219b2ee8SDavid du Colombier 	bp->gbuf = bp->ebuf;
813e12c5d1SDavid du Colombier 	bp->fid = f;
823e12c5d1SDavid du Colombier 	bp->flag = 0;
833e12c5d1SDavid du Colombier 	bp->rdline = 0;
843e12c5d1SDavid du Colombier 	bp->offset = 0;
853e12c5d1SDavid du Colombier 	bp->runesize = 0;
863e12c5d1SDavid du Colombier 	return 0;
873e12c5d1SDavid du Colombier }
883e12c5d1SDavid du Colombier 
893e12c5d1SDavid du Colombier 
903e12c5d1SDavid du Colombier int
913e12c5d1SDavid du Colombier Binit(Biobuf *bp, int f, int mode)
923e12c5d1SDavid du Colombier {
933e12c5d1SDavid du Colombier 	return Binits(bp, f, mode, bp->b, sizeof(bp->b));
943e12c5d1SDavid du Colombier }
953e12c5d1SDavid du Colombier 
963e12c5d1SDavid du Colombier Biobuf*
973e12c5d1SDavid du Colombier Bopen(char *name, int mode)
983e12c5d1SDavid du Colombier {
993e12c5d1SDavid du Colombier 	Biobuf *bp;
1003e12c5d1SDavid du Colombier 	int f;
1013e12c5d1SDavid du Colombier 
1023e12c5d1SDavid du Colombier 	switch(mode) {
1033e12c5d1SDavid du Colombier 	default:
1043e12c5d1SDavid du Colombier 		fprint(2, "Bopen: unknown mode %d\n", mode);
1053e12c5d1SDavid du Colombier 		return 0;
1063e12c5d1SDavid du Colombier 
1073e12c5d1SDavid du Colombier 	case OREAD:
1083e12c5d1SDavid du Colombier 		f = open(name, OREAD);
1093e12c5d1SDavid du Colombier 		if(f < 0)
1103e12c5d1SDavid du Colombier 			return 0;
1113e12c5d1SDavid du Colombier 		break;
1123e12c5d1SDavid du Colombier 
1133e12c5d1SDavid du Colombier 	case OWRITE:
1143e12c5d1SDavid du Colombier 		f = create(name, OWRITE, 0666);
1153e12c5d1SDavid du Colombier 		if(f < 0)
1163e12c5d1SDavid du Colombier 			return 0;
1173e12c5d1SDavid du Colombier 	}
1183e12c5d1SDavid du Colombier 	bp = malloc(sizeof(Biobuf));
1193e12c5d1SDavid du Colombier 	Binits(bp, f, mode, bp->b, sizeof(bp->b));
1203e12c5d1SDavid du Colombier 	bp->flag = Bmagic;
1213e12c5d1SDavid du Colombier 	return bp;
1223e12c5d1SDavid du Colombier }
1233e12c5d1SDavid du Colombier 
1243e12c5d1SDavid du Colombier int
125*219b2ee8SDavid du Colombier Bterm(Biobufhdr *bp)
1263e12c5d1SDavid du Colombier {
1273e12c5d1SDavid du Colombier 
1283e12c5d1SDavid du Colombier 	deinstall(bp);
1293e12c5d1SDavid du Colombier 	Bflush(bp);
1303e12c5d1SDavid du Colombier 	if(bp->flag == Bmagic) {
1313e12c5d1SDavid du Colombier 		bp->flag = 0;
1323e12c5d1SDavid du Colombier 		close(bp->fid);
1333e12c5d1SDavid du Colombier 		free(bp);
1343e12c5d1SDavid du Colombier 	}
1353e12c5d1SDavid du Colombier 	return 0;
1363e12c5d1SDavid du Colombier }
137