binit.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
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 } |