detect child EXIT_FAILURE
authorHeiko Schlittermann (JUMPER) <hs@schlittermann.de>
Mon, 22 Aug 2011 14:30:27 +0200
changeset 80 ffde94c51cd4
parent 79 4362b3ac6567
child 81 f8fc94c18ebd
detect child EXIT_FAILURE
bin/imager.save
t/001-save-restore.t
--- 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;