mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
144 lines
2.8 KiB
C
144 lines
2.8 KiB
C
#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);
|
|
}
|