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>
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;
15 a0d146ed 2005-07-12 devnull usage(void)
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");
22 a0d146ed 2005-07-12 devnull walk(uchar score[VtScoreSize], uint type, int base)
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;
29 a0d146ed 2005-07-12 devnull if(memcmp(score, vtzeroscore, VtScoreSize) == 0)
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);
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);
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);
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 */
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;
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);
74 a0d146ed 2005-07-12 devnull case VtDataType:
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);
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);
91 a0d146ed 2005-07-12 devnull free(buf);
95 a0d146ed 2005-07-12 devnull threadmain(int argc, char *argv[])
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;
102 a0d146ed 2005-07-12 devnull fmtinstall('F', vtfcallfmt);
103 a0d146ed 2005-07-12 devnull fmtinstall('V', vtscorefmt);
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;
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;
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;
120 a0d146ed 2005-07-12 devnull case 't':
121 a0d146ed 2005-07-12 devnull type = atoi(EARGF(usage()));
123 a0d146ed 2005-07-12 devnull default:
124 a0d146ed 2005-07-12 devnull usage();
128 a0d146ed 2005-07-12 devnull if(argc != 3)
129 a0d146ed 2005-07-12 devnull usage();
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");
134 a0d146ed 2005-07-12 devnull buf = vtmallocz(VtMaxLumpSize);
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");
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");
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");
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)
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);
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);
166 a0d146ed 2005-07-12 devnull if(vtsync(zdst) < 0)
167 a0d146ed 2005-07-12 devnull sysfatal("could not sync dst server: %r");
169 a0d146ed 2005-07-12 devnull threadexitsall(0);