--- 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>