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