debugfs: teach rdump to take multiple source arguments

[ 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>
diff --git a/debugfs/debugfs.8.in b/debugfs/debugfs.8.in
index 9a125f6..bae14db 100644
--- a/debugfs/debugfs.8.in
+++ b/debugfs/debugfs.8.in
@@ -503,12 +503,14 @@
 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"
diff --git a/debugfs/dump.c b/debugfs/dump.c
index 0fa14b6..8d97886 100644
--- a/debugfs/dump.c
+++ b/debugfs/dump.c
@@ -326,18 +326,12 @@
 
 void do_rdump(int argc, char **argv)
 {
-	ext2_ino_t ino;
-	struct ext2_inode inode;
 	struct stat st;
-	char *arg, *dest_dir, *basename;
+	char *dest_dir;
+	int i;
 
-	if (common_args_process(argc, argv, 3, 3, "rdump",
-				"<directory> <native directory>", 0))
-		return;
-
-	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 @@
 		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)