diff options
Diffstat (limited to 'src/cmd/venti/srv/config.c')
-rw-r--r-- | src/cmd/venti/srv/config.c | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/config.c b/src/cmd/venti/srv/config.c new file mode 100644 index 00000000..e6232d53 --- /dev/null +++ b/src/cmd/venti/srv/config.c @@ -0,0 +1,245 @@ +#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); +static Bloom *configbloom(char *file); + +int +initventi(char *file, Config *conf) +{ + 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; + mainindex->bloom = conf->bloom; + return 0; +} + +static int +numok(char *s) +{ + char *p; + + strtoull(s, &p, 0); + if(p == s) + return -1; + if(*p == 0) + return 0; + if(p[1] == 0 && strchr("MmGgKk", *p)) + return 0; + return 0; +} + +/* + * configs : + * | configs config + * config : "isect" filename + * | "arenas" filename + * | "index" name + * | "bcmem" num + * | "mem" num + * | "icmem" num + * | "queuewrites" + * | "httpaddr" address + * | "addr" address + * + * '#' and \n delimit 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; + memset(config, 0, sizeof *config); + config->mem = 0xFFFFFFFFUL; + 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], "bloom") == 0){ + if(config->bloom){ + seterr(EAdmin, "duplicate bloom lines in configuration file %s", file); + break; + } + if((config->bloom = configbloom(flds[1])) == nil) + break; + }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], file); + break; + } + if(config->index != nil){ + seterr(EAdmin, "duplicate indices in config file %s", file); + break; + } + config->index = estrdup(flds[1]); + }else if(i == 2 && strcmp(flds[0], "bcmem") == 0){ + if(numok(flds[1]) < 0){ + seterr(EAdmin, "illegal size %s in config file %s", + flds[1], file); + break; + } + if(config->bcmem != 0){ + seterr(EAdmin, "duplicate bcmem lines in config file %s", file); + break; + } + config->bcmem = unittoull(flds[1]); + }else if(i == 2 && strcmp(flds[0], "mem") == 0){ + if(numok(flds[1]) < 0){ + seterr(EAdmin, "illegal size %s in config file %s", + flds[1], file); + break; + } + if(config->mem != 0xFFFFFFFFUL){ + seterr(EAdmin, "duplicate mem lines in config file %s", file); + break; + } + config->mem = unittoull(flds[1]); + }else if(i == 2 && strcmp(flds[0], "icmem") == 0){ + if(numok(flds[1]) < 0){ + seterr(EAdmin, "illegal size %s in config file %s", + flds[1], file); + break; + } + if(config->icmem != 0){ + seterr(EAdmin, "duplicate icmem lines in config file %s", file); + break; + } + config->icmem = unittoull(flds[1]); + }else if(i == 1 && strcmp(flds[0], "queuewrites") == 0){ + config->queuewrites = 1; + }else if(i == 2 && strcmp(flds[0], "httpaddr") == 0){ + if(config->haddr){ + seterr(EAdmin, "duplicate httpaddr lines in configuration file %s", file); + break; + } + config->haddr = estrdup(flds[1]); + }else if(i == 2 && strcmp(flds[0], "webroot") == 0){ + if(config->webroot){ + seterr(EAdmin, "duplicate webroot lines in configuration file %s", file); + break; + } + config->webroot = estrdup(flds[1]); + }else if(i == 2 && strcmp(flds[0], "addr") == 0){ + if(config->vaddr){ + seterr(EAdmin, "duplicate addr lines in configuration file %s", file); + break; + } + config->vaddr = estrdup(flds[1]); + }else{ + seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file); + 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; + ISect *is; + + if(0) fprint(2, "configure index section in %s\n", file); + + part = initpart(file, ORDWR|ODIRECT); + if(part == nil) + return nil; + is = initisect(part); + if(is == nil) + werrstr("%s: %r", file); + return is; +} + +static ArenaPart* +configarenas(char *file) +{ + ArenaPart *ap; + Part *part; + + if(0) fprint(2, "configure arenas in %s\n", file); + part = initpart(file, ORDWR|ODIRECT); + if(part == nil) + return nil; + ap = initarenapart(part); + if(ap == nil) + werrstr("%s: %r", file); + return ap; +} + +static Bloom* +configbloom(char *file) +{ + Bloom *b; + Part *part; + + if(0) fprint(2, "configure bloom in %s\n", file); + part = initpart(file, ORDWR|ODIRECT); + if(part == nil) + return nil; + b = readbloom(part); + if(b == nil) + werrstr("%s: %r", file); + return b; +} + |