plan9port/src/cmd/venti/config.c

145 lines
2.8 KiB
C
Raw Normal View History

2003-11-23 17:54:58 +00:00
#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);
}