xref: /inferno-os/libbio/binit.c (revision 72335078034e3cd7edcb1739556b405a3e1e9bf8)
137da2899SCharles.Forsyth #include	"lib9.h"
237da2899SCharles.Forsyth #include	<bio.h>
337da2899SCharles.Forsyth 
437da2899SCharles.Forsyth enum
537da2899SCharles.Forsyth {
637da2899SCharles.Forsyth 	MAXBUFS	= 20
737da2899SCharles.Forsyth };
837da2899SCharles.Forsyth 
937da2899SCharles.Forsyth static	Biobuf*	wbufs[MAXBUFS];
1037da2899SCharles.Forsyth static	int		atexitflag;
1137da2899SCharles.Forsyth 
1237da2899SCharles.Forsyth static
1337da2899SCharles.Forsyth void
batexit(void)1437da2899SCharles.Forsyth batexit(void)
1537da2899SCharles.Forsyth {
1637da2899SCharles.Forsyth 	Biobuf *bp;
1737da2899SCharles.Forsyth 	int i;
1837da2899SCharles.Forsyth 
1937da2899SCharles.Forsyth 	for(i=0; i<nelem(wbufs); i++) {
2037da2899SCharles.Forsyth 		bp = wbufs[i];
2137da2899SCharles.Forsyth 		if(bp != 0) {
2237da2899SCharles.Forsyth 			wbufs[i] = 0;
2337da2899SCharles.Forsyth 			Bflush(bp);
2437da2899SCharles.Forsyth 		}
2537da2899SCharles.Forsyth 	}
2637da2899SCharles.Forsyth }
2737da2899SCharles.Forsyth 
2837da2899SCharles.Forsyth static
2937da2899SCharles.Forsyth void
deinstall(Biobuf * bp)3037da2899SCharles.Forsyth deinstall(Biobuf *bp)
3137da2899SCharles.Forsyth {
3237da2899SCharles.Forsyth 	int i;
3337da2899SCharles.Forsyth 
3437da2899SCharles.Forsyth 	for(i=0; i<nelem(wbufs); i++)
3537da2899SCharles.Forsyth 		if(wbufs[i] == bp)
3637da2899SCharles.Forsyth 			wbufs[i] = 0;
3737da2899SCharles.Forsyth }
3837da2899SCharles.Forsyth 
3937da2899SCharles.Forsyth static
4037da2899SCharles.Forsyth void
install(Biobuf * bp)4137da2899SCharles.Forsyth install(Biobuf *bp)
4237da2899SCharles.Forsyth {
4337da2899SCharles.Forsyth 	int i;
4437da2899SCharles.Forsyth 
4537da2899SCharles.Forsyth 	deinstall(bp);
4637da2899SCharles.Forsyth 	for(i=0; i<nelem(wbufs); i++)
4737da2899SCharles.Forsyth 		if(wbufs[i] == 0) {
4837da2899SCharles.Forsyth 			wbufs[i] = bp;
4937da2899SCharles.Forsyth 			break;
5037da2899SCharles.Forsyth 		}
5137da2899SCharles.Forsyth 	if(atexitflag == 0) {
5237da2899SCharles.Forsyth 		atexitflag = 1;
5337da2899SCharles.Forsyth 		atexit(batexit);
5437da2899SCharles.Forsyth 	}
5537da2899SCharles.Forsyth }
5637da2899SCharles.Forsyth 
5737da2899SCharles.Forsyth int
Binits(Biobuf * bp,int f,int mode,uchar * p,int size)5837da2899SCharles.Forsyth Binits(Biobuf *bp, int f, int mode, uchar *p, int size)
5937da2899SCharles.Forsyth {
6037da2899SCharles.Forsyth 
6137da2899SCharles.Forsyth 	p += Bungetsize;	/* make room for Bungets */
6237da2899SCharles.Forsyth 	size -= Bungetsize;
6337da2899SCharles.Forsyth 
64*72335078SCharles Forsyth 	switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
6537da2899SCharles.Forsyth 	default:
6637da2899SCharles.Forsyth 		fprint(2, "Bopen: unknown mode %d\n", mode);
6737da2899SCharles.Forsyth 		return Beof;
6837da2899SCharles.Forsyth 
6937da2899SCharles.Forsyth 	case OREAD:
7037da2899SCharles.Forsyth 		bp->state = Bractive;
7137da2899SCharles.Forsyth 		bp->ocount = 0;
7237da2899SCharles.Forsyth 		break;
7337da2899SCharles.Forsyth 
7437da2899SCharles.Forsyth 	case OWRITE:
7537da2899SCharles.Forsyth 		install(bp);
7637da2899SCharles.Forsyth 		bp->state = Bwactive;
7737da2899SCharles.Forsyth 		bp->ocount = -size;
7837da2899SCharles.Forsyth 		break;
7937da2899SCharles.Forsyth 	}
8037da2899SCharles.Forsyth 	bp->bbuf = p;
8137da2899SCharles.Forsyth 	bp->ebuf = p+size;
8237da2899SCharles.Forsyth 	bp->bsize = size;
8337da2899SCharles.Forsyth 	bp->icount = 0;
8437da2899SCharles.Forsyth 	bp->gbuf = bp->ebuf;
8537da2899SCharles.Forsyth 	bp->fid = f;
8637da2899SCharles.Forsyth 	bp->flag = 0;
8737da2899SCharles.Forsyth 	bp->rdline = 0;
8837da2899SCharles.Forsyth 	bp->offset = 0;
8937da2899SCharles.Forsyth 	bp->runesize = 0;
9037da2899SCharles.Forsyth 	return 0;
9137da2899SCharles.Forsyth }
9237da2899SCharles.Forsyth 
9337da2899SCharles.Forsyth 
9437da2899SCharles.Forsyth int
Binit(Biobuf * bp,int f,int mode)9537da2899SCharles.Forsyth Binit(Biobuf *bp, int f, int mode)
9637da2899SCharles.Forsyth {
9737da2899SCharles.Forsyth 	return Binits(bp, f, mode, bp->b, sizeof(bp->b));
9837da2899SCharles.Forsyth }
9937da2899SCharles.Forsyth 
10037da2899SCharles.Forsyth Biobuf*
Bopen(char * name,int mode)10137da2899SCharles.Forsyth Bopen(char *name, int mode)
10237da2899SCharles.Forsyth {
10337da2899SCharles.Forsyth 	Biobuf *bp;
10437da2899SCharles.Forsyth 	int f;
10537da2899SCharles.Forsyth 
106*72335078SCharles Forsyth 	switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
10737da2899SCharles.Forsyth 	default:
10837da2899SCharles.Forsyth 		fprint(2, "Bopen: unknown mode %d\n", mode);
10937da2899SCharles.Forsyth 		return 0;
11037da2899SCharles.Forsyth 
11137da2899SCharles.Forsyth 	case OREAD:
11237da2899SCharles.Forsyth 		f = open(name, OREAD);
11337da2899SCharles.Forsyth 		break;
11437da2899SCharles.Forsyth 
11537da2899SCharles.Forsyth 	case OWRITE:
116*72335078SCharles Forsyth 		f = create(name, mode, 0666);
117*72335078SCharles Forsyth 		break;
118*72335078SCharles Forsyth 	}
11937da2899SCharles.Forsyth 	if(f < 0)
12037da2899SCharles.Forsyth 		return 0;
12137da2899SCharles.Forsyth 	bp = malloc(sizeof(Biobuf));
12237da2899SCharles.Forsyth 	if(bp == nil)
12337da2899SCharles.Forsyth 		return 0;
12437da2899SCharles.Forsyth 	Binits(bp, f, mode, bp->b, sizeof(bp->b));
12537da2899SCharles.Forsyth 	bp->flag = Bmagic;
12637da2899SCharles.Forsyth 	return bp;
12737da2899SCharles.Forsyth }
12837da2899SCharles.Forsyth 
12937da2899SCharles.Forsyth int
Bterm(Biobuf * bp)13037da2899SCharles.Forsyth Bterm(Biobuf *bp)
13137da2899SCharles.Forsyth {
132*72335078SCharles Forsyth 	int r;
13337da2899SCharles.Forsyth 
13437da2899SCharles.Forsyth 	deinstall(bp);
135*72335078SCharles Forsyth 	r = Bflush(bp);
13637da2899SCharles.Forsyth 	if(bp->flag == Bmagic) {
13737da2899SCharles.Forsyth 		bp->flag = 0;
13837da2899SCharles.Forsyth 		close(bp->fid);
139*72335078SCharles Forsyth 		bp->fid = -1;			/* prevent accidents */
14037da2899SCharles.Forsyth 		free(bp);
14137da2899SCharles.Forsyth 	}
142*72335078SCharles Forsyth 	/* otherwise opened with Binit(s) */
143*72335078SCharles Forsyth 	return r;
14437da2899SCharles.Forsyth }
145