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