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 }