#include "stdinc.h" #include "dat.h" #include "fns.h" static int numok(char *s) { char *p; strtoull(s, &p, 0); if(p == s) return -1; if(*p == 0) return 0; if(p[1] == 0 && strchr("MmGgKk", *p)) return 0; return 0; } /* * configs : * | configs config * config : "mem" num * | "queuewrites" * | "addr" address * | "passphrase" string * | "bucket" name * | "s3host" address * * '#' and \n delimit comments */ enum { MaxArgs = 2 }; int s3vconfig(char *file, S3Vconfig *config) { IFile f; char *s, *line, *flds[MaxArgs + 1]; int i, ok; if(readifile(&f, file) < 0) return -1; memset(config, 0, sizeof *config); config->mem = 0xFFFFFFFFUL; config->logfd = -1; ok = -1; line = nil; for(;;){ s = ifileline(&f); if(s == nil){ ok = 0; break; } line = estrdup(s); i = tokenize(s, flds, MaxArgs + 1); if(i == 2 && strcmp(flds[0], "s3host") == 0){ if(config->s3host != nil){ seterr(EAdmin, "duplicate s3host in config file %s", file); break; } config->s3host = estrdup(flds[1]); }else if(i == 2 && strcmp(flds[0], "s3port") == 0){ if(config->s3port != nil){ seterr(EAdmin, "duplicate s3port in config file %s", file); break; } config->s3port = estrdup(flds[1]); }else if(i == 2 && strcmp(flds[0], "bucket") == 0){ if(config->bucket != nil){ seterr(EAdmin, "duplicate bucket in config file %s", file); break; } config->bucket = estrdup(flds[1]); }else if(i == 2 && strcmp(flds[0], "passphrase") == 0){ DigestState *dstate; if(config->key != nil){ seterr(EAdmin, "duplicate passphrase in config file %s", file); break; } config->key = vtmalloc(SHA1dlen); dstate = sha1((uchar*)"s3venti", 7, nil, nil); sha1((uchar*)flds[1], strlen(flds[1]), config->key, dstate); }else if(i == 2 && strcmp(flds[0], "mem") == 0){ if(numok(flds[1]) < 0){ seterr(EAdmin, "illegal size %s in config file %s", flds[1], file); break; } if(config->mem != 0xFFFFFFFFUL){ seterr(EAdmin, "duplicate mem lines in config file %s", file); break; } config->mem = unittoull(flds[1]); }else if(i == 1 && strcmp(flds[0], "queuewrites") == 0){ config->queuewrites = 1; }else if(i == 2 && strcmp(flds[0], "addr") == 0){ if(config->vaddr){ seterr(EAdmin, "duplicate addr lines in configuration file %s", file); break; } config->vaddr = estrdup(flds[1]); }else{ seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file); break; } free(line); line = nil; } free(line); freeifile(&f); return ok; }