printindex.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. #include <bio.h>
  5. Biobuf bout;
  6. static void
  7. pie(IEntry *ie)
  8. {
  9. Bprint(&bout, "%22lld %V %3d %5d\n",
  10. ie->ia.addr, ie->score, ie->ia.type, ie->ia.size);
  11. }
  12. void
  13. usage(void)
  14. {
  15. fprint(2, "usage: printindex [-B blockcachesize] config [isectname...]\n");
  16. threadexitsall(0);
  17. }
  18. Config conf;
  19. int
  20. shoulddump(char *name, int argc, char **argv)
  21. {
  22. int i;
  23. if(argc == 0)
  24. return 1;
  25. for(i=0; i<argc; i++)
  26. if(strcmp(name, argv[i]) == 0)
  27. return 1;
  28. return 0;
  29. }
  30. void
  31. dumpisect(ISect *is)
  32. {
  33. int j;
  34. uchar *buf;
  35. u32int i;
  36. u64int off;
  37. IBucket ib;
  38. IEntry ie;
  39. buf = emalloc(is->blocksize);
  40. for(i=0; i<is->blocks; i++){
  41. off = is->blockbase+(u64int)is->blocksize*i;
  42. if(readpart(is->part, off, buf, is->blocksize) < 0)
  43. fprint(2, "read %s at 0x%llux: %r\n", is->part->name, off);
  44. else{
  45. unpackibucket(&ib, buf, is->bucketmagic);
  46. for(j=0; j<ib.n; j++){
  47. unpackientry(&ie, &ib.data[j*IEntrySize]);
  48. pie(&ie);
  49. }
  50. }
  51. }
  52. }
  53. void
  54. threadmain(int argc, char *argv[])
  55. {
  56. int i;
  57. Index *ix;
  58. u32int bcmem;
  59. bcmem = 0;
  60. ARGBEGIN{
  61. case 'B':
  62. bcmem = unittoull(ARGF());
  63. break;
  64. default:
  65. usage();
  66. break;
  67. }ARGEND
  68. if(argc < 1)
  69. usage();
  70. fmtinstall('H', encodefmt);
  71. if(initventi(argv[0], &conf) < 0)
  72. sysfatal("can't init venti: %r");
  73. if(bcmem < maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16))
  74. bcmem = maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16);
  75. if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
  76. initdcache(bcmem);
  77. ix = mainindex;
  78. Binit(&bout, 1, OWRITE);
  79. for(i=0; i<ix->nsects; i++)
  80. if(shoulddump(ix->sects[i]->name, argc-1, argv+1))
  81. dumpisect(ix->sects[i]);
  82. Bterm(&bout);
  83. threadexitsall(0);
  84. }