plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

config.c (5725B)


      1 #include "stdinc.h"
      2 #include "dat.h"
      3 #include "fns.h"
      4 
      5 Index			*mainindex;
      6 int			paranoid = 1;		/* should verify hashes on disk read */
      7 
      8 static ArenaPart	*configarenas(char *file);
      9 static ISect		*configisect(char *file);
     10 static Bloom		*configbloom(char *file);
     11 
     12 int
     13 initventi(char *file, Config *conf)
     14 {
     15 	statsinit();
     16 
     17 	if(file == nil){
     18 		seterr(EOk, "no configuration file");
     19 		return -1;
     20 	}
     21 	if(runconfig(file, conf) < 0){
     22 		seterr(EOk, "can't initialize venti: %r");
     23 		return -1;
     24 	}
     25 	mainindex = initindex(conf->index, conf->sects, conf->nsects);
     26 	if(mainindex == nil)
     27 		return -1;
     28 	mainindex->bloom = conf->bloom;
     29 	return 0;
     30 }
     31 
     32 static int
     33 numok(char *s)
     34 {
     35 	char *p;
     36 
     37 	strtoull(s, &p, 0);
     38 	if(p == s)
     39 		return -1;
     40 	if(*p == 0)
     41 		return 0;
     42 	if(p[1] == 0 && strchr("MmGgKk", *p))
     43 		return 0;
     44 	return 0;
     45 }
     46 
     47 /*
     48  * configs	:
     49  *		| configs config
     50  * config	: "isect" filename
     51  *		| "arenas" filename
     52  *		| "index" name
     53  *		| "bcmem" num
     54  *		| "mem" num
     55  *		| "icmem" num
     56  *		| "queuewrites"
     57  *		| "httpaddr" address
     58  *		| "addr" address
     59  *
     60  * '#' and \n delimit comments
     61  */
     62 enum
     63 {
     64 	MaxArgs	= 2
     65 };
     66 int
     67 runconfig(char *file, Config *config)
     68 {
     69 	ArenaPart **av;
     70 	ISect **sv;
     71 	IFile f;
     72 	char *s, *line, *flds[MaxArgs + 1];
     73 	int i, ok;
     74 
     75 	if(readifile(&f, file) < 0)
     76 		return -1;
     77 	memset(config, 0, sizeof *config);
     78 	config->mem = Unspecified;
     79 	ok = -1;
     80 	line = nil;
     81 	for(;;){
     82 		s = ifileline(&f);
     83 		if(s == nil){
     84 			ok = 0;
     85 			break;
     86 		}
     87 		line = estrdup(s);
     88 		i = getfields(s, flds, MaxArgs + 1, 1, " \t\r");
     89 		if(i > 0 && strcmp(flds[0], "mgr") == 0){
     90 			/* do nothing */
     91 		}else if(i == 2 && strcmp(flds[0], "isect") == 0){
     92 			sv = MKN(ISect*, config->nsects + 1);
     93 			for(i = 0; i < config->nsects; i++)
     94 				sv[i] = config->sects[i];
     95 			free(config->sects);
     96 			config->sects = sv;
     97 			config->sects[config->nsects] = configisect(flds[1]);
     98 			if(config->sects[config->nsects] == nil)
     99 				break;
    100 			config->nsects++;
    101 		}else if(i == 2 && strcmp(flds[0], "arenas") == 0){
    102 			av = MKN(ArenaPart*, config->naparts + 1);
    103 			for(i = 0; i < config->naparts; i++)
    104 				av[i] = config->aparts[i];
    105 			free(config->aparts);
    106 			config->aparts = av;
    107 			config->aparts[config->naparts] = configarenas(flds[1]);
    108 			if(config->aparts[config->naparts] == nil)
    109 				break;
    110 			config->naparts++;
    111 		}else if(i == 2 && strcmp(flds[0], "bloom") == 0){
    112 			if(config->bloom){
    113 				seterr(EAdmin, "duplicate bloom lines in configuration file %s", file);
    114 				break;
    115 			}
    116 			if((config->bloom = configbloom(flds[1])) == nil)
    117 				break;
    118 		}else if(i == 2 && strcmp(flds[0], "index") == 0){
    119 			if(nameok(flds[1]) < 0){
    120 				seterr(EAdmin, "illegal index name %s in config file %s", flds[1], file);
    121 				break;
    122 			}
    123 			if(config->index != nil){
    124 				seterr(EAdmin, "duplicate indices in config file %s", file);
    125 				break;
    126 			}
    127 			config->index = estrdup(flds[1]);
    128 		}else if(i == 2 && strcmp(flds[0], "bcmem") == 0){
    129 			if(numok(flds[1]) < 0){
    130 				seterr(EAdmin, "illegal size %s in config file %s",
    131 					flds[1], file);
    132 				break;
    133 			}
    134 			if(config->bcmem != 0){
    135 				seterr(EAdmin, "duplicate bcmem lines in config file %s", file);
    136 				break;
    137 			}
    138 			config->bcmem = unittoull(flds[1]);
    139 		}else if(i == 2 && strcmp(flds[0], "mem") == 0){
    140 			if(numok(flds[1]) < 0){
    141 				seterr(EAdmin, "illegal size %s in config file %s",
    142 					flds[1], file);
    143 				break;
    144 			}
    145 			if(config->mem != Unspecified){
    146 				seterr(EAdmin, "duplicate mem lines in config file %s", file);
    147 				break;
    148 			}
    149 			config->mem = unittoull(flds[1]);
    150 		}else if(i == 2 && strcmp(flds[0], "icmem") == 0){
    151 			if(numok(flds[1]) < 0){
    152 				seterr(EAdmin, "illegal size %s in config file %s",
    153 					flds[1], file);
    154 				break;
    155 			}
    156 			if(config->icmem != 0){
    157 				seterr(EAdmin, "duplicate icmem lines in config file %s", file);
    158 				break;
    159 			}
    160 			config->icmem = unittoull(flds[1]);
    161 		}else if(i == 1 && strcmp(flds[0], "queuewrites") == 0){
    162 			config->queuewrites = 1;
    163 		}else if(i == 2 && strcmp(flds[0], "httpaddr") == 0){
    164 			if(config->haddr){
    165 				seterr(EAdmin, "duplicate httpaddr lines in configuration file %s", file);
    166 				break;
    167 			}
    168 			config->haddr = estrdup(flds[1]);
    169 		}else if(i == 2 && strcmp(flds[0], "webroot") == 0){
    170 			if(config->webroot){
    171 				seterr(EAdmin, "duplicate webroot lines in configuration file %s", file);
    172 				break;
    173 			}
    174 			config->webroot = estrdup(flds[1]);
    175 		}else if(i == 2 && strcmp(flds[0], "addr") == 0){
    176 			if(config->vaddr){
    177 				seterr(EAdmin, "duplicate addr lines in configuration file %s", file);
    178 				break;
    179 			}
    180 			config->vaddr = estrdup(flds[1]);
    181 		}else{
    182 			seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file);
    183 			break;
    184 		}
    185 		free(line);
    186 		line = nil;
    187 	}
    188 	free(line);
    189 	freeifile(&f);
    190 	if(ok < 0){
    191 		free(config->sects);
    192 		config->sects = nil;
    193 		free(config->aparts);
    194 		config->aparts = nil;
    195 	}
    196 	return ok;
    197 }
    198 
    199 static ISect*
    200 configisect(char *file)
    201 {
    202 	Part *part;
    203 	ISect *is;
    204 
    205 	if(0) fprint(2, "configure index section in %s\n", file);
    206 
    207 	part = initpart(file, ORDWR|ODIRECT);
    208 	if(part == nil)
    209 		return nil;
    210 	is = initisect(part);
    211 	if(is == nil)
    212 		werrstr("%s: %r", file);
    213 	return is;
    214 }
    215 
    216 static ArenaPart*
    217 configarenas(char *file)
    218 {
    219 	ArenaPart *ap;
    220 	Part *part;
    221 
    222 	if(0) fprint(2, "configure arenas in %s\n", file);
    223 	part = initpart(file, ORDWR|ODIRECT);
    224 	if(part == nil)
    225 		return nil;
    226 	ap = initarenapart(part);
    227 	if(ap == nil)
    228 		werrstr("%s: %r", file);
    229 	return ap;
    230 }
    231 
    232 static Bloom*
    233 configbloom(char *file)
    234 {
    235 	Bloom *b;
    236 	Part *part;
    237 
    238 	if(0) fprint(2, "configure bloom in %s\n", file);
    239 	part = initpart(file, ORDWR|ODIRECT);
    240 	if(part == nil)
    241 		return nil;
    242 	b = readbloom(part);
    243 	if(b == nil){
    244 		werrstr("%s: %r", file);
    245 		freepart(part);
    246 	}
    247 	return b;
    248 }
    249 
    250 /* for OS X linker, which only resolves functions, not data */
    251 void
    252 needmainindex(void)
    253 {
    254 }