| #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); |
| } |