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 f5a8ea6f 2011-06-02 rsc config->mem = Unspecified;
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 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)
99 a0d146ed 2005-07-12 devnull break;
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)
109 a0d146ed 2005-07-12 devnull break;
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);
114 a0d146ed 2005-07-12 devnull break;
115 a0d146ed 2005-07-12 devnull }
116 a0d146ed 2005-07-12 devnull if((config->bloom = configbloom(flds[1])) == nil)
117 a0d146ed 2005-07-12 devnull break;
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);
121 a0d146ed 2005-07-12 devnull break;
122 a0d146ed 2005-07-12 devnull }
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);
125 a0d146ed 2005-07-12 devnull break;
126 a0d146ed 2005-07-12 devnull }
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);
132 a0d146ed 2005-07-12 devnull break;
133 a0d146ed 2005-07-12 devnull }
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);
136 a0d146ed 2005-07-12 devnull break;
137 a0d146ed 2005-07-12 devnull }
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);
143 a0d146ed 2005-07-12 devnull break;
144 a0d146ed 2005-07-12 devnull }
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);
147 a0d146ed 2005-07-12 devnull break;
148 a0d146ed 2005-07-12 devnull }
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);
154 a0d146ed 2005-07-12 devnull break;
155 a0d146ed 2005-07-12 devnull }
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);
158 a0d146ed 2005-07-12 devnull break;
159 a0d146ed 2005-07-12 devnull }
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);
166 a0d146ed 2005-07-12 devnull break;
167 a0d146ed 2005-07-12 devnull }
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);
172 a0d146ed 2005-07-12 devnull break;
173 a0d146ed 2005-07-12 devnull }
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);
178 a0d146ed 2005-07-12 devnull break;
179 a0d146ed 2005-07-12 devnull }
180 a0d146ed 2005-07-12 devnull config->vaddr = estrdup(flds[1]);
181 a0d146ed 2005-07-12 devnull }else{
182 a0d146ed 2005-07-12 devnull seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file);
183 a0d146ed 2005-07-12 devnull break;
184 a0d146ed 2005-07-12 devnull }
185 a0d146ed 2005-07-12 devnull free(line);
186 a0d146ed 2005-07-12 devnull line = nil;
187 a0d146ed 2005-07-12 devnull }
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;
195 a0d146ed 2005-07-12 devnull }
196 a0d146ed 2005-07-12 devnull return ok;
197 a0d146ed 2005-07-12 devnull }
198 a0d146ed 2005-07-12 devnull
199 a0d146ed 2005-07-12 devnull static ISect*
200 a0d146ed 2005-07-12 devnull configisect(char *file)
201 a0d146ed 2005-07-12 devnull {
202 a0d146ed 2005-07-12 devnull Part *part;
203 a0d146ed 2005-07-12 devnull ISect *is;
204 fa325e9b 2020-01-10 cross
205 a0d146ed 2005-07-12 devnull if(0) fprint(2, "configure index section in %s\n", file);
206 a0d146ed 2005-07-12 devnull
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;
214 a0d146ed 2005-07-12 devnull }
215 a0d146ed 2005-07-12 devnull
216 a0d146ed 2005-07-12 devnull static ArenaPart*
217 a0d146ed 2005-07-12 devnull configarenas(char *file)
218 a0d146ed 2005-07-12 devnull {
219 a0d146ed 2005-07-12 devnull ArenaPart *ap;
220 a0d146ed 2005-07-12 devnull Part *part;
221 a0d146ed 2005-07-12 devnull
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;
230 a0d146ed 2005-07-12 devnull }
231 a0d146ed 2005-07-12 devnull
232 a0d146ed 2005-07-12 devnull static Bloom*
233 a0d146ed 2005-07-12 devnull configbloom(char *file)
234 a0d146ed 2005-07-12 devnull {
235 a0d146ed 2005-07-12 devnull Bloom *b;
236 a0d146ed 2005-07-12 devnull Part *part;
237 a0d146ed 2005-07-12 devnull
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);
246 300f2177 2007-04-22 devnull }
247 a0d146ed 2005-07-12 devnull return b;
248 a0d146ed 2005-07-12 devnull }
249 a0d146ed 2005-07-12 devnull
250 b41e39aa 2007-09-25 rsc /* for OS X linker, which only resolves functions, not data */
251 b41e39aa 2007-09-25 rsc void
252 b41e39aa 2007-09-25 rsc needmainindex(void)
253 b41e39aa 2007-09-25 rsc {
254 b41e39aa 2007-09-25 rsc }