Blame


1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
4 a0d146ed 2005-07-12 devnull
5 a0d146ed 2005-07-12 devnull void
6 a0d146ed 2005-07-12 devnull usage(void)
7 a0d146ed 2005-07-12 devnull {
8 185fd7db 2020-01-13 crossd fprint(2, "usage: printarena [-o aoffset] arenafile [offset]\n");
9 a0d146ed 2005-07-12 devnull threadexitsall("usage");
10 a0d146ed 2005-07-12 devnull }
11 a0d146ed 2005-07-12 devnull
12 a0d146ed 2005-07-12 devnull static void
13 a0d146ed 2005-07-12 devnull rdarena(Arena *arena, u64int offset)
14 a0d146ed 2005-07-12 devnull {
15 a0d146ed 2005-07-12 devnull u64int a, aa, e;
16 a0d146ed 2005-07-12 devnull u32int magic;
17 a0d146ed 2005-07-12 devnull Clump cl;
18 a0d146ed 2005-07-12 devnull uchar score[VtScoreSize];
19 a0d146ed 2005-07-12 devnull ZBlock *lump;
20 a0d146ed 2005-07-12 devnull
21 a0d146ed 2005-07-12 devnull printarena(2, arena);
22 a0d146ed 2005-07-12 devnull
23 a0d146ed 2005-07-12 devnull a = arena->base;
24 a0d146ed 2005-07-12 devnull e = arena->base + arena->size;
25 a0d146ed 2005-07-12 devnull if(offset != ~(u64int)0) {
26 a0d146ed 2005-07-12 devnull if(offset >= e-a)
27 f5a8ea6f 2011-06-02 rsc sysfatal("bad offset %llud >= %llud",
28 a0d146ed 2005-07-12 devnull offset, e-a);
29 a0d146ed 2005-07-12 devnull aa = offset;
30 a0d146ed 2005-07-12 devnull } else
31 a0d146ed 2005-07-12 devnull aa = 0;
32 a0d146ed 2005-07-12 devnull
33 a0d146ed 2005-07-12 devnull for(; aa < e; aa += ClumpSize+cl.info.size) {
34 a0d146ed 2005-07-12 devnull magic = clumpmagic(arena, aa);
35 a0d146ed 2005-07-12 devnull if(magic == ClumpFreeMagic)
36 a0d146ed 2005-07-12 devnull break;
37 a0d146ed 2005-07-12 devnull if(magic != arena->clumpmagic) {
38 a0d146ed 2005-07-12 devnull fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
39 a0d146ed 2005-07-12 devnull magic, aa);
40 a0d146ed 2005-07-12 devnull break;
41 a0d146ed 2005-07-12 devnull }
42 a0d146ed 2005-07-12 devnull lump = loadclump(arena, aa, 0, &cl, score, 0);
43 a0d146ed 2005-07-12 devnull if(lump == nil) {
44 a0d146ed 2005-07-12 devnull fprint(2, "clump %llud failed to read: %r\n", aa);
45 a0d146ed 2005-07-12 devnull break;
46 a0d146ed 2005-07-12 devnull }
47 a0d146ed 2005-07-12 devnull if(cl.info.type != VtCorruptType) {
48 a0d146ed 2005-07-12 devnull scoremem(score, lump->data, cl.info.uncsize);
49 a0d146ed 2005-07-12 devnull if(scorecmp(cl.info.score, score) != 0) {
50 a0d146ed 2005-07-12 devnull fprint(2, "clump %llud has mismatched score\n", aa);
51 a0d146ed 2005-07-12 devnull break;
52 a0d146ed 2005-07-12 devnull }
53 a0d146ed 2005-07-12 devnull if(vttypevalid(cl.info.type) < 0) {
54 a0d146ed 2005-07-12 devnull fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
55 a0d146ed 2005-07-12 devnull break;
56 a0d146ed 2005-07-12 devnull }
57 a0d146ed 2005-07-12 devnull }
58 a0d146ed 2005-07-12 devnull print("%22llud %V %3d %5d\n", aa, score, cl.info.type, cl.info.uncsize);
59 a0d146ed 2005-07-12 devnull freezblock(lump);
60 a0d146ed 2005-07-12 devnull }
61 a0d146ed 2005-07-12 devnull print("end offset %llud\n", aa);
62 a0d146ed 2005-07-12 devnull }
63 a0d146ed 2005-07-12 devnull
64 a0d146ed 2005-07-12 devnull void
65 a0d146ed 2005-07-12 devnull threadmain(int argc, char *argv[])
66 a0d146ed 2005-07-12 devnull {
67 a0d146ed 2005-07-12 devnull char *file;
68 a0d146ed 2005-07-12 devnull Arena *arena;
69 a0d146ed 2005-07-12 devnull u64int offset, aoffset;
70 a0d146ed 2005-07-12 devnull Part *part;
71 27d28098 2007-04-21 devnull static uchar buf[8192];
72 a0d146ed 2005-07-12 devnull ArenaHead head;
73 a0d146ed 2005-07-12 devnull
74 a0d146ed 2005-07-12 devnull readonly = 1; /* for part.c */
75 a0d146ed 2005-07-12 devnull aoffset = 0;
76 a0d146ed 2005-07-12 devnull ARGBEGIN{
77 a0d146ed 2005-07-12 devnull case 'o':
78 a0d146ed 2005-07-12 devnull aoffset = strtoull(EARGF(usage()), 0, 0);
79 a0d146ed 2005-07-12 devnull break;
80 a0d146ed 2005-07-12 devnull default:
81 a0d146ed 2005-07-12 devnull usage();
82 a0d146ed 2005-07-12 devnull break;
83 a0d146ed 2005-07-12 devnull }ARGEND
84 a0d146ed 2005-07-12 devnull
85 a0d146ed 2005-07-12 devnull offset = ~(u64int)0;
86 a0d146ed 2005-07-12 devnull switch(argc) {
87 a0d146ed 2005-07-12 devnull default:
88 a0d146ed 2005-07-12 devnull usage();
89 a0d146ed 2005-07-12 devnull case 2:
90 a0d146ed 2005-07-12 devnull offset = strtoull(argv[1], 0, 0);
91 a0d146ed 2005-07-12 devnull /* fall through */
92 a0d146ed 2005-07-12 devnull case 1:
93 a0d146ed 2005-07-12 devnull file = argv[0];
94 a0d146ed 2005-07-12 devnull }
95 a0d146ed 2005-07-12 devnull
96 a0d146ed 2005-07-12 devnull
97 a0d146ed 2005-07-12 devnull ventifmtinstall();
98 a0d146ed 2005-07-12 devnull statsinit();
99 a0d146ed 2005-07-12 devnull
100 a0d146ed 2005-07-12 devnull part = initpart(file, OREAD|ODIRECT);
101 a0d146ed 2005-07-12 devnull if(part == nil)
102 a0d146ed 2005-07-12 devnull sysfatal("can't open file %s: %r", file);
103 a0d146ed 2005-07-12 devnull if(readpart(part, aoffset, buf, sizeof buf) < 0)
104 a0d146ed 2005-07-12 devnull sysfatal("can't read file %s: %r", file);
105 a0d146ed 2005-07-12 devnull
106 a0d146ed 2005-07-12 devnull if(unpackarenahead(&head, buf) < 0)
107 a0d146ed 2005-07-12 devnull sysfatal("corrupted arena header: %r");
108 a0d146ed 2005-07-12 devnull
109 a0d146ed 2005-07-12 devnull print("# arena head version=%d name=%.*s blocksize=%d size=%lld clumpmagic=0x%.8ux\n",
110 a0d146ed 2005-07-12 devnull head.version, ANameSize, head.name, head.blocksize,
111 a0d146ed 2005-07-12 devnull head.size, head.clumpmagic);
112 a0d146ed 2005-07-12 devnull
113 1726f602 2005-10-29 devnull if(aoffset+head.size > part->size)
114 f5a8ea6f 2011-06-02 rsc sysfatal("arena is truncated: want %llud bytes have %llud",
115 1726f602 2005-10-29 devnull head.size, part->size);
116 a0d146ed 2005-07-12 devnull
117 a0d146ed 2005-07-12 devnull partblocksize(part, head.blocksize);
118 a0d146ed 2005-07-12 devnull initdcache(8 * MaxDiskBlock);
119 a0d146ed 2005-07-12 devnull
120 a0d146ed 2005-07-12 devnull arena = initarena(part, aoffset, head.size, head.blocksize);
121 a0d146ed 2005-07-12 devnull if(arena == nil)
122 a0d146ed 2005-07-12 devnull sysfatal("initarena: %r");
123 a0d146ed 2005-07-12 devnull
124 a0d146ed 2005-07-12 devnull rdarena(arena, offset);
125 a0d146ed 2005-07-12 devnull threadexitsall(0);
126 a0d146ed 2005-07-12 devnull }