Blob
1 #include "lib9.h"2 #include <bio.h>4 enum5 {6 MAXBUFS = 207 };9 static Biobuf* wbufs[MAXBUFS];10 static int atexitflag;12 static13 void14 batexit(void)15 {16 Biobuf *bp;17 int i;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 }28 static29 void30 deinstall(Biobuf *bp)31 {32 int i;34 for(i=0; i<MAXBUFS; i++)35 if(wbufs[i] == bp)36 wbufs[i] = 0;37 }39 static40 void41 install(Biobuf *bp)42 {43 int i;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 }57 int58 Binits(Biobuf *bp, int f, int mode, unsigned char *p, int size)59 {61 p += Bungetsize; /* make room for Bungets */62 size -= Bungetsize;64 switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {65 default:66 fprint(2, "Bopen: unknown mode %d\n", mode);67 return Beof;69 case OREAD:70 bp->state = Bractive;71 bp->ocount = 0;72 break;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 }94 int95 Binit(Biobuf *bp, int f, int mode)96 {97 return Binits(bp, f, mode, bp->b, sizeof(bp->b));98 }100 Biobuf*101 Bfdopen(int f, int mode)102 {103 Biobuf *bp;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 }113 Biobuf*114 Bopen(char *name, int mode)115 {116 Biobuf *bp;117 int f;119 switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {120 default:121 fprint(2, "Bopen: unknown mode %d\n", mode);122 return 0;124 case OREAD:125 f = open(name, mode);126 if(f < 0)127 return 0;128 break;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 }141 int142 Bterm(Biobuf *bp)143 {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 }