int parseindex(IFile *f, Index *ix) { AMapN amn; u32int v; char *s; /* * magic */ s = ifileline(f); if(s == nil || strcmp(s, IndexMagic) != 0){ seterr(ECorrupt, "bad index magic for %s", f->name); return -1; } /* * version */ if(ifileu32int(f, &v) < 0){ seterr(ECorrupt, "syntax error: bad version number in %s", f->name); return -1; } ix->version = v; if(ix->version != IndexVersion){ seterr(ECorrupt, "bad version number in %s", f->name); return -1; } /* * name */ if(ifilename(f, ix->name) < 0){ seterr(ECorrupt, "syntax error: bad index name in %s", f->name); return -1; } /* * block size */ if(ifileu32int(f, &v) < 0){ seterr(ECorrupt, "syntax error: bad block size number in %s", f->name); return -1; } ix->blocksize = v; if(parseamap(f, &amn) < 0) return -1; ix->nsects = amn.n; ix->smap = amn.map; if(parseamap(f, &amn) < 0) return -1; ix->narenas = amn.n; ix->amap = amn.map; return 0; }
int ifileu32int(IFile *f, u32int *r) { char *s; s = ifileline(f); if(s == nil) return -1; return stru32int(s, r); }
int ifileuint32_t(IFile *f, uint32_t *r) { char *s; s = ifileline(f); if(s == nil) return -1; return struint32_t(s, r); }
int ifilename(IFile *f, char *dst) { char *s; s = ifileline(f); if(s == nil || strlen(s) >= ANameSize) return -1; namecp(dst, s); return 0; }
int rdconf(char *file, Conf *conf) { char *s, *line, *flds[10]; int i, ok; IFile f; if(readifile(&f, file) < 0) return -1; memset(conf, 0, sizeof *conf); ok = -1; line = nil; for(;;){ s = ifileline(&f); if(s == nil){ ok = 0; break; } line = estrdup(s); i = getfields(s, flds, nelem(flds), 1, " \t\r"); if(i <= 0 || strcmp(flds[0], "mgr") != 0) { /* do nothing */ }else if(i == 4 && strcmp(flds[1], "mirror") == 0) { if(conf->nmirror%64 == 0) conf->mirror = vtrealloc(conf->mirror, (conf->nmirror+64)*sizeof(conf->mirror[0])); conf->mirror[conf->nmirror].src = vtstrdup(flds[2]); conf->mirror[conf->nmirror].dst = vtstrdup(flds[3]); conf->nmirror++; }else if(i == 3 && strcmp(flds[1], "mirrorfreq") == 0) { conf->mirrorfreq = atoi(flds[2]); }else if(i == 3 && strcmp(flds[1], "verify") == 0) { if(conf->nverify%64 == 0) conf->verify = vtrealloc(conf->verify, (conf->nverify+64)*sizeof(conf->verify[0])); conf->verify[conf->nverify++] = vtstrdup(flds[2]); }else if(i == 3 && strcmp(flds[1], "verifyfreq") == 0) { conf->verifyfreq = atoi(flds[2]); }else if(i == 3 && strcmp(flds[1], "httpaddr") == 0){ if(conf->httpaddr){ seterr(EAdmin, "duplicate httpaddr lines in configuration file %s", file); break; } conf->httpaddr = estrdup(flds[2]); }else if(i == 3 && strcmp(flds[1], "webroot") == 0){ if(conf->webroot){ seterr(EAdmin, "duplicate webroot lines in configuration file %s", file); break; } conf->webroot = estrdup(flds[2]); }else if(i == 3 && strcmp(flds[1], "smtp") == 0) { if(conf->smtp){ seterr(EAdmin, "duplicate smtp lines in configuration file %s", file); break; } conf->smtp = estrdup(flds[2]); }else if(i == 3 && strcmp(flds[1], "mailfrom") == 0) { if(conf->mailfrom){ seterr(EAdmin, "duplicate mailfrom lines in configuration file %s", file); break; } conf->mailfrom = estrdup(flds[2]); }else if(i == 3 && strcmp(flds[1], "mailto") == 0) { if(conf->mailto){ seterr(EAdmin, "duplicate mailto lines in configuration file %s", file); break; } conf->mailto = estrdup(flds[2]); }else{ seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file); break; } free(line); line = nil; } free(line); freeifile(&f); return ok; }