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"
5 a0d146ed 2005-07-12 devnull Index *mainindex;
6 a0d146ed 2005-07-12 devnull int paranoid = 1; /* should verify hashes on disk read */
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);
13 a0d146ed 2005-07-12 devnull initventi(char *file, Config *conf)
15 a0d146ed 2005-07-12 devnull statsinit();
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;
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;
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;
32 a0d146ed 2005-07-12 devnull static int
33 a0d146ed 2005-07-12 devnull numok(char *s)
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;
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
60 a0d146ed 2005-07-12 devnull * '#' and \n delimit comments
64 a0d146ed 2005-07-12 devnull MaxArgs = 2
67 a0d146ed 2005-07-12 devnull runconfig(char *file, Config *config)
69 a0d146ed 2005-07-12 devnull ArenaPart **av;
70 a0d146ed 2005-07-12 devnull ISect **sv;
72 a0d146ed 2005-07-12 devnull char *s, *line, *flds[MaxArgs + 1];
73 a0d146ed 2005-07-12 devnull int i, ok;
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 f5a8ea6f 2011-06-02 rsc config->mem = Unspecified;
80 a0d146ed 2005-07-12 devnull line = nil;
82 a0d146ed 2005-07-12 devnull s = ifileline(&f);
83 a0d146ed 2005-07-12 devnull if(s == nil){
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 5df56af7 2008-12-23 rsc if(i > 0 && strcmp(flds[0], "mgr") == 0){
90 5df56af7 2008-12-23 rsc /* do nothing */
91 5df56af7 2008-12-23 rsc }else if(i == 2 && strcmp(flds[0], "isect") == 0){
92 a0d146ed 2005-07-12 devnull sv = MKN(ISect*, config->nsects + 1);
93 a0d146ed 2005-07-12 devnull for(i = 0; i < config->nsects; i++)
94 a0d146ed 2005-07-12 devnull sv[i] = config->sects[i];
95 a0d146ed 2005-07-12 devnull free(config->sects);
96 a0d146ed 2005-07-12 devnull config->sects = sv;
97 a0d146ed 2005-07-12 devnull config->sects[config->nsects] = configisect(flds[1]);
98 a0d146ed 2005-07-12 devnull if(config->sects[config->nsects] == nil)
100 a0d146ed 2005-07-12 devnull config->nsects++;
101 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "arenas") == 0){
102 a0d146ed 2005-07-12 devnull av = MKN(ArenaPart*, config->naparts + 1);
103 a0d146ed 2005-07-12 devnull for(i = 0; i < config->naparts; i++)
104 a0d146ed 2005-07-12 devnull av[i] = config->aparts[i];
105 a0d146ed 2005-07-12 devnull free(config->aparts);
106 a0d146ed 2005-07-12 devnull config->aparts = av;
107 a0d146ed 2005-07-12 devnull config->aparts[config->naparts] = configarenas(flds[1]);
108 a0d146ed 2005-07-12 devnull if(config->aparts[config->naparts] == nil)
110 a0d146ed 2005-07-12 devnull config->naparts++;
111 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "bloom") == 0){
112 a0d146ed 2005-07-12 devnull if(config->bloom){
113 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate bloom lines in configuration file %s", file);
116 a0d146ed 2005-07-12 devnull if((config->bloom = configbloom(flds[1])) == nil)
118 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "index") == 0){
119 a0d146ed 2005-07-12 devnull if(nameok(flds[1]) < 0){
120 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal index name %s in config file %s", flds[1], file);
123 a0d146ed 2005-07-12 devnull if(config->index != nil){
124 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate indices in config file %s", file);
127 a0d146ed 2005-07-12 devnull config->index = estrdup(flds[1]);
128 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "bcmem") == 0){
129 a0d146ed 2005-07-12 devnull if(numok(flds[1]) < 0){
130 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal size %s in config file %s",
131 a0d146ed 2005-07-12 devnull flds[1], file);
134 a0d146ed 2005-07-12 devnull if(config->bcmem != 0){
135 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate bcmem lines in config file %s", file);
138 a0d146ed 2005-07-12 devnull config->bcmem = unittoull(flds[1]);
139 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "mem") == 0){
140 a0d146ed 2005-07-12 devnull if(numok(flds[1]) < 0){
141 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal size %s in config file %s",
142 a0d146ed 2005-07-12 devnull flds[1], file);
145 f5a8ea6f 2011-06-02 rsc if(config->mem != Unspecified){
146 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate mem lines in config file %s", file);
149 a0d146ed 2005-07-12 devnull config->mem = unittoull(flds[1]);
150 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "icmem") == 0){
151 a0d146ed 2005-07-12 devnull if(numok(flds[1]) < 0){
152 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal size %s in config file %s",
153 a0d146ed 2005-07-12 devnull flds[1], file);
156 a0d146ed 2005-07-12 devnull if(config->icmem != 0){
157 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate icmem lines in config file %s", file);
160 a0d146ed 2005-07-12 devnull config->icmem = unittoull(flds[1]);
161 a0d146ed 2005-07-12 devnull }else if(i == 1 && strcmp(flds[0], "queuewrites") == 0){
162 a0d146ed 2005-07-12 devnull config->queuewrites = 1;
163 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "httpaddr") == 0){
164 a0d146ed 2005-07-12 devnull if(config->haddr){
165 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate httpaddr lines in configuration file %s", file);
168 a0d146ed 2005-07-12 devnull config->haddr = estrdup(flds[1]);
169 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "webroot") == 0){
170 a0d146ed 2005-07-12 devnull if(config->webroot){
171 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate webroot lines in configuration file %s", file);
174 a0d146ed 2005-07-12 devnull config->webroot = estrdup(flds[1]);
175 a0d146ed 2005-07-12 devnull }else if(i == 2 && strcmp(flds[0], "addr") == 0){
176 a0d146ed 2005-07-12 devnull if(config->vaddr){
177 a0d146ed 2005-07-12 devnull seterr(EAdmin, "duplicate addr lines in configuration file %s", file);
180 a0d146ed 2005-07-12 devnull config->vaddr = estrdup(flds[1]);
182 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file);
185 a0d146ed 2005-07-12 devnull free(line);
186 a0d146ed 2005-07-12 devnull line = nil;
188 a0d146ed 2005-07-12 devnull free(line);
189 a0d146ed 2005-07-12 devnull freeifile(&f);
190 a0d146ed 2005-07-12 devnull if(ok < 0){
191 a0d146ed 2005-07-12 devnull free(config->sects);
192 a0d146ed 2005-07-12 devnull config->sects = nil;
193 a0d146ed 2005-07-12 devnull free(config->aparts);
194 a0d146ed 2005-07-12 devnull config->aparts = nil;
196 a0d146ed 2005-07-12 devnull return ok;
199 a0d146ed 2005-07-12 devnull static ISect*
200 a0d146ed 2005-07-12 devnull configisect(char *file)
202 a0d146ed 2005-07-12 devnull Part *part;
203 a0d146ed 2005-07-12 devnull ISect *is;
205 a0d146ed 2005-07-12 devnull if(0) fprint(2, "configure index section in %s\n", file);
207 a0d146ed 2005-07-12 devnull part = initpart(file, ORDWR|ODIRECT);
208 a0d146ed 2005-07-12 devnull if(part == nil)
209 a0d146ed 2005-07-12 devnull return nil;
210 a0d146ed 2005-07-12 devnull is = initisect(part);
211 a0d146ed 2005-07-12 devnull if(is == nil)
212 a0d146ed 2005-07-12 devnull werrstr("%s: %r", file);
213 a0d146ed 2005-07-12 devnull return is;
216 a0d146ed 2005-07-12 devnull static ArenaPart*
217 a0d146ed 2005-07-12 devnull configarenas(char *file)
219 a0d146ed 2005-07-12 devnull ArenaPart *ap;
220 a0d146ed 2005-07-12 devnull Part *part;
222 a0d146ed 2005-07-12 devnull if(0) fprint(2, "configure arenas in %s\n", file);
223 a0d146ed 2005-07-12 devnull part = initpart(file, ORDWR|ODIRECT);
224 a0d146ed 2005-07-12 devnull if(part == nil)
225 a0d146ed 2005-07-12 devnull return nil;
226 a0d146ed 2005-07-12 devnull ap = initarenapart(part);
227 a0d146ed 2005-07-12 devnull if(ap == nil)
228 a0d146ed 2005-07-12 devnull werrstr("%s: %r", file);
229 a0d146ed 2005-07-12 devnull return ap;
232 a0d146ed 2005-07-12 devnull static Bloom*
233 a0d146ed 2005-07-12 devnull configbloom(char *file)
235 a0d146ed 2005-07-12 devnull Bloom *b;
236 a0d146ed 2005-07-12 devnull Part *part;
238 a0d146ed 2005-07-12 devnull if(0) fprint(2, "configure bloom in %s\n", file);
239 a0d146ed 2005-07-12 devnull part = initpart(file, ORDWR|ODIRECT);
240 a0d146ed 2005-07-12 devnull if(part == nil)
241 a0d146ed 2005-07-12 devnull return nil;
242 a0d146ed 2005-07-12 devnull b = readbloom(part);
243 300f2177 2007-04-22 devnull if(b == nil){
244 a0d146ed 2005-07-12 devnull werrstr("%s: %r", file);
245 300f2177 2007-04-22 devnull freepart(part);
247 a0d146ed 2005-07-12 devnull return b;
250 b41e39aa 2007-09-25 rsc /* for OS X linker, which only resolves functions, not data */
252 b41e39aa 2007-09-25 rsc needmainindex(void)