gzip: port zgrep to Solaris 11.2
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 6 Mar 2016 08:17:41 +0000 (00:17 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 6 Mar 2016 08:18:30 +0000 (00:18 -0800)
Problem reported by Assaf Gordon in: http://bugs.gnu.org/22900#11
* zgrep.in: Port to Solaris 11.2 /bin/sh (ksh 93u 2011-02-08),
where $? is 256+SIG when a process was killed with signal SIG, and
where 'exit 257' is equivalent to 'exit 1'.  Apparently some other
sh implementations use 256+128+SIG.  So, instead of using plain
'exit $?', use the equivalent of 'exit ((128 * (128 <= $?)) + $? %
128)' within the script, and use the equivalent of 'kill -$($? %
128)' at the top level if the exit status is 128 or more.

zgrep.in

index 0ad1b8a100ee0b3a07bf38c8859121983e6c24be..bbea3317ffb04c08d4f15dea4a843181ff73cccf 100644 (file)
--- a/zgrep.in
+++ b/zgrep.in
@@ -183,6 +183,7 @@ do
         if test $r -eq 1; then
           printf '%s\n' "$i" || r=2
         fi
+        test 256 -le $r && r=$(expr 128 + $r % 128)
         exit $r
       }
     elif test $with_filename -eq 0 &&
@@ -202,12 +203,13 @@ do
       sed_script="s|^|$i:|"
 
       # Fail if grep or sed fails.
-      r=$(
-        exec 4>&1
-        (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
-      ) && exit $r
-      r=$?
-      test 1 -lt $r && exit $r || exit 2
+      if r=$(
+           exec 4>&1
+           (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
+         ) || { r=$?; test $r -lt 2 && r=2; :; }; then
+        test 256 -le $r && r=$(expr 128 + $r % 128)
+        exit $r
+      fi
     fi >&3 5>&-
   )
   r=$?
@@ -220,14 +222,16 @@ do
   # Use the more serious of the grep and gzip statuses.
   test $r -lt $gzip_status && r=$gzip_status
 
-  # Exit immediately on software configuration error.
-  test 126 -le $r && exit $r
-
   # Accumulate the greatest status, except consider 0 to be greater than 1.
   if test $r -le 1 && test $res -le 1; then
      test $r -lt $res
   else
      test $res -lt $r
   fi && res=$r
+
+  # Exit immediately on a serious error.
+  test 126 -le $res && break
 done
+
+test 128 -le $res && kill -$(expr $res % 128) $$
 exit $res