vcat.c (1576B)
1 #include <u.h> 2 #include <libc.h> 3 #include <venti.h> 4 #include <diskfs.h> 5 #include <thread.h> 6 7 void 8 usage(void) 9 { 10 fprint(2, "usage: vcat [-z] score >diskfile\n"); 11 threadexitsall("usage"); 12 } 13 14 void 15 threadmain(int argc, char **argv) 16 { 17 extern int nfilereads; 18 char *pref; 19 int zerotoo; 20 uchar score[VtScoreSize]; 21 u8int *zero; 22 u32int i; 23 u32int n; 24 Block *b; 25 Disk *disk; 26 Fsys *fsys; 27 VtCache *c; 28 VtConn *z; 29 30 zerotoo = 0; 31 ARGBEGIN{ 32 case 'z': 33 zerotoo = 1; 34 break; 35 default: 36 usage(); 37 }ARGEND 38 39 if(argc != 1) 40 usage(); 41 42 fmtinstall('V', vtscorefmt); 43 44 if(vtparsescore(argv[0], &pref, score) < 0) 45 sysfatal("bad score '%s'", argv[0]); 46 if((z = vtdial(nil)) == nil) 47 sysfatal("vtdial: %r"); 48 if(vtconnect(z) < 0) 49 sysfatal("vtconnect: %r"); 50 if((c = vtcachealloc(z, 16384*32)) == nil) 51 sysfatal("vtcache: %r"); 52 if((disk = diskopenventi(c, score)) == nil) 53 sysfatal("diskopenventi: %r"); 54 if((fsys = fsysopen(disk)) == nil) 55 sysfatal("fsysopen: %r"); 56 57 zero = emalloc(fsys->blocksize); 58 fprint(2, "%d blocks total\n", fsys->nblock); 59 n = 0; 60 for(i=0; i<fsys->nblock; i++){ 61 if((b = fsysreadblock(fsys, i)) != nil){ 62 if(pwrite(1, b->data, fsys->blocksize, 63 (u64int)fsys->blocksize*i) != fsys->blocksize) 64 fprint(2, "error writing block %lud: %r\n", i); 65 n++; 66 blockput(b); 67 }else if(zerotoo || i==fsys->nblock-1) 68 if(pwrite(1, zero, fsys->blocksize, 69 (u64int)fsys->blocksize*i) != fsys->blocksize) 70 fprint(2, "error writing block %lud: %r\n", i); 71 } 72 fprint(2, "%d blocks in use, %d file reads\n", n, nfilereads); 73 threadexitsall(nil); 74 }