# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1314016227 -7200 # Node ID ffde94c51cd4f37ed5ccf4dab7dd29331e11ffb5 # Parent 4362b3ac6567d89f7278b5bf2566b904396e91a8 detect child EXIT_FAILURE diff -r 4362b3ac6567 -r ffde94c51cd4 bin/imager.save --- 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 =~ /(?.+?):(?.+)/) { - $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/(?(?...).*)/$+{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}++; diff -r 4362b3ac6567 -r ffde94c51cd4 t/001-save-restore.t --- 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;