Blob


1 #include "stdinc.h"
2 #include "dat.h"
3 #include "fns.h"
5 Index *mainindex;
6 int paranoid = 1; /* should verify hashes on disk read */
8 static ArenaPart *configarenas(char *file);
9 static ISect *configisect(char *file);
11 int
12 initventi(char *file)
13 {
14 Config conf;
16 fmtinstall('V', vtscorefmt);
18 statsinit();
20 if(file == nil){
21 seterr(EOk, "no configuration file");
22 return -1;
23 }
24 if(runconfig(file, &conf) < 0){
25 seterr(EOk, "can't initialize venti: %r");
26 return -1;
27 }
28 mainindex = initindex(conf.index, conf.sects, conf.nsects);
29 if(mainindex == nil)
30 return -1;
31 return 0;
32 }
34 /*
35 * configs :
36 * | configs config
37 * config : "isect" filename
38 * | "arenas" filename
39 * | "index" name
40 *
41 * '#' and \n are comments
42 */
43 enum
44 {
45 MaxArgs = 2
46 };
47 int
48 runconfig(char *file, Config *config)
49 {
50 ArenaPart **av;
51 ISect **sv;
52 IFile f;
53 char *s, *line, *flds[MaxArgs + 1];
54 int i, ok;
56 if(readifile(&f, file) < 0)
57 return -1;
58 config->index = nil;
59 config->naparts = 0;
60 config->aparts = nil;
61 config->nsects = 0;
62 config->sects = nil;
63 ok = -1;
64 line = nil;
65 for(;;){
66 s = ifileline(&f);
67 if(s == nil){
68 ok = 0;
69 break;
70 }
71 line = estrdup(s);
72 i = getfields(s, flds, MaxArgs + 1, 1, " \t\r");
73 if(i == 2 && strcmp(flds[0], "isect") == 0){
74 sv = MKN(ISect*, config->nsects + 1);
75 for(i = 0; i < config->nsects; i++)
76 sv[i] = config->sects[i];
77 free(config->sects);
78 config->sects = sv;
79 config->sects[config->nsects] = configisect(flds[1]);
80 if(config->sects[config->nsects] == nil)
81 break;
82 config->nsects++;
83 }else if(i == 2 && strcmp(flds[0], "arenas") == 0){
84 av = MKN(ArenaPart*, config->naparts + 1);
85 for(i = 0; i < config->naparts; i++)
86 av[i] = config->aparts[i];
87 free(config->aparts);
88 config->aparts = av;
89 config->aparts[config->naparts] = configarenas(flds[1]);
90 if(config->aparts[config->naparts] == nil)
91 break;
92 config->naparts++;
93 }else if(i == 2 && strcmp(flds[0], "index") == 0){
94 if(nameok(flds[1]) < 0){
95 seterr(EAdmin, "illegal index name %s in config file %s", flds[1], config);
96 break;
97 }
98 if(config->index != nil){
99 seterr(EAdmin, "duplicate indices in config file %s", config);
100 break;
102 config->index = estrdup(flds[1]);
103 }else{
104 seterr(EAdmin, "illegal line '%s' in configuration file %s", line, config);
105 break;
107 free(line);
108 line = nil;
110 free(line);
111 freeifile(&f);
112 if(ok < 0){
113 free(config->sects);
114 config->sects = nil;
115 free(config->aparts);
116 config->aparts = nil;
118 return ok;
121 static ISect*
122 configisect(char *file)
124 Part *part;
126 fprint(2, "configure index section in %s\n", file);
128 part = initpart(file, 0);
129 if(part == nil)
130 return nil;
131 return initisect(part);
134 static ArenaPart*
135 configarenas(char *file)
137 Part *part;
139 fprint(2, "configure arenas in %s\n", file);
140 part = initpart(file, 0);
141 if(part == nil)
142 return nil;
143 return initarenapart(part);