#include #include #include #include #include void usage(void) { fprint(2, "usage: vcat [-z] score >diskfile\n"); threadexitsall("usage"); } void threadmain(int argc, char **argv) { extern int nfilereads; char *pref; int zerotoo; uchar score[VtScoreSize]; u8int *zero; u32int i; u32int n; Block *b; Disk *disk; Fsys *fsys; VtCache *c; VtConn *z; zerotoo = 0; ARGBEGIN{ case 'z': zerotoo = 1; break; default: usage(); }ARGEND if(argc != 1) usage(); fmtinstall('V', vtscorefmt); if(vtparsescore(argv[0], &pref, score) < 0) sysfatal("bad score '%s'", argv[0]); if((z = vtdial(nil)) == nil) sysfatal("vtdial: %r"); if(vtconnect(z) < 0) sysfatal("vtconnect: %r"); if((c = vtcachealloc(z, 16384*32)) == nil) sysfatal("vtcache: %r"); if((disk = diskopenventi(c, score)) == nil) sysfatal("diskopenventi: %r"); if((fsys = fsysopen(disk)) == nil) sysfatal("fsysopen: %r"); zero = emalloc(fsys->blocksize); fprint(2, "%d blocks total\n", fsys->nblock); n = 0; for(i=0; inblock; i++){ if((b = fsysreadblock(fsys, i)) != nil){ if(pwrite(1, b->data, fsys->blocksize, (u64int)fsys->blocksize*i) != fsys->blocksize) fprint(2, "error writing block %lud: %r\n", i); n++; blockput(b); }else if(zerotoo || i==fsys->nblock-1) if(pwrite(1, zero, fsys->blocksize, (u64int)fsys->blocksize*i) != fsys->blocksize) fprint(2, "error writing block %lud: %r\n", i); } fprint(2, "%d blocks in use, %d file reads\n", n, nfilereads); threadexitsall(nil); }