blob: d76168b7fdba8169c16f8c1c375e3c1b9a14dece [file] [log] [blame]
rscb2cfc4e2003-09-30 17:47:41 +00001#include "lib9.h"
2#include <bio.h>
3
4enum
5{
6 MAXBUFS = 20
7};
8
9static Biobuf* wbufs[MAXBUFS];
10static int atexitflag;
11
12static
13void
14batexit(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
28static
29void
30deinstall(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
39static
40void
41install(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
57int
58Binits(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) {
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
94int
95Binit(Biobuf *bp, int f, int mode)
96{
97 return Binits(bp, f, mode, bp->b, sizeof(bp->b));
98}
99
100Biobuf*
101Bopen(char *name, int mode)
102{
103 Biobuf *bp;
104 int f;
105
106 switch(mode) {
107 default:
108 fprint(2, "Bopen: unknown mode %d\n", mode);
109 return 0;
110
111 case OREAD:
112 f = open(name, OREAD);
113 if(f < 0)
114 return 0;
115 break;
116
117 case OWRITE:
118 f = creat(name, 0666);
119 if(f < 0)
120 return 0;
121 }
122 bp = malloc(sizeof(Biobuf));
123 if(bp == 0)
124 return 0;
125 Binits(bp, f, mode, bp->b, sizeof(bp->b));
126 bp->flag = Bmagic;
127 return bp;
128}
129
130int
131Bterm(Biobuf *bp)
132{
133
134 deinstall(bp);
135 Bflush(bp);
136 if(bp->flag == Bmagic) {
137 bp->flag = 0;
138 close(bp->fid);
139 free(bp);
140 }
141 return 0;
142}