| #include "stdinc.h" |
| #include "dat.h" |
| #include "fns.h" |
| |
| Index *mainindex; |
| int paranoid = 1; /* should verify hashes on disk read */ |
| |
| static ArenaPart *configarenas(char *file); |
| static ISect *configisect(char *file); |
| |
| int |
| initventi(char *file) |
| { |
| Config conf; |
| |
| fmtinstall('V', vtscorefmt); |
| |
| statsinit(); |
| |
| if(file == nil){ |
| seterr(EOk, "no configuration file"); |
| return -1; |
| } |
| if(runconfig(file, &conf) < 0){ |
| seterr(EOk, "can't initialize venti: %r"); |
| return -1; |
| } |
| mainindex = initindex(conf.index, conf.sects, conf.nsects); |
| if(mainindex == nil) |
| return -1; |
| return 0; |
| } |
| |
| /* |
| * configs : |
| * | configs config |
| * config : "isect" filename |
| * | "arenas" filename |
| * | "index" name |
| * |
| * '#' and \n are comments |
| */ |
| enum |
| { |
| MaxArgs = 2 |
| }; |
| int |
| runconfig(char *file, Config *config) |
| { |
| ArenaPart **av; |
| ISect **sv; |
| IFile f; |
| char *s, *line, *flds[MaxArgs + 1]; |
| int i, ok; |
| |
| if(readifile(&f, file) < 0) |
| return -1; |
| config->index = nil; |
| config->naparts = 0; |
| config->aparts = nil; |
| config->nsects = 0; |
| config->sects = nil; |
| ok = -1; |
| line = nil; |
| for(;;){ |
| s = ifileline(&f); |
| if(s == nil){ |
| ok = 0; |
| break; |
| } |
| line = estrdup(s); |
| i = getfields(s, flds, MaxArgs + 1, 1, " \t\r"); |
| if(i == 2 && strcmp(flds[0], "isect") == 0){ |
| sv = MKN(ISect*, config->nsects + 1); |
| for(i = 0; i < config->nsects; i++) |
| sv[i] = config->sects[i]; |
| free(config->sects); |
| config->sects = sv; |
| config->sects[config->nsects] = configisect(flds[1]); |
| if(config->sects[config->nsects] == nil) |
| break; |
| config->nsects++; |
| }else if(i == 2 && strcmp(flds[0], "arenas") == 0){ |
| av = MKN(ArenaPart*, config->naparts + 1); |
| for(i = 0; i < config->naparts; i++) |
| av[i] = config->aparts[i]; |
| free(config->aparts); |
| config->aparts = av; |
| config->aparts[config->naparts] = configarenas(flds[1]); |
| if(config->aparts[config->naparts] == nil) |
| break; |
| config->naparts++; |
| }else if(i == 2 && strcmp(flds[0], "index") == 0){ |
| if(nameok(flds[1]) < 0){ |
| seterr(EAdmin, "illegal index name %s in config file %s", flds[1], config); |
| break; |
| } |
| if(config->index != nil){ |
| seterr(EAdmin, "duplicate indices in config file %s", config); |
| break; |
| } |
| config->index = estrdup(flds[1]); |
| }else{ |
| seterr(EAdmin, "illegal line '%s' in configuration file %s", line, config); |
| break; |
| } |
| free(line); |
| line = nil; |
| } |
| free(line); |
| freeifile(&f); |
| if(ok < 0){ |
| free(config->sects); |
| config->sects = nil; |
| free(config->aparts); |
| config->aparts = nil; |
| } |
| return ok; |
| } |
| |
| static ISect* |
| configisect(char *file) |
| { |
| Part *part; |
| |
| fprint(2, "configure index section in %s\n", file); |
| |
| part = initpart(file, 0); |
| if(part == nil) |
| return nil; |
| return initisect(part); |
| } |
| |
| static ArenaPart* |
| configarenas(char *file) |
| { |
| Part *part; |
| |
| fprint(2, "configure arenas in %s\n", file); |
| part = initpart(file, 0); |
| if(part == nil) |
| return nil; |
| return initarenapart(part); |
| } |