Blame


1 a0d146ed 2005-07-12 devnull #include <u.h>
2 a0d146ed 2005-07-12 devnull #include <libc.h>
3 a0d146ed 2005-07-12 devnull #include <venti.h>
4 a0d146ed 2005-07-12 devnull #include <libsec.h>
5 a0d146ed 2005-07-12 devnull #include <thread.h>
6 a0d146ed 2005-07-12 devnull
7 a0d146ed 2005-07-12 devnull int changes;
8 a0d146ed 2005-07-12 devnull int rewrite;
9 a0d146ed 2005-07-12 devnull int ignoreerrors;
10 a0d146ed 2005-07-12 devnull int fast;
11 a0d146ed 2005-07-12 devnull int verbose;
12 a0d146ed 2005-07-12 devnull VtConn *zsrc, *zdst;
13 a0d146ed 2005-07-12 devnull
14 a0d146ed 2005-07-12 devnull void
15 a0d146ed 2005-07-12 devnull usage(void)
16 a0d146ed 2005-07-12 devnull {
17 a0d146ed 2005-07-12 devnull fprint(2, "usage: copy [-fir] [-t type] srchost dsthost score\n");
18 a0d146ed 2005-07-12 devnull threadexitsall("usage");
19 a0d146ed 2005-07-12 devnull }
20 a0d146ed 2005-07-12 devnull
21 a0d146ed 2005-07-12 devnull void
22 a0d146ed 2005-07-12 devnull walk(uchar score[VtScoreSize], uint type, int base)
23 a0d146ed 2005-07-12 devnull {
24 a0d146ed 2005-07-12 devnull int i, n;
25 a0d146ed 2005-07-12 devnull uchar *buf;
26 a0d146ed 2005-07-12 devnull VtEntry e;
27 a0d146ed 2005-07-12 devnull VtRoot root;
28 a0d146ed 2005-07-12 devnull
29 a0d146ed 2005-07-12 devnull if(memcmp(score, vtzeroscore, VtScoreSize) == 0)
30 a0d146ed 2005-07-12 devnull return;
31 a0d146ed 2005-07-12 devnull
32 a0d146ed 2005-07-12 devnull buf = vtmallocz(VtMaxLumpSize);
33 a0d146ed 2005-07-12 devnull if(fast && vtread(zdst, score, type, buf, VtMaxLumpSize) >= 0){
34 a0d146ed 2005-07-12 devnull if(verbose)
35 a0d146ed 2005-07-12 devnull fprint(2, "skip %V\n", score);
36 a0d146ed 2005-07-12 devnull free(buf);
37 a0d146ed 2005-07-12 devnull return;
38 a0d146ed 2005-07-12 devnull }
39 a0d146ed 2005-07-12 devnull
40 a0d146ed 2005-07-12 devnull n = vtread(zsrc, score, type, buf, VtMaxLumpSize);
41 a0d146ed 2005-07-12 devnull if(n < 0){
42 a0d146ed 2005-07-12 devnull if(rewrite){
43 a0d146ed 2005-07-12 devnull changes++;
44 a0d146ed 2005-07-12 devnull memmove(score, vtzeroscore, VtScoreSize);
45 a0d146ed 2005-07-12 devnull }else if(!ignoreerrors)
46 4dde6329 2005-10-29 devnull sysfatal("reading block %V (type %d): %r", score, type);
47 a0d146ed 2005-07-12 devnull return;
48 a0d146ed 2005-07-12 devnull }
49 a0d146ed 2005-07-12 devnull
50 a0d146ed 2005-07-12 devnull switch(type){
51 a0d146ed 2005-07-12 devnull case VtRootType:
52 a0d146ed 2005-07-12 devnull if(vtrootunpack(&root, buf) < 0){
53 a0d146ed 2005-07-12 devnull fprint(2, "warning: could not unpack root in %V %d\n", score, type);
54 a0d146ed 2005-07-12 devnull break;
55 a0d146ed 2005-07-12 devnull }
56 a0d146ed 2005-07-12 devnull walk(root.score, VtDirType, 0);
57 a0d146ed 2005-07-12 devnull walk(root.prev, VtRootType, 0);
58 a0d146ed 2005-07-12 devnull vtrootpack(&root, buf); /* walk might have changed score */
59 a0d146ed 2005-07-12 devnull break;
60 a0d146ed 2005-07-12 devnull
61 a0d146ed 2005-07-12 devnull case VtDirType:
62 a0d146ed 2005-07-12 devnull for(i=0; i<n/VtEntrySize; i++){
63 a0d146ed 2005-07-12 devnull if(vtentryunpack(&e, buf, i) < 0){
64 a0d146ed 2005-07-12 devnull fprint(2, "warning: could not unpack entry #%d in %V %d\n", i, score, type);
65 a0d146ed 2005-07-12 devnull continue;
66 a0d146ed 2005-07-12 devnull }
67 a0d146ed 2005-07-12 devnull if(!(e.flags & VtEntryActive))
68 a0d146ed 2005-07-12 devnull continue;
69 a0d146ed 2005-07-12 devnull walk(e.score, e.type, e.type&VtTypeBaseMask);
70 a0d146ed 2005-07-12 devnull vtentrypack(&e, buf, i);
71 a0d146ed 2005-07-12 devnull }
72 a0d146ed 2005-07-12 devnull break;
73 a0d146ed 2005-07-12 devnull
74 a0d146ed 2005-07-12 devnull case VtDataType:
75 a0d146ed 2005-07-12 devnull break;
76 a0d146ed 2005-07-12 devnull
77 a0d146ed 2005-07-12 devnull default: /* pointers */
78 a0d146ed 2005-07-12 devnull for(i=0; i<n; i+=VtScoreSize)
79 a0d146ed 2005-07-12 devnull if(memcmp(buf+i, vtzeroscore, VtScoreSize) != 0)
80 a0d146ed 2005-07-12 devnull walk(buf+i, type-1, base);
81 a0d146ed 2005-07-12 devnull break;
82 a0d146ed 2005-07-12 devnull }
83 a0d146ed 2005-07-12 devnull
84 a0d146ed 2005-07-12 devnull if(vtwrite(zdst, score, type, buf, n) < 0){
85 a0d146ed 2005-07-12 devnull /* figure out score for better error message */
86 a0d146ed 2005-07-12 devnull /* can't use input argument - might have changed contents */
87 a0d146ed 2005-07-12 devnull n = vtzerotruncate(type, buf, n);
88 a0d146ed 2005-07-12 devnull sha1(buf, n, score, nil);
89 a0d146ed 2005-07-12 devnull sysfatal("writing block %V (type %d): %r", score, type);
90 a0d146ed 2005-07-12 devnull }
91 a0d146ed 2005-07-12 devnull free(buf);
92 a0d146ed 2005-07-12 devnull }
93 a0d146ed 2005-07-12 devnull
94 a0d146ed 2005-07-12 devnull void
95 a0d146ed 2005-07-12 devnull threadmain(int argc, char *argv[])
96 a0d146ed 2005-07-12 devnull {
97 a0d146ed 2005-07-12 devnull int type, n;
98 a0d146ed 2005-07-12 devnull uchar score[VtScoreSize];
99 a0d146ed 2005-07-12 devnull uchar *buf;
100 a0d146ed 2005-07-12 devnull char *prefix;
101 a0d146ed 2005-07-12 devnull
102 a0d146ed 2005-07-12 devnull fmtinstall('F', vtfcallfmt);
103 a0d146ed 2005-07-12 devnull fmtinstall('V', vtscorefmt);
104 a0d146ed 2005-07-12 devnull
105 a0d146ed 2005-07-12 devnull type = -1;
106 a0d146ed 2005-07-12 devnull ARGBEGIN{
107 a0d146ed 2005-07-12 devnull case 'f':
108 a0d146ed 2005-07-12 devnull fast = 1;
109 a0d146ed 2005-07-12 devnull break;
110 a0d146ed 2005-07-12 devnull case 'i':
111 a0d146ed 2005-07-12 devnull if(rewrite)
112 a0d146ed 2005-07-12 devnull usage();
113 a0d146ed 2005-07-12 devnull ignoreerrors = 1;
114 a0d146ed 2005-07-12 devnull break;
115 a0d146ed 2005-07-12 devnull case 'r':
116 a0d146ed 2005-07-12 devnull if(ignoreerrors)
117 a0d146ed 2005-07-12 devnull usage();
118 a0d146ed 2005-07-12 devnull rewrite = 1;
119 a0d146ed 2005-07-12 devnull break;
120 a0d146ed 2005-07-12 devnull case 't':
121 a0d146ed 2005-07-12 devnull type = atoi(EARGF(usage()));
122 a0d146ed 2005-07-12 devnull break;
123 a0d146ed 2005-07-12 devnull default:
124 a0d146ed 2005-07-12 devnull usage();
125 a0d146ed 2005-07-12 devnull break;
126 a0d146ed 2005-07-12 devnull }ARGEND
127 a0d146ed 2005-07-12 devnull
128 a0d146ed 2005-07-12 devnull if(argc != 3)
129 a0d146ed 2005-07-12 devnull usage();
130 a0d146ed 2005-07-12 devnull
131 a0d146ed 2005-07-12 devnull if(vtparsescore(argv[2], &prefix, score) < 0)
132 a0d146ed 2005-07-12 devnull sysfatal("could not parse score: %r");
133 a0d146ed 2005-07-12 devnull
134 a0d146ed 2005-07-12 devnull buf = vtmallocz(VtMaxLumpSize);
135 a0d146ed 2005-07-12 devnull
136 a0d146ed 2005-07-12 devnull zsrc = vtdial(argv[0]);
137 a0d146ed 2005-07-12 devnull if(zsrc == nil)
138 a0d146ed 2005-07-12 devnull sysfatal("could not dial src server: %r");
139 a0d146ed 2005-07-12 devnull if(vtconnect(zsrc) < 0)
140 a0d146ed 2005-07-12 devnull sysfatal("vtconnect src: %r");
141 a0d146ed 2005-07-12 devnull
142 a0d146ed 2005-07-12 devnull zdst = vtdial(argv[1]);
143 a0d146ed 2005-07-12 devnull if(zdst == nil)
144 a0d146ed 2005-07-12 devnull sysfatal("could not dial dst server: %r");
145 a0d146ed 2005-07-12 devnull if(vtconnect(zdst) < 0)
146 a0d146ed 2005-07-12 devnull sysfatal("vtconnect dst: %r");
147 a0d146ed 2005-07-12 devnull
148 a0d146ed 2005-07-12 devnull if(type != -1){
149 a0d146ed 2005-07-12 devnull n = vtread(zsrc, score, type, buf, VtMaxLumpSize);
150 a0d146ed 2005-07-12 devnull if(n < 0)
151 a0d146ed 2005-07-12 devnull sysfatal("could not read block: %r");
152 a0d146ed 2005-07-12 devnull }else{
153 a0d146ed 2005-07-12 devnull for(type=0; type<VtMaxType; type++){
154 a0d146ed 2005-07-12 devnull n = vtread(zsrc, score, type, buf, VtMaxLumpSize);
155 a0d146ed 2005-07-12 devnull if(n >= 0)
156 a0d146ed 2005-07-12 devnull break;
157 a0d146ed 2005-07-12 devnull }
158 a0d146ed 2005-07-12 devnull if(type == VtMaxType)
159 a0d146ed 2005-07-12 devnull sysfatal("could not find block %V of any type", score);
160 a0d146ed 2005-07-12 devnull }
161 a0d146ed 2005-07-12 devnull
162 a0d146ed 2005-07-12 devnull walk(score, type, VtDirType);
163 a0d146ed 2005-07-12 devnull if(changes)
164 a0d146ed 2005-07-12 devnull print("%s:%V (%d pointers rewritten)\n", prefix, score, changes);
165 a0d146ed 2005-07-12 devnull
166 a0d146ed 2005-07-12 devnull if(vtsync(zdst) < 0)
167 a0d146ed 2005-07-12 devnull sysfatal("could not sync dst server: %r");
168 a0d146ed 2005-07-12 devnull
169 a0d146ed 2005-07-12 devnull threadexitsall(0);
170 a0d146ed 2005-07-12 devnull }