plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }