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 VtRootLump 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 7763a61a 2003-11-23 devnull int dirSize;
28 7763a61a 2003-11-23 devnull void (*parse)(Source*, uchar*);
29 7763a61a 2003-11-23 devnull VtSession *z;
30 7763a61a 2003-11-23 devnull
31 7763a61a 2003-11-23 devnull int vtGetUint16(uchar *p);
32 7763a61a 2003-11-23 devnull ulong vtGetUint32(uchar *p);
33 7763a61a 2003-11-23 devnull uvlong vtGetUint48(uchar *p);
34 7763a61a 2003-11-23 devnull void usage(void);
35 7763a61a 2003-11-23 devnull int parseScore(uchar *score, char *buf, int n);
36 7763a61a 2003-11-23 devnull void readRoot(VtRootLump*, uchar *score, char *file);
37 7763a61a 2003-11-23 devnull void parse1(Source*, uchar*);
38 7763a61a 2003-11-23 devnull void parse2(Source*, uchar*);
39 7763a61a 2003-11-23 devnull int dumpDir(Source*, int indent);
40 7763a61a 2003-11-23 devnull
41 7763a61a 2003-11-23 devnull void
42 7763a61a 2003-11-23 devnull main(int argc, char *argv[])
43 7763a61a 2003-11-23 devnull {
44 7763a61a 2003-11-23 devnull char *host = nil;
45 7763a61a 2003-11-23 devnull uchar score[VtScoreSize];
46 7763a61a 2003-11-23 devnull uchar buf[VtMaxLumpSize];
47 7763a61a 2003-11-23 devnull int type;
48 7763a61a 2003-11-23 devnull int n;
49 7763a61a 2003-11-23 devnull
50 7763a61a 2003-11-23 devnull type = VtDataType;
51 7763a61a 2003-11-23 devnull
52 7763a61a 2003-11-23 devnull ARGBEGIN{
53 7763a61a 2003-11-23 devnull case 't':
54 7763a61a 2003-11-23 devnull type = atoi(ARGF());
55 7763a61a 2003-11-23 devnull break;
56 7763a61a 2003-11-23 devnull }ARGEND
57 7763a61a 2003-11-23 devnull
58 7763a61a 2003-11-23 devnull vtAttach();
59 7763a61a 2003-11-23 devnull
60 7763a61a 2003-11-23 devnull bout = vtMemAllocZ(sizeof(Biobuf));
61 7763a61a 2003-11-23 devnull Binit(bout, 1, OWRITE);
62 7763a61a 2003-11-23 devnull
63 7763a61a 2003-11-23 devnull if(argc != 1)
64 7763a61a 2003-11-23 devnull usage();
65 7763a61a 2003-11-23 devnull
66 7763a61a 2003-11-23 devnull vtAttach();
67 7763a61a 2003-11-23 devnull
68 7763a61a 2003-11-23 devnull fmtinstall('V', vtScoreFmt);
69 7763a61a 2003-11-23 devnull fmtinstall('R', vtErrFmt);
70 7763a61a 2003-11-23 devnull
71 7763a61a 2003-11-23 devnull z = vtDial(host);
72 7763a61a 2003-11-23 devnull if(z == nil)
73 7763a61a 2003-11-23 devnull vtFatal("could not connect to server: %s", vtGetError());
74 7763a61a 2003-11-23 devnull
75 7763a61a 2003-11-23 devnull if(!vtConnect(z, 0))
76 7763a61a 2003-11-23 devnull sysfatal("vtConnect: %r");
77 7763a61a 2003-11-23 devnull
78 7763a61a 2003-11-23 devnull if(!parseScore(score, argv[0], strlen(argv[0])))
79 7763a61a 2003-11-23 devnull vtFatal("could not parse score: %s", vtGetError());
80 7763a61a 2003-11-23 devnull
81 7763a61a 2003-11-23 devnull n = vtRead(z, score, type, buf, VtMaxLumpSize);
82 7763a61a 2003-11-23 devnull if(n < 0)
83 7763a61a 2003-11-23 devnull vtFatal("could not read block: %s", vtGetError());
84 7763a61a 2003-11-23 devnull Bwrite(bout, buf, n);
85 7763a61a 2003-11-23 devnull
86 7763a61a 2003-11-23 devnull Bterm(bout);
87 7763a61a 2003-11-23 devnull
88 7763a61a 2003-11-23 devnull vtClose(z);
89 7763a61a 2003-11-23 devnull vtDetach();
90 7763a61a 2003-11-23 devnull exits(0);
91 7763a61a 2003-11-23 devnull }
92 7763a61a 2003-11-23 devnull
93 7763a61a 2003-11-23 devnull void
94 7763a61a 2003-11-23 devnull usage(void)
95 7763a61a 2003-11-23 devnull {
96 7763a61a 2003-11-23 devnull fprint(2, "%s: -t type score\n", argv0);
97 7763a61a 2003-11-23 devnull exits("usage");
98 7763a61a 2003-11-23 devnull }
99 7763a61a 2003-11-23 devnull
100 7763a61a 2003-11-23 devnull int
101 7763a61a 2003-11-23 devnull parseScore(uchar *score, char *buf, int n)
102 7763a61a 2003-11-23 devnull {
103 7763a61a 2003-11-23 devnull int i, c;
104 7763a61a 2003-11-23 devnull
105 7763a61a 2003-11-23 devnull memset(score, 0, VtScoreSize);
106 7763a61a 2003-11-23 devnull
107 7763a61a 2003-11-23 devnull if(n < VtScoreSize*2)
108 7763a61a 2003-11-23 devnull return 0;
109 7763a61a 2003-11-23 devnull for(i=0; i<VtScoreSize*2; i++) {
110 7763a61a 2003-11-23 devnull if(buf[i] >= '0' && buf[i] <= '9')
111 7763a61a 2003-11-23 devnull c = buf[i] - '0';
112 7763a61a 2003-11-23 devnull else if(buf[i] >= 'a' && buf[i] <= 'f')
113 7763a61a 2003-11-23 devnull c = buf[i] - 'a' + 10;
114 7763a61a 2003-11-23 devnull else if(buf[i] >= 'A' && buf[i] <= 'F')
115 7763a61a 2003-11-23 devnull c = buf[i] - 'A' + 10;
116 7763a61a 2003-11-23 devnull else {
117 7763a61a 2003-11-23 devnull return 0;
118 7763a61a 2003-11-23 devnull }
119 7763a61a 2003-11-23 devnull
120 7763a61a 2003-11-23 devnull if((i & 1) == 0)
121 7763a61a 2003-11-23 devnull c <<= 4;
122 7763a61a 2003-11-23 devnull
123 7763a61a 2003-11-23 devnull score[i>>1] |= c;
124 7763a61a 2003-11-23 devnull }
125 7763a61a 2003-11-23 devnull return 1;
126 7763a61a 2003-11-23 devnull }