chiark / gitweb /
Subprocess error handling: Initialise $? to -1
[dgit.git] / Debian / Dgit.pm
index 2555812c46abcdd1c617e718b0cb1c5643e8e0ba..aa0c5a3d675cbf1d7418c222a2e5a9f7a6819182 100644 (file)
@@ -186,8 +186,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();