diff options
Diffstat (limited to 'src/ext_clone.c')
-rw-r--r-- | src/ext_clone.c | 99 |
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; +} + + + + |