aboutsummaryrefslogtreecommitdiffstats
path: root/src/clone_fs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/clone_fs.c')
-rw-r--r--src/clone_fs.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/clone_fs.c b/src/clone_fs.c
new file mode 100644
index 0000000..1269b30
--- /dev/null
+++ b/src/clone_fs.c
@@ -0,0 +1,52 @@
+#include "project.h"
+
+
+int clone_fs (ext2_filsys src_fs, ext2_filsys dst_fs)
+{
+ int skip;
+ int ret;
+ ext2_inode_scan scan;
+ ext2_ino_t i_num;
+ struct ext2_inode src_i;
+
+ EXT2_MOAN_FAIL (ret, ext2fs_open_inode_scan (src_fs, 0, &scan));
+
+ if (ret) return -1;
+
+ for (;;) {
+ EXT2_MOAN_FAIL (ret, ext2fs_get_next_inode (scan, &i_num, &src_i));
+
+ if (ret) break;
+
+ if (!i_num) break;
+
+ skip = 0;
+
+ switch (i_num) {
+ case EXT2_BAD_INO:
+ case EXT4_USR_QUOTA_INO:
+ case EXT4_GRP_QUOTA_INO:
+ case EXT2_BOOT_LOADER_INO:
+ case EXT2_UNDEL_DIR_INO:
+ case EXT2_RESIZE_INO:
+ case EXT2_EXCLUDE_INO:
+ case EXT4_REPLICA_INO:
+ skip = 1;
+ }
+
+ if (i_num == src_fs->super->s_journal_inum) skip = 1;
+
+ if (skip) continue;
+
+ if (clone_inode (src_fs, dst_fs, i_num, &src_i)) {
+ fprintf (stderr, "clone_inode(%d) failed\n", (int) i_num);
+ break;
+ }
+ }
+
+ ext2fs_close_inode_scan (scan);
+ return 0;
+}
+
+
+