config.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. int
  9. initVenti(char *file, Config *pconf)
  10. {
  11. Config conf;
  12. fmtinstall('V', vtScoreFmt);
  13. fmtinstall('R', vtErrFmt);
  14. statsInit();
  15. if(file == nil){
  16. setErr(EOk, "no configuration file");
  17. return 0;
  18. }
  19. if(!runConfig(file, &conf)){
  20. setErr(EOk, "can't initialize venti: %R");
  21. return 0;
  22. }
  23. mainIndex = initIndex(conf.index, conf.sects, conf.nsects);
  24. if(mainIndex == nil)
  25. return 0;
  26. if(pconf)
  27. *pconf = conf;
  28. return 1;
  29. }
  30. static int
  31. numOk(char *s)
  32. {
  33. char *p;
  34. strtoull(s, &p, 0);
  35. if(p == s)
  36. return 0;
  37. if(*p == 0)
  38. return 1;
  39. if(p[1] == 0 && strchr("MmGgKk", *p))
  40. return 1;
  41. return 0;
  42. }
  43. /*
  44. * configs :
  45. * | configs config
  46. * config : "isect" filename
  47. * | "arenas" filename
  48. * | "index" name
  49. * | "bcmem" num
  50. * | "mem" num
  51. * | "icmem" num
  52. * | "queuewrites"
  53. * | "httpaddr" address
  54. * | "addr" address
  55. *
  56. * '#' and \n delimit comments
  57. */
  58. enum
  59. {
  60. MaxArgs = 2
  61. };
  62. int
  63. runConfig(char *file, Config *config)
  64. {
  65. ArenaPart **av;
  66. ISect **sv;
  67. IFile f;
  68. char *s, *line, *flds[MaxArgs + 1];
  69. int i, ok;
  70. if(!readIFile(&f, file))
  71. return 0;
  72. memset(config, 0, sizeof *config);
  73. config->mem = 0xFFFFFFFFUL;
  74. ok = 0;
  75. line = nil;
  76. for(;;){
  77. s = ifileLine(&f);
  78. if(s == nil){
  79. ok = 1;
  80. break;
  81. }
  82. line = estrdup(s);
  83. i = getfields(s, flds, MaxArgs + 1, 1, " \t\r");
  84. if(i == 2 && strcmp(flds[0], "isect") == 0){
  85. sv = MKN(ISect*, config->nsects + 1);
  86. for(i = 0; i < config->nsects; i++)
  87. sv[i] = config->sects[i];
  88. free(config->sects);
  89. config->sects = sv;
  90. config->sects[config->nsects] = configISect(flds[1]);
  91. if(config->sects[config->nsects] == nil)
  92. break;
  93. config->nsects++;
  94. }else if(i == 2 && strcmp(flds[0], "arenas") == 0){
  95. av = MKN(ArenaPart*, config->naparts + 1);
  96. for(i = 0; i < config->naparts; i++)
  97. av[i] = config->aparts[i];
  98. free(config->aparts);
  99. config->aparts = av;
  100. config->aparts[config->naparts] = configArenas(flds[1]);
  101. if(config->aparts[config->naparts] == nil)
  102. break;
  103. config->naparts++;
  104. }else if(i == 2 && strcmp(flds[0], "index") == 0){
  105. if(!nameOk(flds[1])){
  106. setErr(EAdmin, "illegal index name %s in config file %s", flds[1], file);
  107. break;
  108. }
  109. if(config->index != nil){
  110. setErr(EAdmin, "duplicate indices in config file %s", file);
  111. break;
  112. }
  113. config->index = estrdup(flds[1]);
  114. }else if(i == 2 && strcmp(flds[0], "bcmem") == 0){
  115. if(!numOk(flds[1])){
  116. setErr(EAdmin, "illegal size %s in config file %s",
  117. flds[1], file);
  118. break;
  119. }
  120. if(config->bcmem != 0){
  121. setErr(EAdmin, "duplicate bcmem lines in config file %s", file);
  122. break;
  123. }
  124. config->bcmem = unittoull(flds[1]);
  125. }else if(i == 2 && strcmp(flds[0], "mem") == 0){
  126. if(!numOk(flds[1])){
  127. setErr(EAdmin, "illegal size %s in config file %s",
  128. flds[1], file);
  129. break;
  130. }
  131. if(config->mem != 0xFFFFFFFFUL){
  132. setErr(EAdmin, "duplicate mem lines in config file %s", file);
  133. break;
  134. }
  135. config->mem = unittoull(flds[1]);
  136. }else if(i == 2 && strcmp(flds[0], "icmem") == 0){
  137. if(!numOk(flds[1])){
  138. setErr(EAdmin, "illegal size %s in config file %s",
  139. flds[1], file);
  140. break;
  141. }
  142. if(config->icmem != 0){
  143. setErr(EAdmin, "duplicate icmem lines in config file %s", file);
  144. break;
  145. }
  146. config->icmem = unittoull(flds[1]);
  147. }else if(i == 1 && strcmp(flds[0], "queuewrites") == 0){
  148. config->queueWrites = 1;
  149. }else if(i == 2 && strcmp(flds[0], "httpaddr") == 0){
  150. if(!nameOk(flds[1])){
  151. setErr(EAdmin, "illegal http address '%s' in configuration file %s", flds[1], file);
  152. break;
  153. }
  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], "addr") == 0){
  160. if(!nameOk(flds[1])){
  161. setErr(EAdmin, "illegal venti address '%s' in configuration file %s", flds[1], file);
  162. break;
  163. }
  164. if(config->vaddr){
  165. setErr(EAdmin, "duplicate addr lines in configuration file %s", file);
  166. break;
  167. }
  168. config->vaddr = estrdup(flds[1]);
  169. }else{
  170. setErr(EAdmin, "illegal line '%s' in configuration file %s", line, file);
  171. break;
  172. }
  173. free(line);
  174. line = nil;
  175. }
  176. free(line);
  177. freeIFile(&f);
  178. if(!ok){
  179. free(config->sects);
  180. config->sects = nil;
  181. free(config->aparts);
  182. config->aparts = nil;
  183. }
  184. return ok;
  185. }
  186. static ISect*
  187. configISect(char *file)
  188. {
  189. Part *part;
  190. // fprint(2, "configure index section in %s\n", file);
  191. part = initPart(file, 0);
  192. if(part == nil)
  193. return 0;
  194. return initISect(part);
  195. }
  196. static ArenaPart*
  197. configArenas(char *file)
  198. {
  199. Part *part;
  200. // fprint(2, "configure arenas in %s\n", file);
  201. part = initPart(file, 0);
  202. if(part == nil)
  203. return 0;
  204. return initArenaPart(part);
  205. }