Blame


1 7763a61a 2003-11-23 devnull #include "stdinc.h"
2 7763a61a 2003-11-23 devnull #include <bio.h>
3 7763a61a 2003-11-23 devnull
4 7763a61a 2003-11-23 devnull typedef struct Source Source;
5 7763a61a 2003-11-23 devnull
6 7763a61a 2003-11-23 devnull struct Source
7 7763a61a 2003-11-23 devnull {
8 7763a61a 2003-11-23 devnull ulong gen;
9 7763a61a 2003-11-23 devnull int psize;
10 7763a61a 2003-11-23 devnull int dsize;
11 7763a61a 2003-11-23 devnull int dir;
12 7763a61a 2003-11-23 devnull int active;
13 7763a61a 2003-11-23 devnull int depth;
14 7763a61a 2003-11-23 devnull uvlong size;
15 7763a61a 2003-11-23 devnull uchar score[VtScoreSize];
16 7763a61a 2003-11-23 devnull int reserved;
17 7763a61a 2003-11-23 devnull };
18 7763a61a 2003-11-23 devnull
19 7763a61a 2003-11-23 devnull int bsize;
20 7763a61a 2003-11-23 devnull Biobuf *bout;
21 7763a61a 2003-11-23 devnull VtRoot root;
22 7763a61a 2003-11-23 devnull int ver;
23 7763a61a 2003-11-23 devnull int cmp;
24 7763a61a 2003-11-23 devnull int all;
25 7763a61a 2003-11-23 devnull int find;
26 7763a61a 2003-11-23 devnull uchar fscore[VtScoreSize];
27 3d77c87e 2004-03-15 devnull VtConn *z;
28 7763a61a 2003-11-23 devnull
29 3d77c87e 2004-03-15 devnull int vtgetuint16(uchar *p);
30 3d77c87e 2004-03-15 devnull ulong vtgetuint32(uchar *p);
31 3d77c87e 2004-03-15 devnull uvlong vtgetuint48(uchar *p);
32 7763a61a 2003-11-23 devnull void usage(void);
33 3d77c87e 2004-03-15 devnull void readroot(VtRoot*, uchar *score, char *file);
34 3d77c87e 2004-03-15 devnull int dumpdir(Source*, int indent);
35 bb501e12 2004-06-17 devnull int timevtread(VtConn*, uchar*, int, void*, int);
36 7763a61a 2003-11-23 devnull
37 bb501e12 2004-06-17 devnull int mainstacksize = 512*1024;
38 bb501e12 2004-06-17 devnull
39 7763a61a 2003-11-23 devnull void
40 3d77c87e 2004-03-15 devnull threadmain(int argc, char *argv[])
41 7763a61a 2003-11-23 devnull {
42 3d77c87e 2004-03-15 devnull char *host = nil, *pref;
43 7763a61a 2003-11-23 devnull uchar score[VtScoreSize];
44 7763a61a 2003-11-23 devnull Source source;
45 7763a61a 2003-11-23 devnull char *p;
46 7763a61a 2003-11-23 devnull int n;
47 bb501e12 2004-06-17 devnull uchar buf[VtMaxLumpSize];
48 7763a61a 2003-11-23 devnull
49 7763a61a 2003-11-23 devnull ARGBEGIN{
50 7763a61a 2003-11-23 devnull case 'h':
51 7763a61a 2003-11-23 devnull host = ARGF();
52 7763a61a 2003-11-23 devnull break;
53 7763a61a 2003-11-23 devnull case 'c':
54 7763a61a 2003-11-23 devnull cmp++;
55 7763a61a 2003-11-23 devnull break;
56 7763a61a 2003-11-23 devnull case 'f':
57 7763a61a 2003-11-23 devnull find++;
58 7763a61a 2003-11-23 devnull p = ARGF();
59 3d77c87e 2004-03-15 devnull if(p == nil || vtparsescore(p, &pref, fscore) < 0 || !pref || strcmp(pref, "vac") != 0)
60 7763a61a 2003-11-23 devnull usage();
61 7763a61a 2003-11-23 devnull break;
62 7763a61a 2003-11-23 devnull case 'a':
63 7763a61a 2003-11-23 devnull all = 1;
64 7763a61a 2003-11-23 devnull break;
65 7763a61a 2003-11-23 devnull }ARGEND
66 7763a61a 2003-11-23 devnull
67 3d77c87e 2004-03-15 devnull bout = vtmallocz(sizeof(Biobuf));
68 7763a61a 2003-11-23 devnull Binit(bout, 1, OWRITE);
69 7763a61a 2003-11-23 devnull
70 7763a61a 2003-11-23 devnull if(argc > 1)
71 7763a61a 2003-11-23 devnull usage();
72 7763a61a 2003-11-23 devnull
73 3d77c87e 2004-03-15 devnull fmtinstall('V', vtscorefmt);
74 3d77c87e 2004-03-15 devnull fmtinstall('H', encodefmt);
75 7763a61a 2003-11-23 devnull
76 3d77c87e 2004-03-15 devnull z = vtdial(host);
77 7763a61a 2003-11-23 devnull if(z == nil)
78 3d77c87e 2004-03-15 devnull sysfatal("could not connect to server: %r");
79 7763a61a 2003-11-23 devnull
80 3d77c87e 2004-03-15 devnull if(vtconnect(z) < 0)
81 3d77c87e 2004-03-15 devnull sysfatal("vtconnect: %r");
82 7763a61a 2003-11-23 devnull
83 3d77c87e 2004-03-15 devnull readroot(&root, score, argv[0]);
84 3d77c87e 2004-03-15 devnull bsize = root.blocksize;
85 7763a61a 2003-11-23 devnull if(!find) {
86 7763a61a 2003-11-23 devnull Bprint(bout, "score: %V\n", score);
87 7763a61a 2003-11-23 devnull Bprint(bout, "name: %s\n", root.name);
88 7763a61a 2003-11-23 devnull Bprint(bout, "type: %s\n", root.type);
89 7763a61a 2003-11-23 devnull Bprint(bout, "bsize: %d\n", bsize);
90 7763a61a 2003-11-23 devnull Bprint(bout, "prev: %V\n", root.prev);
91 7763a61a 2003-11-23 devnull }
92 7763a61a 2003-11-23 devnull
93 be36ff68 2004-04-29 devnull fprint(2, "read...\n");
94 bb501e12 2004-06-17 devnull n = timevtread(z, root.score, VtDirType, buf, bsize);
95 7763a61a 2003-11-23 devnull if(n < 0)
96 7763a61a 2003-11-23 devnull sysfatal("could not read root dir");
97 7763a61a 2003-11-23 devnull
98 be36ff68 2004-04-29 devnull fprint(2, "...\n");
99 7763a61a 2003-11-23 devnull /* fake up top level source */
100 7763a61a 2003-11-23 devnull memset(&source, 0, sizeof(source));
101 7763a61a 2003-11-23 devnull memmove(source.score, root.score, VtScoreSize);
102 7763a61a 2003-11-23 devnull source.psize = bsize;
103 7763a61a 2003-11-23 devnull source.dsize = bsize;
104 7763a61a 2003-11-23 devnull source.dir = 1;
105 7763a61a 2003-11-23 devnull source.active = 1;
106 7763a61a 2003-11-23 devnull source.depth = 0;
107 7763a61a 2003-11-23 devnull source.size = n;
108 7763a61a 2003-11-23 devnull
109 3d77c87e 2004-03-15 devnull dumpdir(&source, 0);
110 7763a61a 2003-11-23 devnull
111 7763a61a 2003-11-23 devnull Bterm(bout);
112 7763a61a 2003-11-23 devnull
113 3d77c87e 2004-03-15 devnull vthangup(z);
114 3d77c87e 2004-03-15 devnull threadexitsall(0);
115 7763a61a 2003-11-23 devnull }
116 7763a61a 2003-11-23 devnull
117 7763a61a 2003-11-23 devnull void
118 3d77c87e 2004-03-15 devnull sourceprint(Source *s, int indent, int entry)
119 7763a61a 2003-11-23 devnull {
120 7763a61a 2003-11-23 devnull int i;
121 7763a61a 2003-11-23 devnull uvlong size;
122 7763a61a 2003-11-23 devnull int ne;
123 7763a61a 2003-11-23 devnull
124 7763a61a 2003-11-23 devnull for(i=0; i<indent; i++)
125 7763a61a 2003-11-23 devnull Bprint(bout, " ");
126 7763a61a 2003-11-23 devnull Bprint(bout, "%4d", entry);
127 7763a61a 2003-11-23 devnull if(s->active) {
128 7763a61a 2003-11-23 devnull /* dir size in directory entries */
129 7763a61a 2003-11-23 devnull if(s->dir) {
130 7763a61a 2003-11-23 devnull ne = s->dsize/VtEntrySize;
131 7763a61a 2003-11-23 devnull size = ne*(s->size/s->dsize) + (s->size%s->dsize)/VtEntrySize;
132 7763a61a 2003-11-23 devnull } else
133 7763a61a 2003-11-23 devnull size = s->size;
134 7763a61a 2003-11-23 devnull if(cmp) {
135 7763a61a 2003-11-23 devnull Bprint(bout, ": gen: %lud size: %llud",
136 7763a61a 2003-11-23 devnull s->gen, size);
137 7763a61a 2003-11-23 devnull if(!s->dir)
138 7763a61a 2003-11-23 devnull Bprint(bout, ": %V", s->score);
139 7763a61a 2003-11-23 devnull } else {
140 7763a61a 2003-11-23 devnull Bprint(bout, ": gen: %lud psize: %d dsize: %d",
141 7763a61a 2003-11-23 devnull s->gen, s->psize, s->dsize);
142 7763a61a 2003-11-23 devnull Bprint(bout, " depth: %d size: %llud: %V",
143 7763a61a 2003-11-23 devnull s->depth, size, s->score);
144 7763a61a 2003-11-23 devnull }
145 7763a61a 2003-11-23 devnull
146 7763a61a 2003-11-23 devnull if(s->reserved)
147 7763a61a 2003-11-23 devnull Bprint(bout, ": reserved not emtpy");
148 7763a61a 2003-11-23 devnull }
149 7763a61a 2003-11-23 devnull Bprint(bout, "\n");
150 7763a61a 2003-11-23 devnull }
151 7763a61a 2003-11-23 devnull
152 7763a61a 2003-11-23 devnull int
153 7763a61a 2003-11-23 devnull parse(Source *s, uchar *p)
154 7763a61a 2003-11-23 devnull {
155 7763a61a 2003-11-23 devnull VtEntry dir;
156 7763a61a 2003-11-23 devnull
157 7763a61a 2003-11-23 devnull memset(s, 0, sizeof(*s));
158 3d77c87e 2004-03-15 devnull if(vtentryunpack(&dir, p, 0) < 0)
159 3d77c87e 2004-03-15 devnull return -1;
160 7763a61a 2003-11-23 devnull
161 7763a61a 2003-11-23 devnull if(!(dir.flags & VtEntryActive))
162 3d77c87e 2004-03-15 devnull return 0;
163 7763a61a 2003-11-23 devnull
164 7763a61a 2003-11-23 devnull s->active = 1;
165 7763a61a 2003-11-23 devnull s->gen = dir.gen;
166 7763a61a 2003-11-23 devnull s->psize = dir.psize;
167 bb501e12 2004-06-17 devnull s->dsize = dir.dsize;
168 7763a61a 2003-11-23 devnull s->size = dir.size;
169 7763a61a 2003-11-23 devnull memmove(s->score, dir.score, VtScoreSize);
170 3d77c87e 2004-03-15 devnull if((dir.type&~VtTypeDepthMask) == VtDirType)
171 7763a61a 2003-11-23 devnull s->dir = 1;
172 3d77c87e 2004-03-15 devnull s->depth = dir.type&VtTypeDepthMask;
173 3d77c87e 2004-03-15 devnull return 0;
174 7763a61a 2003-11-23 devnull }
175 7763a61a 2003-11-23 devnull
176 7763a61a 2003-11-23 devnull int
177 3d77c87e 2004-03-15 devnull sourceread(Source *s, ulong block, uchar *p, int n)
178 7763a61a 2003-11-23 devnull {
179 3d77c87e 2004-03-15 devnull uchar *buf;
180 7763a61a 2003-11-23 devnull uchar score[VtScoreSize];
181 7763a61a 2003-11-23 devnull int i, nn, np, type;
182 7763a61a 2003-11-23 devnull int elem[VtPointerDepth];
183 7763a61a 2003-11-23 devnull
184 3d77c87e 2004-03-15 devnull buf = vtmalloc(VtMaxLumpSize);
185 3d77c87e 2004-03-15 devnull
186 7763a61a 2003-11-23 devnull memmove(score, s->score, VtScoreSize);
187 7763a61a 2003-11-23 devnull
188 7763a61a 2003-11-23 devnull np = s->psize/VtScoreSize;
189 7763a61a 2003-11-23 devnull for(i=0; i<s->depth; i++) {
190 7763a61a 2003-11-23 devnull elem[i] = block % np;
191 7763a61a 2003-11-23 devnull block /= np;
192 7763a61a 2003-11-23 devnull }
193 7763a61a 2003-11-23 devnull assert(block == 0);
194 7763a61a 2003-11-23 devnull
195 7763a61a 2003-11-23 devnull for(i=s->depth-1; i>=0; i--) {
196 bb501e12 2004-06-17 devnull nn = timevtread(z, score, (s->dir ? VtDirType : VtDataType)+1+i, buf, s->psize);
197 3d77c87e 2004-03-15 devnull if(nn < 0){
198 3d77c87e 2004-03-15 devnull fprint(2, "vtread %V %d: %r\n", score, (s->dir ? VtDirType : VtDataType)+1+i);
199 3d77c87e 2004-03-15 devnull free(buf);
200 7763a61a 2003-11-23 devnull return -1;
201 7763a61a 2003-11-23 devnull }
202 7763a61a 2003-11-23 devnull
203 3d77c87e 2004-03-15 devnull if((elem[i]+1)*VtScoreSize > nn){
204 3d77c87e 2004-03-15 devnull free(buf);
205 7763a61a 2003-11-23 devnull return 0;
206 3d77c87e 2004-03-15 devnull }
207 7763a61a 2003-11-23 devnull memmove(score, buf + elem[i]*VtScoreSize, VtScoreSize);
208 7763a61a 2003-11-23 devnull }
209 7763a61a 2003-11-23 devnull
210 7763a61a 2003-11-23 devnull if(s->dir)
211 7763a61a 2003-11-23 devnull type = VtDirType;
212 7763a61a 2003-11-23 devnull else
213 7763a61a 2003-11-23 devnull type = VtDataType;
214 7763a61a 2003-11-23 devnull
215 bb501e12 2004-06-17 devnull nn = timevtread(z, score, type, p, n);
216 3d77c87e 2004-03-15 devnull if(nn < 0){
217 3d77c87e 2004-03-15 devnull fprint(2, "vtread %V %d: %r\n", score, type);
218 3d77c87e 2004-03-15 devnull abort();
219 3d77c87e 2004-03-15 devnull free(buf);
220 7763a61a 2003-11-23 devnull return -1;
221 7763a61a 2003-11-23 devnull }
222 7763a61a 2003-11-23 devnull
223 3d77c87e 2004-03-15 devnull free(buf);
224 7763a61a 2003-11-23 devnull return nn;
225 7763a61a 2003-11-23 devnull }
226 7763a61a 2003-11-23 devnull
227 7763a61a 2003-11-23 devnull void
228 3d77c87e 2004-03-15 devnull dumpfilecontents(Source *s)
229 7763a61a 2003-11-23 devnull {
230 7763a61a 2003-11-23 devnull int nb, lb, i, n;
231 7763a61a 2003-11-23 devnull uchar buf[VtMaxLumpSize];
232 7763a61a 2003-11-23 devnull
233 7763a61a 2003-11-23 devnull nb = (s->size + s->dsize - 1)/s->dsize;
234 7763a61a 2003-11-23 devnull lb = s->size%s->dsize;
235 7763a61a 2003-11-23 devnull for(i=0; i<nb; i++) {
236 7763a61a 2003-11-23 devnull memset(buf, 0, s->dsize);
237 3d77c87e 2004-03-15 devnull n = sourceread(s, i, buf, s->dsize);
238 7763a61a 2003-11-23 devnull if(n < 0) {
239 3d77c87e 2004-03-15 devnull fprint(2, "could not read block: %d: %r\n", i);
240 7763a61a 2003-11-23 devnull continue;
241 7763a61a 2003-11-23 devnull }
242 7763a61a 2003-11-23 devnull if(i < nb-1)
243 7763a61a 2003-11-23 devnull Bwrite(bout, buf, s->dsize);
244 7763a61a 2003-11-23 devnull else
245 7763a61a 2003-11-23 devnull Bwrite(bout, buf, lb);
246 7763a61a 2003-11-23 devnull }
247 7763a61a 2003-11-23 devnull }
248 7763a61a 2003-11-23 devnull
249 7763a61a 2003-11-23 devnull void
250 3d77c87e 2004-03-15 devnull dumpfile(Source *s, int indent)
251 7763a61a 2003-11-23 devnull {
252 7763a61a 2003-11-23 devnull int nb, i, j, n;
253 3d77c87e 2004-03-15 devnull uchar *buf;
254 7763a61a 2003-11-23 devnull uchar score[VtScoreSize];
255 7763a61a 2003-11-23 devnull
256 3d77c87e 2004-03-15 devnull buf = vtmalloc(VtMaxLumpSize);
257 7763a61a 2003-11-23 devnull nb = (s->size + s->dsize - 1)/s->dsize;
258 7763a61a 2003-11-23 devnull for(i=0; i<nb; i++) {
259 7763a61a 2003-11-23 devnull memset(buf, 0, s->dsize);
260 3d77c87e 2004-03-15 devnull n = sourceread(s, i, buf, s->dsize);
261 7763a61a 2003-11-23 devnull if(n < 0) {
262 3d77c87e 2004-03-15 devnull fprint(2, "could not read block: %d: %r\n", i);
263 7763a61a 2003-11-23 devnull continue;
264 7763a61a 2003-11-23 devnull }
265 7763a61a 2003-11-23 devnull for(j=0; j<indent; j++)
266 7763a61a 2003-11-23 devnull Bprint(bout, " ");
267 3d77c87e 2004-03-15 devnull sha1(buf, n, score, nil);
268 7763a61a 2003-11-23 devnull Bprint(bout, "%4d: size: %ud: %V\n", i, n, score);
269 7763a61a 2003-11-23 devnull }
270 3d77c87e 2004-03-15 devnull vtfree(buf);
271 7763a61a 2003-11-23 devnull }
272 7763a61a 2003-11-23 devnull
273 7763a61a 2003-11-23 devnull int
274 3d77c87e 2004-03-15 devnull dumpdir(Source *s, int indent)
275 7763a61a 2003-11-23 devnull {
276 7763a61a 2003-11-23 devnull int pb, ne, nb, i, j, n, entry;
277 7763a61a 2003-11-23 devnull Source ss;
278 3d77c87e 2004-03-15 devnull uchar *buf;
279 7763a61a 2003-11-23 devnull
280 3d77c87e 2004-03-15 devnull buf = vtmalloc(VtMaxLumpSize);
281 7763a61a 2003-11-23 devnull pb = s->dsize/VtEntrySize;
282 7763a61a 2003-11-23 devnull ne = pb*(s->size/s->dsize) + (s->size%s->dsize)/VtEntrySize;
283 7763a61a 2003-11-23 devnull nb = (s->size + s->dsize - 1)/s->dsize;
284 7763a61a 2003-11-23 devnull for(i=0; i<nb; i++) {
285 7763a61a 2003-11-23 devnull memset(buf, 0, s->dsize);
286 3d77c87e 2004-03-15 devnull n = sourceread(s, i, buf, s->dsize);
287 7763a61a 2003-11-23 devnull if(n < 0) {
288 3d77c87e 2004-03-15 devnull fprint(2, "could not read block: %d: %r\n", i);
289 7763a61a 2003-11-23 devnull continue;
290 7763a61a 2003-11-23 devnull }
291 7763a61a 2003-11-23 devnull for(j=0; j<pb; j++) {
292 7763a61a 2003-11-23 devnull entry = i*pb + j;
293 7763a61a 2003-11-23 devnull if(entry >= ne)
294 7763a61a 2003-11-23 devnull break;
295 7763a61a 2003-11-23 devnull parse(&ss, buf + j * VtEntrySize);
296 7763a61a 2003-11-23 devnull
297 7763a61a 2003-11-23 devnull if(!find)
298 3d77c87e 2004-03-15 devnull sourceprint(&ss, indent, entry);
299 7763a61a 2003-11-23 devnull else if(memcmp(ss.score, fscore, VtScoreSize) == 0) {
300 3d77c87e 2004-03-15 devnull dumpfilecontents(&ss);
301 3d77c87e 2004-03-15 devnull free(buf);
302 3d77c87e 2004-03-15 devnull return -1;
303 7763a61a 2003-11-23 devnull }
304 7763a61a 2003-11-23 devnull
305 7763a61a 2003-11-23 devnull if(ss.dir) {
306 3d77c87e 2004-03-15 devnull if(dumpdir(&ss, indent+1) < 0){
307 3d77c87e 2004-03-15 devnull free(buf);
308 3d77c87e 2004-03-15 devnull return -1;
309 3d77c87e 2004-03-15 devnull }
310 7763a61a 2003-11-23 devnull } else if(all)
311 3d77c87e 2004-03-15 devnull dumpfile(&ss, indent+1);
312 7763a61a 2003-11-23 devnull }
313 7763a61a 2003-11-23 devnull }
314 3d77c87e 2004-03-15 devnull free(buf);
315 3d77c87e 2004-03-15 devnull return 0;
316 7763a61a 2003-11-23 devnull }
317 7763a61a 2003-11-23 devnull
318 7763a61a 2003-11-23 devnull void
319 7763a61a 2003-11-23 devnull usage(void)
320 7763a61a 2003-11-23 devnull {
321 7763a61a 2003-11-23 devnull fprint(2, "%s: [file]\n", argv0);
322 3d77c87e 2004-03-15 devnull threadexits("usage");
323 7763a61a 2003-11-23 devnull }
324 7763a61a 2003-11-23 devnull
325 7763a61a 2003-11-23 devnull void
326 3d77c87e 2004-03-15 devnull readroot(VtRoot *root, uchar *score, char *file)
327 7763a61a 2003-11-23 devnull {
328 7763a61a 2003-11-23 devnull int fd;
329 3d77c87e 2004-03-15 devnull char *pref;
330 3d77c87e 2004-03-15 devnull char buf[VtRootSize];
331 3d77c87e 2004-03-15 devnull int n, nn;
332 7763a61a 2003-11-23 devnull
333 7763a61a 2003-11-23 devnull if(file == 0)
334 7763a61a 2003-11-23 devnull fd = 0;
335 7763a61a 2003-11-23 devnull else {
336 7763a61a 2003-11-23 devnull fd = open(file, OREAD);
337 7763a61a 2003-11-23 devnull if(fd < 0)
338 7763a61a 2003-11-23 devnull sysfatal("could not open file: %s: %r\n", file);
339 7763a61a 2003-11-23 devnull }
340 7763a61a 2003-11-23 devnull n = readn(fd, buf, sizeof(buf)-1);
341 7763a61a 2003-11-23 devnull if(n < 0)
342 7763a61a 2003-11-23 devnull sysfatal("read failed: %r\n");
343 3d77c87e 2004-03-15 devnull if(n==0 || buf[n-1] != '\n')
344 3d77c87e 2004-03-15 devnull sysfatal("not a root file");
345 3d77c87e 2004-03-15 devnull buf[n-1] = 0;
346 7763a61a 2003-11-23 devnull close(fd);
347 7763a61a 2003-11-23 devnull
348 3d77c87e 2004-03-15 devnull if(vtparsescore(buf, &pref, score) < 0){
349 3d77c87e 2004-03-15 devnull sysfatal("not a root file");
350 7763a61a 2003-11-23 devnull }
351 bb501e12 2004-06-17 devnull nn = timevtread(z, score, VtRootType, buf, VtRootSize);
352 3d77c87e 2004-03-15 devnull if(nn < 0)
353 3d77c87e 2004-03-15 devnull sysfatal("cannot read root %V", score);
354 3d77c87e 2004-03-15 devnull if(vtrootunpack(root, buf) < 0)
355 3d77c87e 2004-03-15 devnull sysfatal("cannot parse root: %r");
356 7763a61a 2003-11-23 devnull }
357 bb501e12 2004-06-17 devnull
358 bb501e12 2004-06-17 devnull int
359 bb501e12 2004-06-17 devnull timevtread(VtConn *z, uchar *score, int type, void *buf, int nbuf)
360 bb501e12 2004-06-17 devnull {
361 bb501e12 2004-06-17 devnull /*
362 bb501e12 2004-06-17 devnull ulong t0, t1;
363 bb501e12 2004-06-17 devnull int n;
364 bb501e12 2004-06-17 devnull
365 bb501e12 2004-06-17 devnull t0 = nsec();
366 bb501e12 2004-06-17 devnull n = vtread(z, score, type, buf, nbuf);
367 bb501e12 2004-06-17 devnull t1 = nsec();
368 bb501e12 2004-06-17 devnull fprint(2, "read %V: %.6f seconds\n", score, (t1-t0)/1.e9);
369 bb501e12 2004-06-17 devnull return n;
370 bb501e12 2004-06-17 devnull */
371 bb501e12 2004-06-17 devnull return vtread(z, score, type, buf, nbuf);
372 bb501e12 2004-06-17 devnull }