| #include <u.h> |
| #include <libc.h> |
| #include <thread.h> |
| #include <venti.h> |
| #include <bio.h> |
| |
| enum |
| { |
| // XXX What to do here? |
| VtMaxLumpSize = 65535, |
| }; |
| |
| char *host; |
| Biobuf b; |
| VtConn *z; |
| uchar *buf; |
| void run(Biobuf*); |
| int nn; |
| |
| void |
| usage(void) |
| { |
| fprint(2, "usage: readlist [-h host] list\n"); |
| threadexitsall("usage"); |
| } |
| |
| int |
| parsescore(uchar *score, char *buf, int n) |
| { |
| int i, c; |
| |
| memset(score, 0, VtScoreSize); |
| |
| if(n != VtScoreSize*2){ |
| werrstr("score wrong length %d", n); |
| return -1; |
| } |
| 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 { |
| c = buf[i]; |
| werrstr("bad score char %d '%c'", c, c); |
| return -1; |
| } |
| |
| if((i & 1) == 0) |
| c <<= 4; |
| |
| score[i>>1] |= c; |
| } |
| return 0; |
| } |
| |
| void |
| threadmain(int argc, char *argv[]) |
| { |
| int fd, i; |
| |
| ARGBEGIN{ |
| case 'h': |
| host = EARGF(usage()); |
| break; |
| default: |
| usage(); |
| break; |
| }ARGEND |
| |
| fmtinstall('V', vtscorefmt); |
| buf = vtmallocz(VtMaxLumpSize); |
| z = vtdial(host); |
| if(z == nil) |
| sysfatal("could not connect to server: %r"); |
| if(vtconnect(z) < 0) |
| sysfatal("vtconnect: %r"); |
| |
| if(argc == 0){ |
| Binit(&b, 0, OREAD); |
| run(&b); |
| }else{ |
| for(i=0; i<argc; i++){ |
| if((fd = open(argv[i], OREAD)) < 0) |
| sysfatal("open %s: %r", argv[i]); |
| Binit(&b, fd, OREAD); |
| run(&b); |
| } |
| } |
| threadexitsall(nil); |
| } |
| |
| void |
| run(Biobuf *b) |
| { |
| char *p, *f[10]; |
| int nf; |
| uchar score[20]; |
| int type, n; |
| |
| while((p = Brdline(b, '\n')) != nil){ |
| p[Blinelen(b)-1] = 0; |
| nf = tokenize(p, f, nelem(f)); |
| if(nf != 2) |
| sysfatal("syntax error in work list"); |
| if(parsescore(score, f[0], strlen(f[0])) < 0) |
| sysfatal("bad score %s in work list", f[0]); |
| type = atoi(f[1]); |
| n = vtread(z, score, type, buf, VtMaxLumpSize); |
| if(n < 0) |
| sysfatal("could not read %s %s: %r", f[0], f[1]); |
| /* write(1, buf, n); */ |
| if(++nn%1000 == 0) |
| print("%d...", nn); |
| } |
| } |