aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/venti/config.c')
-rw-r--r--src/cmd/venti/config.c144
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);
+}