bin/imager.save
changeset 32 02ef2d1b190a
parent 30 7067c6844088
parent 26 496ee9b0f488
child 35 bbdb8ea3079a
--- a/bin/imager.save	Fri Jul 29 11:09:36 2011 +0200
+++ b/bin/imager.save	Fri Jul 29 14:52:05 2011 +0200
@@ -15,6 +15,7 @@
 use Getopt::Long;
 use Pod::Usage;
 
+
 use constant KiB      => 1024;
 use constant MiB      => 1024 * KiB;
 use constant GiB      => 1024 * MiB;
@@ -23,25 +24,20 @@
 
 sub get_devsize;
 sub get_devname;
+sub save;
 
 $SIG{INT} = sub { die "Got INT\n" };
 
 my %o = (
     compress  => undef,
     verbose   => undef,
-    blocksize => 2 * MiB,
+    blocksize => 4 * MiB,
 );
 lock_keys(%o);
 
 my $NOW = time();
 
 MAIN: {
-    my ($src, $dst);
-
-    my $idx  = "{DIR}/idx/{HOSTNAME}/{DEVICE}/";
-    my $data = "{DIR}/data";
-    my $size;
-
     GetOptions(
         "h|help" => sub { pod2usage(-verbose => 1, exit => 0) },
         "m|man"  => sub {
@@ -64,9 +60,29 @@
             }
         },
       )
-      and @ARGV == 2
-      or pod2usage;
-    ($src, $dst) = @ARGV;
+      and @ARGV >= 2 or pod2usage;
+
+    my $dst = pop @ARGV;
+    foreach my $src (@ARGV) {
+	if (my $pid = fork()) {
+	    next;
+	}
+	elsif (not defined $pid) {
+	    die "Can't fork: $!\n"
+	}
+	save($src, $dst);
+	exit;
+    }
+
+    do 1 while wait != -1;
+
+}
+
+sub save {
+    my ($src, $dst) = @_;
+    my $idx  = "{DIR}/idx/{HOSTNAME}/{DEVICE}/";
+    my $data = "{DIR}/data";
+    my $size;
 
     foreach ($idx, $data) {
         s/{DIR}/$dst/g;
@@ -105,7 +121,8 @@
     local $SIG{ALRM} = sub {
         my $speed = ($stats{written} + $stats{skipped}) / (time - $^T + 1);
         say sprintf
-"# done %5.1f%% | %24s (%*d of $stats{todo}, written %*d, skipped %*d)",
+"# %*s done %5.1f%% | %24s (%*d of $stats{todo}, written %*d, skipped %*d)",
+	  (sort {$a<=>$b} map { length basename $_ } @ARGV)[-1] => basename($src),
           100 * (($stats{written} + $stats{skipped}) / $stats{todo}),
           ($speed ? (scalar localtime($^T + $stats{todo} / $speed)) : ""),
           length($stats{todo}) => $stats{written} + $stats{skipped},
@@ -157,9 +174,9 @@
 
     say {$index} "# DONE (runtime " . (time() - $^T) . "s)";
 
-    say "# DONE (runtime " . (time() - $^T) . "s)";
-    say "# WRITTEN $stats{written}, SKIPPED $stats{skipped} blocks";
-    say "# SAVINGS "
+    say "# $src DONE (runtime " . (time() - $^T) . "s)";
+    say "# $src WRITTEN $stats{written}, SKIPPED $stats{skipped} blocks";
+    say "# $src SAVINGS "
       . sprintf "%3d%%" => 100 *
       ($stats{skipped} / ($stats{written} + $stats{skipped}));
 
@@ -215,7 +232,7 @@
 
 =item B<-b> I<blocksize>|B<--blocksize>=I<blocksize>
 
-The blocksize used. (may be suffixed with K, M, G). (default: 2MiB)
+The blocksize used. (may be suffixed with K, M, G). (default: 4 MiB)
 
 =item B<-h>|B<--help>