aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/vbackup/diskcat.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-07-13 03:49:41 +0000
committerrsc <devnull@localhost>2005-07-13 03:49:41 +0000
commit004aa293f360ea0f63ec50f5042f8c0fb2831e4f (patch)
treed44b801b47c82861d68d4045acf0bf7129ce6009 /src/cmd/vbackup/diskcat.c
parent0c98da8bf8ea51d0288222f6c6ba3c125cf20f46 (diff)
downloadplan9port-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.c54
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;
+}