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