|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <venti.h> | 
|  | #include <libsec.h> | 
|  | #include <thread.h> | 
|  |  | 
|  | enum | 
|  | { | 
|  | // XXX What to do here? | 
|  | VtMaxLumpSize = 65535, | 
|  | }; | 
|  |  | 
|  | void | 
|  | usage(void) | 
|  | { | 
|  | fprint(2, "usage: root [-h host] score\n"); | 
|  | threadexitsall("usage"); | 
|  | } | 
|  |  | 
|  | void | 
|  | threadmain(int argc, char *argv[]) | 
|  | { | 
|  | int i, n; | 
|  | uchar score[VtScoreSize]; | 
|  | uchar *buf; | 
|  | VtConn *z; | 
|  | char *host; | 
|  | VtRoot root; | 
|  |  | 
|  | fmtinstall('F', vtfcallfmt); | 
|  | fmtinstall('V', vtscorefmt); | 
|  | quotefmtinstall(); | 
|  |  | 
|  | host = nil; | 
|  | ARGBEGIN{ | 
|  | case 'h': | 
|  | host = EARGF(usage()); | 
|  | break; | 
|  | default: | 
|  | usage(); | 
|  | break; | 
|  | }ARGEND | 
|  |  | 
|  | if(argc == 0) | 
|  | usage(); | 
|  |  | 
|  | buf = vtmallocz(VtMaxLumpSize); | 
|  |  | 
|  | z = vtdial(host); | 
|  | if(z == nil) | 
|  | sysfatal("could not connect to server: %r"); | 
|  |  | 
|  | if(vtconnect(z) < 0) | 
|  | sysfatal("vtconnect: %r"); | 
|  |  | 
|  | for(i=0; i<argc; i++){ | 
|  | if(vtparsescore(argv[i], nil, score) < 0){ | 
|  | fprint(2, "cannot parse score '%s': %r\n", argv[i]); | 
|  | continue; | 
|  | } | 
|  | n = vtread(z, score, VtRootType, buf, VtMaxLumpSize); | 
|  | if(n < 0){ | 
|  | fprint(2, "could not read block %V: %r\n", score); | 
|  | continue; | 
|  | } | 
|  | if(n != VtRootSize){ | 
|  | fprint(2, "block %V is wrong size %d != 300\n", score, n); | 
|  | continue; | 
|  | } | 
|  | if(vtrootunpack(&root, buf) < 0){ | 
|  | fprint(2, "unpacking block %V: %r\n", score); | 
|  | continue; | 
|  | } | 
|  | print("%V: %q %q %V %d %V\n", score, root.name, root.type, root.score, root.blocksize, root.prev); | 
|  | } | 
|  | vthangup(z); | 
|  | threadexitsall(0); | 
|  | } |