xref: /plan9-contrib/sys/src/cmd/venti/srv/printarena.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
1368c31abSDavid du Colombier #include "stdinc.h"
2368c31abSDavid du Colombier #include "dat.h"
3368c31abSDavid du Colombier #include "fns.h"
4368c31abSDavid du Colombier 
5368c31abSDavid du Colombier void
usage(void)6368c31abSDavid du Colombier usage(void)
7368c31abSDavid du Colombier {
8368c31abSDavid du Colombier 	fprint(2, "usage: printarena arenafile [offset]\n");
9368c31abSDavid du Colombier 	threadexitsall("usage");
10368c31abSDavid du Colombier }
11368c31abSDavid du Colombier 
12368c31abSDavid du Colombier static void
rdarena(Arena * arena,u64int offset)13368c31abSDavid du Colombier rdarena(Arena *arena, u64int offset)
14368c31abSDavid du Colombier {
15368c31abSDavid du Colombier 	u64int a, aa, e;
16368c31abSDavid du Colombier 	u32int magic;
17368c31abSDavid du Colombier 	Clump cl;
18368c31abSDavid du Colombier 	uchar score[VtScoreSize];
19368c31abSDavid du Colombier 	ZBlock *lump;
20368c31abSDavid du Colombier 
21368c31abSDavid du Colombier 	printarena(2, arena);
22368c31abSDavid du Colombier 
23368c31abSDavid du Colombier 	a = arena->base;
24368c31abSDavid du Colombier 	e = arena->base + arena->size;
25368c31abSDavid du Colombier 	if(offset != ~(u64int)0) {
26368c31abSDavid du Colombier 		if(offset >= e-a)
27*14cc0f53SDavid du Colombier 			sysfatal("bad offset %llud >= %llud",
28368c31abSDavid du Colombier 				offset, e-a);
29368c31abSDavid du Colombier 		aa = offset;
30368c31abSDavid du Colombier 	} else
31368c31abSDavid du Colombier 		aa = 0;
32368c31abSDavid du Colombier 
33368c31abSDavid du Colombier 	for(; aa < e; aa += ClumpSize+cl.info.size) {
34368c31abSDavid du Colombier 		magic = clumpmagic(arena, aa);
35368c31abSDavid du Colombier 		if(magic == ClumpFreeMagic)
36368c31abSDavid du Colombier 			break;
37368c31abSDavid du Colombier 		if(magic != arena->clumpmagic) {
38368c31abSDavid du Colombier 			fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
39368c31abSDavid du Colombier 				magic, aa);
40368c31abSDavid du Colombier 			break;
41368c31abSDavid du Colombier 		}
42368c31abSDavid du Colombier 		lump = loadclump(arena, aa, 0, &cl, score, 0);
43368c31abSDavid du Colombier 		if(lump == nil) {
44368c31abSDavid du Colombier 			fprint(2, "clump %llud failed to read: %r\n", aa);
45368c31abSDavid du Colombier 			break;
46368c31abSDavid du Colombier 		}
47368c31abSDavid du Colombier 		if(cl.info.type != VtCorruptType) {
48368c31abSDavid du Colombier 			scoremem(score, lump->data, cl.info.uncsize);
49368c31abSDavid du Colombier 			if(scorecmp(cl.info.score, score) != 0) {
50368c31abSDavid du Colombier 				fprint(2, "clump %llud has mismatched score\n", aa);
51368c31abSDavid du Colombier 				break;
52368c31abSDavid du Colombier 			}
53368c31abSDavid du Colombier 			if(vttypevalid(cl.info.type) < 0) {
54368c31abSDavid du Colombier 				fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
55368c31abSDavid du Colombier 				break;
56368c31abSDavid du Colombier 			}
57368c31abSDavid du Colombier 		}
58368c31abSDavid du Colombier 		print("%22llud %V %3d %5d\n", aa, score, cl.info.type, cl.info.uncsize);
59368c31abSDavid du Colombier 		freezblock(lump);
60368c31abSDavid du Colombier 	}
61368c31abSDavid du Colombier 	print("end offset %llud\n", aa);
62368c31abSDavid du Colombier }
63368c31abSDavid du Colombier 
64368c31abSDavid du Colombier void
threadmain(int argc,char * argv[])65368c31abSDavid du Colombier threadmain(int argc, char *argv[])
66368c31abSDavid du Colombier {
67368c31abSDavid du Colombier 	char *file;
68368c31abSDavid du Colombier 	Arena *arena;
69368c31abSDavid du Colombier 	u64int offset, aoffset;
70368c31abSDavid du Colombier 	Part *part;
71368c31abSDavid du Colombier 	static uchar buf[8192];
72368c31abSDavid du Colombier 	ArenaHead head;
73368c31abSDavid du Colombier 
74368c31abSDavid du Colombier 	readonly = 1;	/* for part.c */
75368c31abSDavid du Colombier 	aoffset = 0;
76368c31abSDavid du Colombier 	ARGBEGIN{
77368c31abSDavid du Colombier 	case 'o':
78368c31abSDavid du Colombier 		aoffset = strtoull(EARGF(usage()), 0, 0);
79368c31abSDavid du Colombier 		break;
80368c31abSDavid du Colombier 	default:
81368c31abSDavid du Colombier 		usage();
82368c31abSDavid du Colombier 		break;
83368c31abSDavid du Colombier 	}ARGEND
84368c31abSDavid du Colombier 
85368c31abSDavid du Colombier 	offset = ~(u64int)0;
86368c31abSDavid du Colombier 	switch(argc) {
87368c31abSDavid du Colombier 	default:
88368c31abSDavid du Colombier 		usage();
89368c31abSDavid du Colombier 	case 2:
90368c31abSDavid du Colombier 		offset = strtoull(argv[1], 0, 0);
91368c31abSDavid du Colombier 		/* fall through */
92368c31abSDavid du Colombier 	case 1:
93368c31abSDavid du Colombier 		file = argv[0];
94368c31abSDavid du Colombier 	}
95368c31abSDavid du Colombier 
96368c31abSDavid du Colombier 
97368c31abSDavid du Colombier 	ventifmtinstall();
98368c31abSDavid du Colombier 	statsinit();
99368c31abSDavid du Colombier 
100368c31abSDavid du Colombier 	part = initpart(file, OREAD|ODIRECT);
101368c31abSDavid du Colombier 	if(part == nil)
102368c31abSDavid du Colombier 		sysfatal("can't open file %s: %r", file);
103368c31abSDavid du Colombier 	if(readpart(part, aoffset, buf, sizeof buf) < 0)
104368c31abSDavid du Colombier 		sysfatal("can't read file %s: %r", file);
105368c31abSDavid du Colombier 
106368c31abSDavid du Colombier 	if(unpackarenahead(&head, buf) < 0)
107368c31abSDavid du Colombier 		sysfatal("corrupted arena header: %r");
108368c31abSDavid du Colombier 
109368c31abSDavid du Colombier 	print("# arena head version=%d name=%.*s blocksize=%d size=%lld clumpmagic=0x%.8ux\n",
110368c31abSDavid du Colombier 		head.version, ANameSize, head.name, head.blocksize,
111368c31abSDavid du Colombier 		head.size, head.clumpmagic);
112368c31abSDavid du Colombier 
113368c31abSDavid du Colombier 	if(aoffset+head.size > part->size)
114*14cc0f53SDavid du Colombier 		sysfatal("arena is truncated: want %llud bytes have %llud",
115368c31abSDavid du Colombier 			head.size, part->size);
116368c31abSDavid du Colombier 
117368c31abSDavid du Colombier 	partblocksize(part, head.blocksize);
118368c31abSDavid du Colombier 	initdcache(8 * MaxDiskBlock);
119368c31abSDavid du Colombier 
120368c31abSDavid du Colombier 	arena = initarena(part, aoffset, head.size, head.blocksize);
121368c31abSDavid du Colombier 	if(arena == nil)
122368c31abSDavid du Colombier 		sysfatal("initarena: %r");
123368c31abSDavid du Colombier 
124368c31abSDavid du Colombier 	rdarena(arena, offset);
125368c31abSDavid du Colombier 	threadexitsall(0);
126368c31abSDavid du Colombier }
127