Whamcloud - gitweb
debugfs: teach rdump to take multiple source arguments
authorAaron Crane <arc@aaroncrane.co.uk>
Mon, 4 Aug 2014 01:54:14 +0000 (21:54 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 4 Aug 2014 22:58:23 +0000 (18:58 -0400)
[ modified to update man page by tytso ]

Signed-off-by: Aaron Crane <arc@aaroncrane.co.uk>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
debugfs/debugfs.8.in
debugfs/dump.c

index 9a125f6..bae14db 100644 (file)
@@ -503,12 +503,14 @@ Print the current working directory.
 Quit
 .B debugfs
 .TP
-.BI rdump " directory destination"
+.BI rdump " directory[...] destination"
 Recursively dump
-.I directory
+.IR directory ,
+or multiple
+.IR directories ,
 and all its contents (including regular files, symbolic links, and other
 directories) into the named
-.I destination
+.IR destination ,
 which should be an existing directory on the native filesystem.
 .TP
 .BI rm " pathname"
index 0fa14b6..8d97886 100644 (file)
@@ -326,18 +326,12 @@ static int rdump_dirent(struct ext2_dir_entry *dirent,
 
 void do_rdump(int argc, char **argv)
 {
-       ext2_ino_t ino;
-       struct ext2_inode inode;
        struct stat st;
-       char *arg, *dest_dir, *basename;
-
-       if (common_args_process(argc, argv, 3, 3, "rdump",
-                               "<directory> <native directory>", 0))
-               return;
+       char *dest_dir;
+       int i;
 
-       arg = argv[1];
-       ino = string_to_inode(arg);
-       if (!ino)
+       if (common_args_process(argc, argv, 3, INT_MAX, "rdump",
+                               "<directory>... <native directory>", 0))
                return;
 
        /* Pull out last argument */
@@ -354,16 +348,24 @@ void do_rdump(int argc, char **argv)
                return;
        }
 
-       if (debugfs_read_inode(ino, &inode, arg))
-               return;
+       for (i = 1; i < argc; i++) {
+               char *arg = argv[i], *basename;
+               struct ext2_inode inode;
+               ext2_ino_t ino = string_to_inode(arg);
+               if (!ino)
+                       continue;
 
-       basename = strrchr(arg, '/');
-       if (basename)
-               basename++;
-       else
-               basename = arg;
+               if (debugfs_read_inode(ino, &inode, arg))
+                       continue;
 
-       rdump_inode(ino, &inode, basename, dest_dir);
+               basename = strrchr(arg, '/');
+               if (basename)
+                       basename++;
+               else
+                       basename = arg;
+
+               rdump_inode(ino, &inode, basename, dest_dir);
+       }
 }
 
 void do_cat(int argc, char **argv)