Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <venti.h>
4 #include <diskfs.h>
5 #include <thread.h>
7 void
8 usage(void)
9 {
10 fprint(2, "usage: vcat [-z] score >diskfile\n");
11 threadexitsall("usage");
12 }
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;
30 zerotoo = 0;
31 ARGBEGIN{
32 case 'z':
33 zerotoo = 1;
34 break;
35 default:
36 usage();
37 }ARGEND
39 if(argc != 1)
40 usage();
42 fmtinstall('V', vtscorefmt);
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");
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 }