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