X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=zgrep.in;fp=zgrep.in;h=aced3728d2e0052814ba3f256abcb6023c87a9ca;hb=c7e61475680fa226bd9b8bdd469cd66914e630f5;hp=8350d92ab9451e62286378db89cf83cb3a8fc322;hpb=800deb09b422a73c1212233a93839a223ff59678;p=debian%2Fgzip diff --git a/zgrep.in b/zgrep.in index 8350d92..aced372 100644 --- a/zgrep.in +++ b/zgrep.in @@ -3,12 +3,12 @@ # zgrep -- a wrapper around a grep program that decompresses files as needed # Adapted from a version sent by Charles Levert -# Copyright (C) 1998, 2001, 2002, 2006, 2007 Free Software Foundation +# Copyright (C) 1998, 2001, 2002, 2006, 2007, 2009 Free Software Foundation # Copyright (C) 1993 Jean-loup Gailly # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, @@ -20,11 +20,16 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -PATH=BINDIR:$PATH +bindir=@bindir@ +case $1 in +--__bindir) bindir=${2?}; shift; shift;; +esac +PATH=$bindir:$PATH + grep='${GREP-grep}' version='zgrep (gzip) @VERSION@ -Copyright (C) 2007 Free Software Foundation, Inc. +Copyright (C) 2007, 2009 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. @@ -47,6 +52,7 @@ escape=' ' operands= have_pat=0 +pat_on_stdin=0 files_with_matches=0 files_without_matches=0 no_filename=0 @@ -92,6 +98,33 @@ while test $# -ne 0; do printf >&2 '%s: %s: option not supported\n' "$0" "$option" exit 2;; (-[ef]* | --file | --file=* | --reg*) + # 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). + # So find a free fd and change the argument to then use this + # file descriptor for the pattern. + case $optarg in + (" '-'" | " '/dev/stdin'" | " '/dev/fd/0'") + pat_on_stdin=1 + eval 'test -e .' 2>/dev/null \ + && eval 'exists(){ test -e "$@"; }' \ + || eval 'exists(){ test -r "$@" || test -w "$@"; }' + # Start search from 6 since the script already uses 3 and 5 + fd=6 + pat_fd= + while : ; do + if ! exists /proc/$$/fd/$fd; then + pat_fd=$fd + break; + fi + fd=$(expr $fd + 1) + if test $fd = 255; then + printf >&2 '%s: no free file descriptor\n' "$0" + exit 2 + fi + done + optarg=/dev/fd/$pat_fd; + esac have_pat=1;; (--h | --he | --hel | --help) echo "$usage" || exit 2 @@ -146,6 +179,9 @@ do # Fail if gzip or grep (or sed) fails. gzip_status=$( exec 5>&1 + if test $pat_on_stdin -eq 1; then + eval "exec $pat_fd<&0" + fi (gzip -cdfq -- "$i" 5>&-; echo $? >&5) 3>&- | if test $files_with_matches -eq 1; then eval "$grep" >/dev/null && { printf '%s\n' "$i" || exit 2; }