1 7763a61a 2003-11-23 devnull #include "stdinc.h"
2 7763a61a 2003-11-23 devnull #include <bio.h>
4 7763a61a 2003-11-23 devnull typedef struct Source Source;
6 7763a61a 2003-11-23 devnull struct Source
8 7763a61a 2003-11-23 devnull ulong gen;
9 7763a61a 2003-11-23 devnull int psize;
10 7763a61a 2003-11-23 devnull int dsize;
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;
19 7763a61a 2003-11-23 devnull int bsize;
20 7763a61a 2003-11-23 devnull Biobuf *bout;
21 7763a61a 2003-11-23 devnull VtRootLump root;
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;
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);
42 7763a61a 2003-11-23 devnull main(int argc, char *argv[])
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;
50 7763a61a 2003-11-23 devnull type = VtDataType;
52 7763a61a 2003-11-23 devnull ARGBEGIN{
53 7763a61a 2003-11-23 devnull case 't':
54 7763a61a 2003-11-23 devnull type = atoi(ARGF());
58 7763a61a 2003-11-23 devnull vtAttach();
60 7763a61a 2003-11-23 devnull bout = vtMemAllocZ(sizeof(Biobuf));
61 7763a61a 2003-11-23 devnull Binit(bout, 1, OWRITE);
63 7763a61a 2003-11-23 devnull if(argc != 1)
66 7763a61a 2003-11-23 devnull vtAttach();
68 7763a61a 2003-11-23 devnull fmtinstall('V', vtScoreFmt);
69 7763a61a 2003-11-23 devnull fmtinstall('R', vtErrFmt);
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());
75 7763a61a 2003-11-23 devnull if(!vtConnect(z, 0))
76 7763a61a 2003-11-23 devnull sysfatal("vtConnect: %r");
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());
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);
86 7763a61a 2003-11-23 devnull Bterm(bout);
88 7763a61a 2003-11-23 devnull vtClose(z);
89 7763a61a 2003-11-23 devnull vtDetach();
90 7763a61a 2003-11-23 devnull exits(0);
94 7763a61a 2003-11-23 devnull usage(void)
96 7763a61a 2003-11-23 devnull fprint(2, "%s: -t type score\n", argv0);
97 7763a61a 2003-11-23 devnull exits("usage");
101 7763a61a 2003-11-23 devnull parseScore(uchar *score, char *buf, int n)
103 7763a61a 2003-11-23 devnull int i, c;
105 7763a61a 2003-11-23 devnull memset(score, 0, VtScoreSize);
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;
117 7763a61a 2003-11-23 devnull return 0;
120 7763a61a 2003-11-23 devnull if((i & 1) == 0)
121 7763a61a 2003-11-23 devnull c <<= 4;
123 7763a61a 2003-11-23 devnull score[i>>1] |= c;
125 7763a61a 2003-11-23 devnull return 1;