diff options
Diffstat (limited to 'src/cmd/venti/config.c')
-rw-r--r-- | src/cmd/venti/config.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/cmd/venti/config.c b/src/cmd/venti/config.c new file mode 100644 index 00000000..cdcaad10 --- /dev/null +++ b/src/cmd/venti/config.c @@ -0,0 +1,144 @@ +#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); +} |