diff options
Diffstat (limited to 'src/cmd/vac/vtread.c')
-rw-r--r-- | src/cmd/vac/vtread.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/cmd/vac/vtread.c b/src/cmd/vac/vtread.c new file mode 100644 index 00000000..8550279f --- /dev/null +++ b/src/cmd/vac/vtread.c @@ -0,0 +1,126 @@ +#include "stdinc.h" +#include <bio.h> + +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<VtScoreSize*2; i++) { + if(buf[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; +} |