Blame


1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
4 a0d146ed 2005-07-12 devnull
5 a0d146ed 2005-07-12 devnull Index *mainindex;
6 a0d146ed 2005-07-12 devnull int paranoid = 1; /* should verify hashes on disk read */
7 a0d146ed 2005-07-12 devnull
8 a0d146ed 2005-07-12 devnull static ArenaPart *configarenas(char *file);
9 a0d146ed 2005-07-12 devnull static ISect *configisect(char *file);
10 a0d146ed 2005-07-12 devnull static Bloom *configbloom(char *file);
11 a0d146ed 2005-07-12 devnull
12 a0d146ed 2005-07-12 devnull int
13 a0d146ed 2005-07-12 devnull initventi(char *file, Config *conf)
14 a0d146ed 2005-07-12 devnull {
15 a0d146ed 2005-07-12 devnull statsinit();
16 a0d146ed 2005-07-12 devnull
17 a0d146ed 2005-07-12 devnull if(file == nil){
18 a0d146ed 2005-07-12 devnull seterr(EOk, "no configuration file");
19 a0d146ed 2005-07-12 devnull return -1;
20 a0d146ed 2005-07-12 devnull }
21 a0d146ed 2005-07-12 devnull if(runconfig(file, conf) < 0){
22 a0d146ed 2005-07-12 devnull seterr(EOk, "can't initialize venti: %r");
23 a0d146ed 2005-07-12 devnull return -1;
24 a0d146ed 2005-07-12 devnull }
25 a0d146ed 2005-07-12 devnull mainindex = initindex(conf->index, conf->sects, conf->nsects);
26 a0d146ed 2005-07-12 devnull if(mainindex == nil)
27 a0d146ed 2005-07-12 devnull return -1;
28 a0d146ed 2005-07-12 devnull mainindex->bloom = conf->bloom;
29 a0d146ed 2005-07-12 devnull return 0;
30 a0d146ed 2005-07-12 devnull }
31 a0d146ed 2005-07-12 devnull
32 a0d146ed 2005-07-12 devnull static int
33 a0d146ed 2005-07-12 devnull numok(char *s)
34 a0d146ed 2005-07-12 devnull {
35 a0d146ed 2005-07-12 devnull char *p;
36 a0d146ed 2005-07-12 devnull
37 a0d146ed 2005-07-12 devnull strtoull(s, &p, 0);
38 a0d146ed 2005-07-12 devnull if(p == s)
39 a0d146ed 2005-07-12 devnull return -1;
40 a0d146ed 2005-07-12 devnull if(*p == 0)
41 a0d146ed 2005-07-12 devnull return 0;
42 a0d146ed 2005-07-12 devnull if(p[1] == 0 && strchr("MmGgKk", *p))
43 a0d146ed 2005-07-12 devnull return 0;
44 a0d146ed 2005-07-12 devnull return 0;
45 a0d146ed 2005-07-12 devnull }
46 a0d146ed 2005-07-12 devnull
47 a0d146ed 2005-07-12 devnull /*
48 a0d146ed 2005-07-12 devnull * configs :
49 a0d146ed 2005-07-12 devnull * | configs config
50 a0d146ed 2005-07-12 devnull * config : "isect" filename
51 a0d146ed 2005-07-12 devnull * | "arenas" filename
52 a0d146ed 2005-07-12 devnull * | "index" name
53 a0d146ed 2005-07-12 devnull * | "bcmem" num
54 a0d146ed 2005-07-12 devnull * | "mem" num
55 a0d146ed 2005-07-12 devnull * | "icmem" num
56 a0d146ed 2005-07-12 devnull * | "queuewrites"
57 a0d146ed 2005-07-12 devnull * | "httpaddr" address
58 a0d146ed 2005-07-12 devnull * | "addr" address
59 a0d146ed 2005-07-12 devnull *
60 a0d146ed 2005-07-12 devnull * '#' and \n delimit comments
61 a0d146ed 2005-07-12 devnull */
62 a0d146ed 2005-07-12 devnull enum
63 a0d146ed 2005-07-12 devnull {
64 a0d146ed 2005-07-12 devnull MaxArgs = 2
65 a0d146ed 2005-07-12 devnull };
66 a0d146ed 2005-07-12 devnull int
67 a0d146ed 2005-07-12 devnull runconfig(char *file, Config *config)
68 a0d146ed 2005-07-12 devnull {
69 a0d146ed 2005-07-12 devnull ArenaPart **av;
70 a0d146ed 2005-07-12 devnull ISect **sv;
71 a0d146ed 2005-07-12 devnull IFile f;
72 a0d146ed 2005-07-12 devnull char *s, *line, *flds[MaxArgs + 1];
73 a0d146ed 2005-07-12 devnull int i, ok;
74 a0d146ed 2005-07-12 devnull
75 a0d146ed 2005-07-12 devnull if(readifile(&f, file) < 0)
76 a0d146ed 2005-07-12 devnull return -1;
77 a0d146ed 2005-07-12 devnull memset(config, 0, sizeof *config);
78 a0d146ed 2005-07-12 devnull config->mem = 0xFFFFFFFFUL;
79 a0d146ed 2005-07-12 devnull ok = -1;
80 a0d146ed 2005-07-12 devnull line = nil;
81 a0d146ed 2005-07-12 devnull for(;;){
82 a0d146ed 2005-07-12 devnull s = ifileline(&f);
83 a0d146ed 2005-07-12 devnull if(s == nil){
84 a0d146ed 2005-07-12 devnull ok = 0;
85 a0d146ed 2005-07-12 devnull break;
86 a0d146ed 2005-07-12 devnull }
87 a0d146ed 2005-07-12 devnull line = estrdup(s);
88 a0d146ed 2005-07-12 devnull i = getfields(s, flds, MaxArgs + 1, 1, " \t\r");
89 a0d146ed 2005-07-12 devnull if(i == 2 && strcmp(flds[0], "isect") == 0){
90 a0d146ed 2005-07-12 devnull sv = MKN(ISect*, config->nsects + 1);
91 a0d146ed 2005-07-12 devnull for(i = 0; i < config->nsects; i++)
92 a0d146ed 2005-07-12 devnull sv[i] = config->sects[i];
93 a0d146ed 2005-07-12 devnull free(config->sects);
94 a0d146ed 2005-07-12 devnull config->sects = sv;
95 a0d146ed 2005-07-12 devnull config->sects[config->nsects] = configisect(flds[1]);
96 a0d146ed 2005-07-12 devnull if(config->sects[config->nsects] == nil)
97 a0d146ed 2005-07-12 devnull break;
98 a0d146ed 2005-07-12 devnull config->nsects++;
99 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "arenas") == 0){
100 a0d146ed 2005-07-12 devnull av = MKN(ArenaPart*, config->naparts + 1);
101 a0d146ed 2005-07-12 devnull for(i = 0; i < config->naparts; i++)
102 a0d146ed 2005-07-12 devnull av[i] = config->aparts[i];
103 a0d146ed 2005-07-12 devnull free(config->aparts);
104 a0d146ed 2005-07-12 devnull config->aparts = av;
105 a0d146ed 2005-07-12 devnull config->aparts[config->naparts] = configarenas(flds[1]);
106 a0d146ed 2005-07-12 devnull if(config->aparts[config->naparts] == nil)
107 a0d146ed 2005-07-12 devnull break;
108 a0d146ed 2005-07-12 devnull config->naparts++;
109 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "bloom") == 0){
110 a0d146ed 2005-07-12 devnull if(config->bloom){
111 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate bloom lines in configuration file %s", file);
112 a0d146ed 2005-07-12 devnull break;
113 a0d146ed 2005-07-12 devnull }
114 a0d146ed 2005-07-12 devnull if((config->bloom = configbloom(flds[1])) == nil)
115 a0d146ed 2005-07-12 devnull break;
116 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "index") == 0){
117 a0d146ed 2005-07-12 devnull if(nameok(flds[1]) < 0){
118 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal index name %s in config file %s", flds[1], file);
119 a0d146ed 2005-07-12 devnull break;
120 a0d146ed 2005-07-12 devnull }
121 a0d146ed 2005-07-12 devnull if(config->index != nil){
122 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate indices in config file %s", file);
123 a0d146ed 2005-07-12 devnull break;
124 a0d146ed 2005-07-12 devnull }
125 a0d146ed 2005-07-12 devnull config->index = estrdup(flds[1]);
126 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "bcmem") == 0){
127 a0d146ed 2005-07-12 devnull if(numok(flds[1]) < 0){
128 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal size %s in config file %s",
129 a0d146ed 2005-07-12 devnull flds[1], file);
130 a0d146ed 2005-07-12 devnull break;
131 a0d146ed 2005-07-12 devnull }
132 a0d146ed 2005-07-12 devnull if(config->bcmem != 0){
133 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate bcmem lines in config file %s", file);
134 a0d146ed 2005-07-12 devnull break;
135 a0d146ed 2005-07-12 devnull }
136 a0d146ed 2005-07-12 devnull config->bcmem = unittoull(flds[1]);
137 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "mem") == 0){
138 a0d146ed 2005-07-12 devnull if(numok(flds[1]) < 0){
139 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal size %s in config file %s",
140 a0d146ed 2005-07-12 devnull flds[1], file);
141 a0d146ed 2005-07-12 devnull break;
142 a0d146ed 2005-07-12 devnull }
143 a0d146ed 2005-07-12 devnull if(config->mem != 0xFFFFFFFFUL){
144 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate mem lines in config file %s", file);
145 a0d146ed 2005-07-12 devnull break;
146 a0d146ed 2005-07-12 devnull }
147 a0d146ed 2005-07-12 devnull config->mem = unittoull(flds[1]);
148 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "icmem") == 0){
149 a0d146ed 2005-07-12 devnull if(numok(flds[1]) < 0){
150 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal size %s in config file %s",
151 a0d146ed 2005-07-12 devnull flds[1], file);
152 a0d146ed 2005-07-12 devnull break;
153 a0d146ed 2005-07-12 devnull }
154 a0d146ed 2005-07-12 devnull if(config->icmem != 0){
155 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate icmem lines in config file %s", file);
156 a0d146ed 2005-07-12 devnull break;
157 a0d146ed 2005-07-12 devnull }
158 a0d146ed 2005-07-12 devnull config->icmem = unittoull(flds[1]);
159 a0d146ed 2005-07-12 devnull }else if(i == 1 && strcmp(flds[0], "queuewrites") == 0){
160 a0d146ed 2005-07-12 devnull config->queuewrites = 1;
161 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "httpaddr") == 0){
162 a0d146ed 2005-07-12 devnull if(config->haddr){
163 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate httpaddr lines in configuration file %s", file);
164 a0d146ed 2005-07-12 devnull break;
165 a0d146ed 2005-07-12 devnull }
166 a0d146ed 2005-07-12 devnull config->haddr = estrdup(flds[1]);
167 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "webroot") == 0){
168 a0d146ed 2005-07-12 devnull if(config->webroot){
169 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate webroot lines in configuration file %s", file);
170 a0d146ed 2005-07-12 devnull break;
171 a0d146ed 2005-07-12 devnull }
172 a0d146ed 2005-07-12 devnull config->webroot = estrdup(flds[1]);
173 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "addr") == 0){
174 a0d146ed 2005-07-12 devnull if(config->vaddr){
175 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate addr lines in configuration file %s", file);
176 a0d146ed 2005-07-12 devnull break;
177 a0d146ed 2005-07-12 devnull }
178 a0d146ed 2005-07-12 devnull config->vaddr = estrdup(flds[1]);
179 a0d146ed 2005-07-12 devnull }else{
180 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file);
181 a0d146ed 2005-07-12 devnull break;
182 a0d146ed 2005-07-12 devnull }
183 a0d146ed 2005-07-12 devnull free(line);
184 a0d146ed 2005-07-12 devnull line = nil;
185 a0d146ed 2005-07-12 devnull }
186 a0d146ed 2005-07-12 devnull free(line);
187 a0d146ed 2005-07-12 devnull freeifile(&f);
188 a0d146ed 2005-07-12 devnull if(ok < 0){
189 a0d146ed 2005-07-12 devnull free(config->sects);
190 a0d146ed 2005-07-12 devnull config->sects = nil;
191 a0d146ed 2005-07-12 devnull free(config->aparts);
192 a0d146ed 2005-07-12 devnull config->aparts = nil;
193 a0d146ed 2005-07-12 devnull }
194 a0d146ed 2005-07-12 devnull return ok;
195 a0d146ed 2005-07-12 devnull }
196 a0d146ed 2005-07-12 devnull
197 a0d146ed 2005-07-12 devnull static ISect*
198 a0d146ed 2005-07-12 devnull configisect(char *file)
199 a0d146ed 2005-07-12 devnull {
200 a0d146ed 2005-07-12 devnull Part *part;
201 a0d146ed 2005-07-12 devnull ISect *is;
202 a0d146ed 2005-07-12 devnull
203 a0d146ed 2005-07-12 devnull if(0) fprint(2, "configure index section in %s\n", file);
204 a0d146ed 2005-07-12 devnull
205 a0d146ed 2005-07-12 devnull part = initpart(file, ORDWR|ODIRECT);
206 a0d146ed 2005-07-12 devnull if(part == nil)
207 a0d146ed 2005-07-12 devnull return nil;
208 a0d146ed 2005-07-12 devnull is = initisect(part);
209 a0d146ed 2005-07-12 devnull if(is == nil)
210 a0d146ed 2005-07-12 devnull werrstr("%s: %r", file);
211 a0d146ed 2005-07-12 devnull return is;
212 a0d146ed 2005-07-12 devnull }
213 a0d146ed 2005-07-12 devnull
214 a0d146ed 2005-07-12 devnull static ArenaPart*
215 a0d146ed 2005-07-12 devnull configarenas(char *file)
216 a0d146ed 2005-07-12 devnull {
217 a0d146ed 2005-07-12 devnull ArenaPart *ap;
218 a0d146ed 2005-07-12 devnull Part *part;
219 a0d146ed 2005-07-12 devnull
220 a0d146ed 2005-07-12 devnull if(0) fprint(2, "configure arenas in %s\n", file);
221 a0d146ed 2005-07-12 devnull part = initpart(file, ORDWR|ODIRECT);
222 a0d146ed 2005-07-12 devnull if(part == nil)
223 a0d146ed 2005-07-12 devnull return nil;
224 a0d146ed 2005-07-12 devnull ap = initarenapart(part);
225 a0d146ed 2005-07-12 devnull if(ap == nil)
226 a0d146ed 2005-07-12 devnull werrstr("%s: %r", file);
227 a0d146ed 2005-07-12 devnull return ap;
228 a0d146ed 2005-07-12 devnull }
229 a0d146ed 2005-07-12 devnull
230 a0d146ed 2005-07-12 devnull static Bloom*
231 a0d146ed 2005-07-12 devnull configbloom(char *file)
232 a0d146ed 2005-07-12 devnull {
233 a0d146ed 2005-07-12 devnull Bloom *b;
234 a0d146ed 2005-07-12 devnull Part *part;
235 a0d146ed 2005-07-12 devnull
236 a0d146ed 2005-07-12 devnull if(0) fprint(2, "configure bloom in %s\n", file);
237 a0d146ed 2005-07-12 devnull part = initpart(file, ORDWR|ODIRECT);
238 a0d146ed 2005-07-12 devnull if(part == nil)
239 a0d146ed 2005-07-12 devnull return nil;
240 a0d146ed 2005-07-12 devnull b = readbloom(part);
241 a0d146ed 2005-07-12 devnull if(b == nil)
242 a0d146ed 2005-07-12 devnull werrstr("%s: %r", file);
243 a0d146ed 2005-07-12 devnull return b;
244 a0d146ed 2005-07-12 devnull }
245 a0d146ed 2005-07-12 devnull