Blame


1 7a4ee46d 2003-11-23 devnull #include "stdinc.h"
2 7a4ee46d 2003-11-23 devnull #include "dat.h"
3 7a4ee46d 2003-11-23 devnull #include "fns.h"
4 7a4ee46d 2003-11-23 devnull
5 7a4ee46d 2003-11-23 devnull char *host;
6 7a4ee46d 2003-11-23 devnull int readonly = 1; /* for part.c */
7 7a4ee46d 2003-11-23 devnull
8 7a4ee46d 2003-11-23 devnull void
9 7a4ee46d 2003-11-23 devnull usage(void)
10 7a4ee46d 2003-11-23 devnull {
11 7a4ee46d 2003-11-23 devnull fprint(2, "usage: wrarena [-h host] arenafile [offset]\n");
12 7a4ee46d 2003-11-23 devnull threadexitsall("usage");
13 7a4ee46d 2003-11-23 devnull }
14 7a4ee46d 2003-11-23 devnull
15 7a4ee46d 2003-11-23 devnull static void
16 7a4ee46d 2003-11-23 devnull rdarena(VtConn *z, Arena *arena, u64int offset)
17 7a4ee46d 2003-11-23 devnull {
18 7a4ee46d 2003-11-23 devnull u64int a, aa, e;
19 7a4ee46d 2003-11-23 devnull u32int magic;
20 7a4ee46d 2003-11-23 devnull Clump cl;
21 7a4ee46d 2003-11-23 devnull uchar score[VtScoreSize];
22 7a4ee46d 2003-11-23 devnull ZBlock *lump;
23 7a4ee46d 2003-11-23 devnull
24 7a4ee46d 2003-11-23 devnull fprint(2, "copying %s to venti\n", arena->name);
25 7a4ee46d 2003-11-23 devnull printarena(2, arena);
26 7a4ee46d 2003-11-23 devnull
27 7a4ee46d 2003-11-23 devnull a = arena->base;
28 7a4ee46d 2003-11-23 devnull e = arena->base + arena->size;
29 7a4ee46d 2003-11-23 devnull if(offset != ~(u64int)0) {
30 7a4ee46d 2003-11-23 devnull if(offset >= e-a)
31 7a4ee46d 2003-11-23 devnull sysfatal("bad offset %llud >= %llud\n",
32 7a4ee46d 2003-11-23 devnull offset, e-a);
33 7a4ee46d 2003-11-23 devnull aa = offset;
34 7a4ee46d 2003-11-23 devnull } else
35 7a4ee46d 2003-11-23 devnull aa = 0;
36 7a4ee46d 2003-11-23 devnull
37 7a4ee46d 2003-11-23 devnull for(; aa < e; aa += ClumpSize+cl.info.size) {
38 7a4ee46d 2003-11-23 devnull magic = clumpmagic(arena, aa);
39 7a4ee46d 2003-11-23 devnull if(magic == ClumpFreeMagic)
40 7a4ee46d 2003-11-23 devnull break;
41 7a4ee46d 2003-11-23 devnull if(magic != ClumpMagic) {
42 7a4ee46d 2003-11-23 devnull fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
43 7a4ee46d 2003-11-23 devnull magic, aa);
44 7a4ee46d 2003-11-23 devnull break;
45 7a4ee46d 2003-11-23 devnull }
46 7a4ee46d 2003-11-23 devnull lump = loadclump(arena, aa, 0, &cl, score, 0);
47 7a4ee46d 2003-11-23 devnull if(lump == nil) {
48 7a4ee46d 2003-11-23 devnull fprint(2, "clump %llud failed to read: %r\n", aa);
49 7a4ee46d 2003-11-23 devnull break;
50 7a4ee46d 2003-11-23 devnull }
51 7a4ee46d 2003-11-23 devnull if(cl.info.type != VtTypeCorrupt) {
52 7a4ee46d 2003-11-23 devnull scoremem(score, lump->data, cl.info.uncsize);
53 7a4ee46d 2003-11-23 devnull if(scorecmp(cl.info.score, score) != 0) {
54 7a4ee46d 2003-11-23 devnull fprint(2, "clump %llud has mismatched score\n", aa);
55 7a4ee46d 2003-11-23 devnull break;
56 7a4ee46d 2003-11-23 devnull }
57 7a4ee46d 2003-11-23 devnull if(vttypevalid(cl.info.type) < 0) {
58 7a4ee46d 2003-11-23 devnull fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
59 7a4ee46d 2003-11-23 devnull break;
60 7a4ee46d 2003-11-23 devnull }
61 7a4ee46d 2003-11-23 devnull }
62 7a4ee46d 2003-11-23 devnull if(z && vtwrite(z, score, cl.info.type, lump->data, cl.info.uncsize) < 0)
63 7a4ee46d 2003-11-23 devnull sysfatal("failed writing clump %llud: %r", aa);
64 7a4ee46d 2003-11-23 devnull freezblock(lump);
65 7a4ee46d 2003-11-23 devnull }
66 7a4ee46d 2003-11-23 devnull if(z && vtsync(z) < 0)
67 7a4ee46d 2003-11-23 devnull sysfatal("failed executing sync: %r");
68 7a4ee46d 2003-11-23 devnull
69 7a4ee46d 2003-11-23 devnull print("end offset %llud\n", aa);
70 7a4ee46d 2003-11-23 devnull }
71 7a4ee46d 2003-11-23 devnull
72 7a4ee46d 2003-11-23 devnull void
73 7a4ee46d 2003-11-23 devnull threadmain(int argc, char *argv[])
74 7a4ee46d 2003-11-23 devnull {
75 7a4ee46d 2003-11-23 devnull char *file;
76 7a4ee46d 2003-11-23 devnull VtConn *z;
77 7a4ee46d 2003-11-23 devnull Arena *arena;
78 7a4ee46d 2003-11-23 devnull u64int offset, aoffset;
79 7a4ee46d 2003-11-23 devnull Part *part;
80 7a4ee46d 2003-11-23 devnull Dir *d;
81 7a4ee46d 2003-11-23 devnull uchar buf[8192];
82 7a4ee46d 2003-11-23 devnull ArenaHead head;
83 7a4ee46d 2003-11-23 devnull
84 7a4ee46d 2003-11-23 devnull aoffset = 0;
85 7a4ee46d 2003-11-23 devnull ARGBEGIN{
86 7a4ee46d 2003-11-23 devnull case 'h':
87 7a4ee46d 2003-11-23 devnull host = EARGF(usage());
88 7a4ee46d 2003-11-23 devnull break;
89 7a4ee46d 2003-11-23 devnull case 'o':
90 7a4ee46d 2003-11-23 devnull aoffset = strtoull(EARGF(usage()), 0, 0);
91 7a4ee46d 2003-11-23 devnull break;
92 7a4ee46d 2003-11-23 devnull default:
93 7a4ee46d 2003-11-23 devnull usage();
94 7a4ee46d 2003-11-23 devnull break;
95 7a4ee46d 2003-11-23 devnull }ARGEND
96 7a4ee46d 2003-11-23 devnull
97 7a4ee46d 2003-11-23 devnull offset = ~(u64int)0;
98 7a4ee46d 2003-11-23 devnull switch(argc) {
99 7a4ee46d 2003-11-23 devnull default:
100 7a4ee46d 2003-11-23 devnull usage();
101 7a4ee46d 2003-11-23 devnull case 2:
102 7a4ee46d 2003-11-23 devnull offset = strtoull(argv[1], 0, 0);
103 7a4ee46d 2003-11-23 devnull /* fall through */
104 7a4ee46d 2003-11-23 devnull case 1:
105 7a4ee46d 2003-11-23 devnull file = argv[0];
106 7a4ee46d 2003-11-23 devnull }
107 7a4ee46d 2003-11-23 devnull
108 7a4ee46d 2003-11-23 devnull
109 7a4ee46d 2003-11-23 devnull fmtinstall('V', vtscorefmt);
110 7a4ee46d 2003-11-23 devnull
111 7a4ee46d 2003-11-23 devnull statsinit();
112 7a4ee46d 2003-11-23 devnull
113 7a4ee46d 2003-11-23 devnull if((d = dirstat(file)) == nil)
114 7a4ee46d 2003-11-23 devnull sysfatal("can't stat file %s: %r", file);
115 7a4ee46d 2003-11-23 devnull
116 7a4ee46d 2003-11-23 devnull part = initpart(file, 0);
117 7a4ee46d 2003-11-23 devnull if(part == nil)
118 7a4ee46d 2003-11-23 devnull sysfatal("can't open file %s: %r", file);
119 7a4ee46d 2003-11-23 devnull if(readpart(part, aoffset, buf, sizeof buf) < 0)
120 7a4ee46d 2003-11-23 devnull sysfatal("can't read file %s: %r", file);
121 7a4ee46d 2003-11-23 devnull
122 7a4ee46d 2003-11-23 devnull if(unpackarenahead(&head, buf) < 0)
123 7a4ee46d 2003-11-23 devnull sysfatal("corrupted arena header: %r");
124 7a4ee46d 2003-11-23 devnull
125 7a4ee46d 2003-11-23 devnull if(aoffset+head.size > d->length)
126 7a4ee46d 2003-11-23 devnull sysfatal("arena is truncated: want %llud bytes have %llud\n",
127 7a4ee46d 2003-11-23 devnull head.size, d->length);
128 7a4ee46d 2003-11-23 devnull
129 7a4ee46d 2003-11-23 devnull partblocksize(part, head.blocksize);
130 7a4ee46d 2003-11-23 devnull initdcache(8 * MaxDiskBlock);
131 7a4ee46d 2003-11-23 devnull
132 7a4ee46d 2003-11-23 devnull arena = initarena(part, aoffset, head.size, head.blocksize);
133 7a4ee46d 2003-11-23 devnull if(arena == nil)
134 7a4ee46d 2003-11-23 devnull sysfatal("initarena: %r");
135 7a4ee46d 2003-11-23 devnull
136 7a4ee46d 2003-11-23 devnull if(host && strcmp(host, "/dev/null") != 0){
137 7a4ee46d 2003-11-23 devnull z = vtdial(host);
138 7a4ee46d 2003-11-23 devnull if(z == nil)
139 7a4ee46d 2003-11-23 devnull sysfatal("could not connect to server: %r");
140 7a4ee46d 2003-11-23 devnull if(vtconnect(z) < 0)
141 7a4ee46d 2003-11-23 devnull sysfatal("vtconnect: %r");
142 7a4ee46d 2003-11-23 devnull }else
143 7a4ee46d 2003-11-23 devnull z = nil;
144 7a4ee46d 2003-11-23 devnull
145 7a4ee46d 2003-11-23 devnull rdarena(z, arena, offset);
146 7a4ee46d 2003-11-23 devnull vthangup(z);
147 7a4ee46d 2003-11-23 devnull threadexitsall(0);
148 7a4ee46d 2003-11-23 devnull }