#include "stdinc.h" #include typedef struct Source Source; struct Source { ulong gen; int psize; int dsize; int dir; int active; int depth; uvlong size; uchar score[VtScoreSize]; int reserved; }; int bsize; Biobuf *bout; VtRootLump root; int ver; int cmp; int all; int find; uchar fscore[VtScoreSize]; int dirSize; void (*parse)(Source*, uchar*); VtSession *z; int vtGetUint16(uchar *p); ulong vtGetUint32(uchar *p); uvlong vtGetUint48(uchar *p); void usage(void); int parseScore(uchar *score, char *buf, int n); void readRoot(VtRootLump*, uchar *score, char *file); void parse1(Source*, uchar*); void parse2(Source*, uchar*); int dumpDir(Source*, int indent); void main(int argc, char *argv[]) { char *host = nil; uchar score[VtScoreSize]; uchar buf[VtMaxLumpSize]; int type; int n; type = VtDataType; ARGBEGIN{ case 't': type = atoi(ARGF()); break; }ARGEND vtAttach(); bout = vtMemAllocZ(sizeof(Biobuf)); Binit(bout, 1, OWRITE); if(argc != 1) usage(); vtAttach(); fmtinstall('V', vtScoreFmt); fmtinstall('R', vtErrFmt); z = vtDial(host); if(z == nil) vtFatal("could not connect to server: %s", vtGetError()); if(!vtConnect(z, 0)) sysfatal("vtConnect: %r"); if(!parseScore(score, argv[0], strlen(argv[0]))) vtFatal("could not parse score: %s", vtGetError()); n = vtRead(z, score, type, buf, VtMaxLumpSize); if(n < 0) vtFatal("could not read block: %s", vtGetError()); Bwrite(bout, buf, n); Bterm(bout); vtClose(z); vtDetach(); exits(0); } void usage(void) { fprint(2, "%s: -t type score\n", argv0); exits("usage"); } int parseScore(uchar *score, char *buf, int n) { int i, c; memset(score, 0, VtScoreSize); if(n < VtScoreSize*2) return 0; for(i=0; i= '0' && buf[i] <= '9') c = buf[i] - '0'; else if(buf[i] >= 'a' && buf[i] <= 'f') c = buf[i] - 'a' + 10; else if(buf[i] >= 'A' && buf[i] <= 'F') c = buf[i] - 'A' + 10; else { return 0; } if((i & 1) == 0) c <<= 4; score[i>>1] |= c; } return 1; }