URI: 
       tconfig.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tconfig.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 }