54 lines · 976 B · C
RawDownload
#include <u.h>#include <libc.h>#include <diskfs.h> voidusage(void){	fprint(2, "usage: fscat fspartition\n");	exits("usage");} intmain(int argc, char **argv){	extern int nfilereads;	u8int *zero;	u32int i;	u32int n;	Block *b;	Disk *disk;	Fsys *fsys; 	ARGBEGIN{	default:		usage();	}ARGEND 	if(argc != 1)		usage(); 	if((disk = diskopenfile(argv[0])) == nil)		sysfatal("diskopen: %r");	if((disk = diskcache(disk, 16384, 16)) == nil)		sysfatal("diskcache: %r");	if((fsys = fsysopen(disk)) == nil)		sysfatal("fsysopen: %r"); 	zero = emalloc(fsys->blocksize);	fprint(2, "%d blocks total\n", fsys->nblock);	n = 0;	for(i=0; i<fsys->nblock; i++){		if((b = fsysreadblock(fsys, i)) != nil){			write(1, b->data, fsys->blocksize);			n++;			blockput(b);		}else			write(1, zero, fsys->blocksize);		if(b == nil && i < 2)			sysfatal("block %d not in use", i);	}	fprint(2, "%d blocks in use, %d file reads\n", n, nfilereads);	exits(nil);	return 0;}