--- a/bin/imager.save Fri Aug 19 16:39:09 2011 +0200
+++ b/bin/imager.save Mon Aug 22 14:30:27 2011 +0200
@@ -49,8 +49,8 @@
-noperldoc => system("perldoc -V >/dev/null 2>&1")
);
},
- "c|comment=s" => \$o{comment},
- "z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED },
+ "c|comment=s" => \$o{comment},
+ "z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED },
"p|pass=s" => \$o{pass},
"b|blocksize=s" => sub {
given ($_[1]) {
@@ -79,7 +79,11 @@
exit;
}
- do 1 while wait != -1;
+ my $rc = 0;
+ while (wait != -1) {
+ $rc = ($? >> 8) if ($? >> 8) > $rc;
+ }
+ exit $rc;
}
@@ -91,10 +95,10 @@
my ($size, $name);
if ($src =~ /(?<dev>.+?):(?<name>.+)/) {
- $src = $+{dev};
- $name = $+{name};
+ $src = $+{dev};
+ $name = $+{name};
}
- else { $name = $src };
+ else { $name = $src }
foreach ($idx, $data, $info) {
s/{DIR}/$dst/g;
@@ -144,12 +148,17 @@
};
$SIG{ALRM}->();
- for (my $blknr = 0; sysread($in => my $buffer, $o{blocksize}) > 0; ++$blknr) {
-
+ for (
+ my $blknr = 0 ;
+ sysread($in => my $buffer, $o{blocksize}) > 0 ;
+ ++$blknr
+ )
+ {
+
my ($file, $ext, $cs);
$file = $cs = md5_hex($buffer);
$file =~ s/(?<fn>(?<prefix>...).*)/$+{prefix}\/$+{fn}/g;
- $ext .= $o{pass} ? ".x" : "";
+ $ext .= $o{pass} ? ".x" : "";
# the extension we do not put into the index
push @{ $index{BLOCKS} }, sprintf "%12d %s %s" => $blknr,
@@ -167,22 +176,29 @@
}
binmode($out);
- if ($o{compress}) {
- my $zbuffer;
- gzip(
- \$buffer => \$zbuffer,
- -Minimal => 1,
- -Level => Z_BEST_SPEED,
- -Strategy => Z_FILTERED
- ) or die $GzipError;
- if (length($zbuffer)/length($buffer) < 0.9) {
- $buffer = $zbuffer;
- $ext = ".gz$ext";
- }
- }
+
+ my $bufref = \$buffer;
+ if ($o{compress}) {
+ my $zbuffer;
+ gzip(
+ \$buffer => \$zbuffer,
+ -Minimal => 1,
+ -Level => Z_BEST_SPEED,
+ -Strategy => Z_FILTERED
+ ) or die $GzipError;
+ if (length($zbuffer) / length($buffer) < 0.9) {
+ $bufref = \$zbuffer;
+ $ext = ".gz$ext";
+ }
+ }
- syswrite $out => $buffer;
- close($out);
+ #for(my $todo = length $$bufref;
+ # $todo -= syswrite $out => $$bufref, $todo, -$todo; 1)
+ #{
+ #}
+ syswrite $out => $$bufref;
+
+ close($out) or die $!;
rename($out => "$data/$file$ext");
$index{BLOCKS}[$blknr] .= " *";
$stats{written}++;
--- a/t/001-save-restore.t Fri Aug 19 16:39:09 2011 +0200
+++ b/t/001-save-restore.t Mon Aug 22 14:30:27 2011 +0200
@@ -18,6 +18,11 @@
note("preparing the images dir");
mkdir "$dir/images";
+mkdir "$dir/mnt";
+
+system("sudo mount -ttmpfs -osize=10M,uid=$> tmpfs $dir/mnt 2>/dev/null");
+END { system("sudo umount $dir/mnt 2>/dev/null") };
+
system("perl -Mblib blib/script/imager.save $dir/source:source $dir/images");
is($? => 0, "saved");
@@ -38,5 +43,11 @@
open($restored, "$dir/source.restored");
ok(<$out> ~~ <$restored>, "compressed source === restored");
+# now check on overflow of destination
+
+note("overflow condition");
+eval { system("perl -Mblib blib/script/imager.save $dir/source:source $dir/mnt 2>$err") };
+ok($?, "failure is expected");
+
done_testing;