binit.c (1983B)
1 #include "lib9.h" 2 #include <bio.h> 3 4 enum 5 { 6 MAXBUFS = 20 7 }; 8 9 static Biobuf* wbufs[MAXBUFS]; 10 static int atexitflag; 11 12 static 13 void 14 batexit(void) 15 { 16 Biobuf *bp; 17 int i; 18 19 for(i=0; i<MAXBUFS; i++) { 20 bp = wbufs[i]; 21 if(bp != 0) { 22 wbufs[i] = 0; 23 Bflush(bp); 24 } 25 } 26 } 27 28 static 29 void 30 deinstall(Biobuf *bp) 31 { 32 int i; 33 34 for(i=0; i<MAXBUFS; i++) 35 if(wbufs[i] == bp) 36 wbufs[i] = 0; 37 } 38 39 static 40 void 41 install(Biobuf *bp) 42 { 43 int i; 44 45 deinstall(bp); 46 for(i=0; i<MAXBUFS; i++) 47 if(wbufs[i] == 0) { 48 wbufs[i] = bp; 49 break; 50 } 51 if(atexitflag == 0) { 52 atexitflag = 1; 53 atexit(batexit); 54 } 55 } 56 57 int 58 Binits(Biobuf *bp, int f, int mode, unsigned char *p, int size) 59 { 60 61 p += Bungetsize; /* make room for Bungets */ 62 size -= Bungetsize; 63 64 switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) { 65 default: 66 fprint(2, "Bopen: unknown mode %d\n", mode); 67 return Beof; 68 69 case OREAD: 70 bp->state = Bractive; 71 bp->ocount = 0; 72 break; 73 74 case OWRITE: 75 install(bp); 76 bp->state = Bwactive; 77 bp->ocount = -size; 78 break; 79 } 80 bp->bbuf = p; 81 bp->ebuf = p+size; 82 bp->bsize = size; 83 bp->icount = 0; 84 bp->gbuf = bp->ebuf; 85 bp->fid = f; 86 bp->flag = 0; 87 bp->rdline = 0; 88 bp->offset = 0; 89 bp->runesize = 0; 90 return 0; 91 } 92 93 94 int 95 Binit(Biobuf *bp, int f, int mode) 96 { 97 return Binits(bp, f, mode, bp->b, sizeof(bp->b)); 98 } 99 100 Biobuf* 101 Bfdopen(int f, int mode) 102 { 103 Biobuf *bp; 104 105 bp = malloc(sizeof(Biobuf)); 106 if(bp == 0) 107 return 0; 108 Binits(bp, f, mode, bp->b, sizeof(bp->b)); 109 bp->flag = Bmagic; 110 return bp; 111 } 112 113 Biobuf* 114 Bopen(char *name, int mode) 115 { 116 Biobuf *bp; 117 int f; 118 119 switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) { 120 default: 121 fprint(2, "Bopen: unknown mode %d\n", mode); 122 return 0; 123 124 case OREAD: 125 f = open(name, mode); 126 if(f < 0) 127 return 0; 128 break; 129 130 case OWRITE: 131 f = create(name, mode, 0666); 132 if(f < 0) 133 return 0; 134 } 135 bp = Bfdopen(f, mode); 136 if(bp == 0) 137 close(f); 138 return bp; 139 } 140 141 int 142 Bterm(Biobuf *bp) 143 { 144 145 deinstall(bp); 146 Bflush(bp); 147 if(bp->flag == Bmagic) { 148 bp->flag = 0; 149 close(bp->fid); 150 free(bp); 151 } 152 return 0; 153 }