X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=zgrep.in;h=7ce45ae8b3900afb12e6147c7039e04e297c3a18;hb=bc7ecfcc001fe21254fff0709cbd2bdb217e846d;hp=9668faef806c87c53e0aad9397cf68042e0aa8e4;hpb=2725db10000bae65e311a9329973b11053b86f1a;p=debian%2Fgzip diff --git a/zgrep.in b/zgrep.in index 9668fae..7ce45ae 100644 --- a/zgrep.in +++ b/zgrep.in @@ -22,16 +22,10 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -bindir=@bindir@ -case $1 in ---__bindir) bindir=${2?}; shift; shift;; -esac -PATH=$bindir:$PATH - grep='${GREP-'\''@GREP@'\''}' version='zgrep (gzip) @VERSION@ -Copyright (C) 2010-2015 Free Software Foundation, Inc. +Copyright (C) 2010-2016 Free Software Foundation, Inc. This is free software. You may redistribute copies of it under the terms of the GNU General Public License . There is NO WARRANTY, to the extent permitted by law. @@ -61,6 +55,7 @@ files_with_matches=0 files_without_matches=0 no_filename=0 with_filename=0 +pattmp= while test $# -ne 0; do option=$1 @@ -119,13 +114,34 @@ while test $# -ne 0; do # The pattern is coming from a file rather than the command-line. # If the file is actually stdin then we need to do a little # magic, since we use stdin to pass the gzip output to grep. - # Turn the -f option into an -e option by copying the file's - # contents into OPTARG. - case $optarg in - (" '-'" | " '/dev/stdin'" | " '/dev/fd/0'") - option=-e - optarg=" '"$(sed "$escape") || exit 2;; - esac + # Similarly if it is not a regular file, since it might be read repeatedly. + # In either of these two cases, copy the pattern into a temporary file, + # and use that file instead. The pattern might contain null bytes, + # so we cannot simply switch to -e here. + if case $optarg in + (" '-'" | " '/dev/stdin'" | " '/dev/fd/0'") + :;; + (*) + eval "test ! -f$optarg";; + esac + then + if test -n "$pattmp"; then + eval "cat --$optarg" >>"$pattmp" || exit 2 + continue + fi + trap ' + test -n "$pattmp" && rm -f "$pattmp" + (exit 2); exit 2 + ' HUP INT PIPE TERM 0 + if type mktemp >/dev/null 2>&1; then + pattmp=$(mktemp) || exit 2 + else + set -C + pattmp=${TMPDIR-/tmp}/zgrep.$$ + fi + eval "cat --$optarg" >"$pattmp" || exit 2 + optarg=' "$pattmp"' + fi have_pat=1;; (--h | --he | --hel | --help) echo "$usage" || exit 2 @@ -189,6 +205,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 && @@ -211,9 +228,9 @@ do 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 + ) || { r=$?; test $r -lt 2 && r=2; } + test 256 -le $r && r=$(expr 128 + $r % 128) + exit $r fi >&3 5>&- ) r=$? @@ -226,14 +243,25 @@ 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 + +if test -n "$pattmp"; then + rm -f "$pattmp" || { + r=$? + test $r -lt 2 && r=2 + test $res -lt $r && res=$r + } + trap - HUP INT PIPE TERM 0 +fi + +test 128 -le $res && kill -$(expr $res % 128) $$ exit $res