xref: /plan9/sys/src/cmd/venti/srv/printindex.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
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