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