diff options
author | rsc <devnull@localhost> | 2005-07-13 03:49:41 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-07-13 03:49:41 +0000 |
commit | 004aa293f360ea0f63ec50f5042f8c0fb2831e4f (patch) | |
tree | d44b801b47c82861d68d4045acf0bf7129ce6009 /src/cmd/vbackup/diskcat.c | |
parent | 0c98da8bf8ea51d0288222f6c6ba3c125cf20f46 (diff) | |
download | plan9port-004aa293f360ea0f63ec50f5042f8c0fb2831e4f.tar.gz plan9port-004aa293f360ea0f63ec50f5042f8c0fb2831e4f.tar.bz2 plan9port-004aa293f360ea0f63ec50f5042f8c0fb2831e4f.zip |
Dump-like file system backup for Unix, built on Venti.
Diffstat (limited to 'src/cmd/vbackup/diskcat.c')
-rw-r--r-- | src/cmd/vbackup/diskcat.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/cmd/vbackup/diskcat.c b/src/cmd/vbackup/diskcat.c new file mode 100644 index 00000000..92586890 --- /dev/null +++ b/src/cmd/vbackup/diskcat.c @@ -0,0 +1,54 @@ +#include <u.h> +#include <libc.h> +#include <diskfs.h> + +void +usage(void) +{ + fprint(2, "usage: fscat fspartition\n"); + exits("usage"); +} + +int +main(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("ffsopen: %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; +} |