chiark / gitweb /
Dgit.pm: cmdoutput: Handle undef in arg crash better
[dgit.git] / Debian / Dgit.pm
index 2555812c46abcdd1c617e718b0cb1c5643e8e0ba..cb4a599b20849ea13b0656937c2fd15fb006a932 100644 (file)
@@ -5,10 +5,12 @@ package Debian::Dgit;
 use strict;
 use warnings;
 
+use Carp;
 use POSIX;
 use IO::Handle;
 use Config;
 use Digest::SHA;
+use Data::Dumper;
 
 BEGIN {
     use Exporter   ();
@@ -186,8 +188,19 @@ sub waitstatusmsg () {
 }
 
 sub failedcmd {
+    # Expects $!,$? as set by close - see below.
+    # To use with system(), set $?=-1 first.
+    #
+    # Actual behaviour of perl operations:
+    #   success              $!==0       $?==0       close of piped open
+    #   program failed       $!==0       $? >0       close of piped open
+    #   syscall failure      $! >0       $?=-1       close of piped open
+    #   failure              $! >0       unchanged   close of something else
+    #   success              trashed     $?==0       system
+    #   program failed       trashed     $? >0       system
+    #   syscall failure      $! >0       unchanged   system
     { local ($!); printcmd \*STDERR, _us().": failed command:", @_ or die $!; };
-    if ($!) {
+    if ($? < 0) {
        fail "failed to fork/exec: $!";
     } elsif ($?) {
        fail "subprocess ".waitstatusmsg();
@@ -197,7 +210,7 @@ sub failedcmd {
 }
 
 sub cmdoutput_errok {
-    die Dumper(\@_)." ?" if grep { !defined } @_;
+    confess Dumper(\@_)." ?" if grep { !defined } @_;
     debugcmd "|",@_;
     open P, "-|", @_ or die "$_[0] $!";
     my $d;