aboutsummaryrefslogtreecommitdiffstats
path: root/src/ext_clone.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext_clone.c')
-rw-r--r--src/ext_clone.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/ext_clone.c b/src/ext_clone.c
new file mode 100644
index 0000000..1899455
--- /dev/null
+++ b/src/ext_clone.c
@@ -0,0 +1,99 @@
+#include "project.h"
+
+static void
+usage (void)
+{
+ fprintf (stderr, "ext_clone -s src_dev -d dest_dev\n");
+ exit (1);
+}
+
+
+char buf[BUF_SZ];
+
+
+
+int main (int argc, char *argv[])
+{
+ int ret;
+ ext2_filsys src_fs = NULL;
+ ext2_filsys dst_fs = NULL;
+ char *src_dev = NULL;
+ char *dst_dev = NULL;
+
+ int opt;
+
+ while ((opt = getopt (argc, argv, "d:s:")) != -1) {
+ switch (opt) {
+ case 'd':
+ dst_dev = optarg;
+ break;
+
+ case 's':
+ src_dev = optarg;
+ break;
+
+ default:
+ usage();
+ }
+ }
+
+ if ((!src_dev) || (!dst_dev)) usage();
+
+ do {
+ EXT2_MOAN_FAIL (ret, ext2fs_open (src_dev, EXT2_FLAG_64BITS, 0, 0, unix_io_manager, &src_fs));
+
+ if (ret)
+ break;
+
+ EXT2_MOAN_FAIL (ret, ext2fs_open (dst_dev, EXT2_FLAG_64BITS | EXT2_FLAG_RW, 0, 0, unix_io_manager, &dst_fs));
+
+ if (ret)
+ break;
+
+
+ /*make the hash seed the same */
+
+ memcpy (dst_fs->super->s_hash_seed, src_fs->super->s_hash_seed, sizeof (src_fs->super->s_hash_seed));
+ dst_fs->super->s_def_hash_version = src_fs->super->s_def_hash_version;
+
+ ext2fs_mark_super_dirty (dst_fs);
+
+
+
+
+ EXT2_MOAN_FAIL (ret, ext2fs_read_inode_bitmap (dst_fs));
+
+ if (ret)
+ break;
+
+ EXT2_MOAN_FAIL (ret, ext2fs_read_block_bitmap (dst_fs));
+
+ if (ret)
+ break;
+
+ ret = zap_fs (dst_fs);
+
+ if (ret)
+ break;
+
+
+ ret = clone_fs (src_fs, dst_fs);
+
+ } while (0);
+
+
+
+ if (dst_fs)
+ ext2fs_close (dst_fs);
+
+ if (src_fs)
+ ext2fs_close (src_fs);
+
+ stats (1);
+
+ return ret;
+}
+
+
+
+