diff options
author | fishsoupisgood <github@madingley.org> | 2018-05-12 17:10:22 +0100 |
---|---|---|
committer | fishsoupisgood <github@madingley.org> | 2018-05-12 17:10:22 +0100 |
commit | b6afefb5d12dbed4801272dae3048588dfc1cb9a (patch) | |
tree | 0dc99b5b05d54cd5496b26fa37e19cc79f0b4b5e /src/ext_clone.c | |
download | ext_clone-b6afefb5d12dbed4801272dae3048588dfc1cb9a.tar.gz ext_clone-b6afefb5d12dbed4801272dae3048588dfc1cb9a.tar.bz2 ext_clone-b6afefb5d12dbed4801272dae3048588dfc1cb9a.zip |
first working version
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; +} + + + + |