#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; }