config.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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)
  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. return 1;
  27. }
  28. /*
  29. * configs :
  30. * | configs config
  31. * config : "isect" filename
  32. * | "arenas" filename
  33. * | "index" name
  34. *
  35. * '#' and \n delimate comments
  36. */
  37. enum
  38. {
  39. MaxArgs = 2
  40. };
  41. int
  42. runConfig(char *file, Config *config)
  43. {
  44. ArenaPart **av;
  45. ISect **sv;
  46. IFile f;
  47. char *s, *line, *flds[MaxArgs + 1];
  48. int i, ok;
  49. if(!readIFile(&f, file))
  50. return 0;
  51. config->index = nil;
  52. config->naparts = 0;
  53. config->aparts = nil;
  54. config->nsects = 0;
  55. config->sects = nil;
  56. ok = 0;
  57. line = nil;
  58. for(;;){
  59. s = ifileLine(&f);
  60. if(s == nil){
  61. ok = 1;
  62. break;
  63. }
  64. line = estrdup(s);
  65. i = getfields(s, flds, MaxArgs + 1, 1, " \t\r");
  66. if(i == 2 && strcmp(flds[0], "isect") == 0){
  67. sv = MKN(ISect*, config->nsects + 1);
  68. for(i = 0; i < config->nsects; i++)
  69. sv[i] = config->sects[i];
  70. free(config->sects);
  71. config->sects = sv;
  72. config->sects[config->nsects] = configISect(flds[1]);
  73. if(config->sects[config->nsects] == nil)
  74. break;
  75. config->nsects++;
  76. }else if(i == 2 && strcmp(flds[0], "arenas") == 0){
  77. av = MKN(ArenaPart*, config->naparts + 1);
  78. for(i = 0; i < config->naparts; i++)
  79. av[i] = config->aparts[i];
  80. free(config->aparts);
  81. config->aparts = av;
  82. config->aparts[config->naparts] = configArenas(flds[1]);
  83. if(config->aparts[config->naparts] == nil)
  84. break;
  85. config->naparts++;
  86. }else if(i == 2 && strcmp(flds[0], "index") == 0){
  87. if(!nameOk(flds[1])){
  88. setErr(EAdmin, "illegal index name %s in config file %s", flds[1], config);
  89. break;
  90. }
  91. if(config->index != nil){
  92. setErr(EAdmin, "duplicate indices in config file %s", config);
  93. break;
  94. }
  95. config->index = estrdup(flds[1]);
  96. }else{
  97. setErr(EAdmin, "illegal line '%s' in configuration file %s", line, config);
  98. break;
  99. }
  100. free(line);
  101. line = nil;
  102. }
  103. free(line);
  104. freeIFile(&f);
  105. if(!ok){
  106. free(config->sects);
  107. config->sects = nil;
  108. free(config->aparts);
  109. config->aparts = nil;
  110. }
  111. return ok;
  112. }
  113. static ISect*
  114. configISect(char *file)
  115. {
  116. Part *part;
  117. fprint(2, "configure index section in %s\n", file);
  118. part = initPart(file, 0);
  119. if(part == nil)
  120. return 0;
  121. return initISect(part);
  122. }
  123. static ArenaPart*
  124. configArenas(char *file)
  125. {
  126. Part *part;
  127. fprint(2, "configure arenas in %s\n", file);
  128. part = initPart(file, 0);
  129. if(part == nil)
  130. return 0;
  131. return initArenaPart(part);
  132. }