xref: /plan9-contrib/sys/src/libbio/binit.c (revision efc4291f9554edd4b2b0148fe3a05435b4507286)
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
batexit(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
deinstall(Biobufhdr * bp)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
install(Biobufhdr * bp)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
Binits(Biobufhdr * bp,int f,int mode,uchar * p,int size)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 
607dd7cddfSDavid du Colombier 	switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
613e12c5d1SDavid du Colombier 	default:
627dd7cddfSDavid du Colombier 		fprint(2, "Binits: 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;
80219b2ee8SDavid 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
Binit(Biobuf * bp,int f,int mode)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*
Bopen(char * name,int mode)973e12c5d1SDavid du Colombier Bopen(char *name, int mode)
983e12c5d1SDavid du Colombier {
993e12c5d1SDavid du Colombier 	Biobuf *bp;
1003e12c5d1SDavid du Colombier 	int f;
1013e12c5d1SDavid du Colombier 
1027dd7cddfSDavid du Colombier 	switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
1033e12c5d1SDavid du Colombier 	default:
10490630c3aSDavid du Colombier 		fprint(2, "Bopen: unknown mode %#x\n", mode);
1053e12c5d1SDavid du Colombier 		return 0;
1063e12c5d1SDavid du Colombier 	case OREAD:
10790630c3aSDavid du Colombier 		f = open(name, mode);
1083e12c5d1SDavid du Colombier 		break;
1093e12c5d1SDavid du Colombier 	case OWRITE:
11090630c3aSDavid du Colombier 		f = create(name, mode, 0666);
111*efc4291fSDavid du Colombier 		break;
112*efc4291fSDavid du Colombier 	}
1133e12c5d1SDavid du Colombier 	if(f < 0)
1143e12c5d1SDavid du Colombier 		return 0;
1153e12c5d1SDavid du Colombier 	bp = malloc(sizeof(Biobuf));
1163e12c5d1SDavid du Colombier 	Binits(bp, f, mode, bp->b, sizeof(bp->b));
117*efc4291fSDavid du Colombier 	bp->flag = Bmagic;			/* mark bp open & malloced */
1183e12c5d1SDavid du Colombier 	return bp;
1193e12c5d1SDavid du Colombier }
1203e12c5d1SDavid du Colombier 
1213e12c5d1SDavid du Colombier int
Bterm(Biobufhdr * bp)122219b2ee8SDavid du Colombier Bterm(Biobufhdr *bp)
1233e12c5d1SDavid du Colombier {
124*efc4291fSDavid du Colombier 	int r;
1253e12c5d1SDavid du Colombier 
1263e12c5d1SDavid du Colombier 	deinstall(bp);
127*efc4291fSDavid du Colombier 	r = Bflush(bp);
1283e12c5d1SDavid du Colombier 	if(bp->flag == Bmagic) {
1293e12c5d1SDavid du Colombier 		bp->flag = 0;
1303e12c5d1SDavid du Colombier 		close(bp->fid);
131*efc4291fSDavid du Colombier 		bp->fid = -1;			/* prevent accidents */
1323e12c5d1SDavid du Colombier 		free(bp);
1333e12c5d1SDavid du Colombier 	}
134*efc4291fSDavid du Colombier 	/* otherwise opened with Binit(s) */
135*efc4291fSDavid du Colombier 	return r;
1363e12c5d1SDavid du Colombier }
137