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