config.c 5.5 KB

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