plan9port

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

diskcat.c (976B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <diskfs.h>
      4 
      5 void
      6 usage(void)
      7 {
      8 	fprint(2, "usage: fscat fspartition\n");
      9 	exits("usage");
     10 }
     11 
     12 int
     13 main(int argc, char **argv)
     14 {
     15 	extern int nfilereads;
     16 	u8int *zero;
     17 	u32int i;
     18 	u32int n;
     19 	Block *b;
     20 	Disk *disk;
     21 	Fsys *fsys;
     22 
     23 	ARGBEGIN{
     24 	default:
     25 		usage();
     26 	}ARGEND
     27 
     28 	if(argc != 1)
     29 		usage();
     30 
     31 	if((disk = diskopenfile(argv[0])) == nil)
     32 		sysfatal("diskopen: %r");
     33 	if((disk = diskcache(disk, 16384, 16)) == nil)
     34 		sysfatal("diskcache: %r");
     35 	if((fsys = fsysopen(disk)) == nil)
     36 		sysfatal("fsysopen: %r");
     37 
     38 	zero = emalloc(fsys->blocksize);
     39 	fprint(2, "%d blocks total\n", fsys->nblock);
     40 	n = 0;
     41 	for(i=0; i<fsys->nblock; i++){
     42 		if((b = fsysreadblock(fsys, i)) != nil){
     43 			write(1, b->data, fsys->blocksize);
     44 			n++;
     45 			blockput(b);
     46 		}else
     47 			write(1, zero, fsys->blocksize);
     48 		if(b == nil && i < 2)
     49 			sysfatal("block %d not in use", i);
     50 	}
     51 	fprint(2, "%d blocks in use, %d file reads\n", n, nfilereads);
     52 	exits(nil);
     53 	return 0;
     54 }