X-Git-Url: https://git.cworth.org/git?p=gzip;a=blobdiff_plain;f=gzexe.in;h=a27ec5c3828a31c6ef881c0aa3e8a48f3e7ecd9e;hp=bcd788c671450699d990ed548464ad5614ea22a6;hb=e7921f54c622e3b32e525f345bc34308821e4ae0;hpb=c9eb602f6f5c10a521e7274640033f6a35deca1d diff --git a/gzexe.in b/gzexe.in old mode 100755 new mode 100644 index bcd788c..a27ec5c --- a/gzexe.in +++ b/gzexe.in @@ -1,4 +1,3 @@ -: #!/bin/sh # gzexe: compressor for Unix executables. # Use this only for binaries that you do not use frequently. @@ -14,170 +13,217 @@ # On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5 -# Copyright (C) 1998, 2002 Free Software Foundation +# Copyright (C) 1998, 2002, 2004, 2006 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, or (at your option) -# any later version. +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +tab=' ' +nl=' +' +IFS=" $tab$nl" -PATH="BINDIR:$PATH" -x=`basename $0` -if test $# = 0; then - echo compress executables. original file foo is renamed to foo~ - echo usage: ${x} [-d] files... - echo " -d decompress the executables" - exit 1 -fi +version='gzexe (gzip) @VERSION@ +Copyright (C) 2006 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. + +Written by Jean-loup Gailly.' + +usage='Usage: gzexe [OPTION] FILE... +Rename each FILE with a compressed version of itself, renaming FILE to FILE~. + + -d Decompress each FILE instead of compressing it. + --help display this help and exit + --version output version information and exit -set -C -tmp=gz$$ -trap "rm -f $tmp; exit 1" HUP INT QUIT TRAP USR1 PIPE TERM -: > $tmp || exit 1 +Report bugs to .' + + +PATH="BINDIR:$PATH" decomp=0 res=0 -test "$x" = "ungzexe" && decomp=1 -if test "x$1" = "x-d"; then - decomp=1 - shift -fi - -echo hi > zfoo1$$ || exit 1 -echo hi > zfoo2$$ || exit 1 -if test -z "`(${CPMOD-cpmod} zfoo1$$ zfoo2$$) 2>&1`"; then - cpmod=${CPMOD-cpmod} -fi -rm -f zfoo[12]$$ - -tail="" -IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" -for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/tail; then - tail="$dir/tail" - break - fi +while :; do + case $1 in + -d) decomp=1; shift;; + --h*) exec echo "$usage";; + --v*) exec echo "$version";; + --) shift; break;; + *) break;; + esac done -IFS="$saveifs" -if test -z "$tail"; then - echo cannot find tail + +if test $# -eq 0; then + echo >&2 "$0: missing operand +Try \`$0 --help' for more information." exit 1 fi -case `echo foo | $tail -n +1 2>/dev/null` in -foo) tail="$tail -n";; -esac + +tmp= +trap 'res=$? + test -n "$tmp" && rm -f "$tmp" + (exit $res); exit $res +' 0 1 2 3 5 10 13 15 + +mktemp_status= for i do - if test ! -f "$i" ; then - echo ${x}: $i not a file - res=1 + case $i in + -*) file=./$i;; + *) file=$i;; + esac + if test ! -f "$file" || test ! -r "$file"; then + res=$? + echo >&2 "$0: $i is not a readable regular file" continue fi if test $decomp -eq 0; then - if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then - echo "${x}: $i is already gzexe'd" + if sed -e 1d -e 2q "$file" | grep "^skip=[0-9][0-9]*$" >/dev/null; then + echo >&2 "$0: $i is already gzexe'd" continue fi fi - if ls -l "$i" | grep '^...[sS]' > /dev/null; then - echo "${x}: $i has setuid permission, unchanged" + if test -u "$file"; then + echo >&2 "$0: $i has setuid permission, unchanged" continue fi - if ls -l "$i" | grep '^......[sS]' > /dev/null; then - echo "${x}: $i has setgid permission, unchanged" + if test -g "$file"; then + echo >&2 "$0: $i has setgid permission, unchanged" continue fi - case "`basename $i`" in - gzip | tail | sed | chmod | ln | sleep | rm) - echo "${x}: $i would depend on itself"; continue ;; + case /$file in + */basename | */cat | */chmod | */cp | \ + */dirname | */echo | */expr | */gzip | \ + */ln | */mkdir | */mktemp | */mv | */rm | */rmdir | \ + */sed | */sh | */sleep | */test | */tail) + echo >&2 "$0: $i would depend on itself"; continue;; esac - if test -z "$cpmod"; then - cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp - if test -w $tmp 2>/dev/null; then - writable=1 - else - writable=0 - chmod u+w $tmp 2>/dev/null - fi - : >| $tmp # truncate the file, ignoring set -C + + dir=`dirname "$file"` || dir=$TMPDIR + test -d "$dir" && test -w "$dir" && test -x "$dir" || dir=/tmp + test -n "$tmp" && rm -f "$tmp" + if test -z "$mktemp_status"; then + type mktemp >/dev/null 2>&1 + mktemp_status=$? + fi + if test $mktemp_status -eq 0; then + tmp=`TMPDIR=$dir mktemp -t gzexeXXXXXX` + else + tmp=$dir/gzexe$$ + fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || { + res=$? + echo >&2 "$0: cannot copy $file" + continue + } + if test -w "$tmp"; then + writable=1 + else + writable=0 + chmod u+w "$tmp" || { + res=$? + echo >&2 "$0: cannot chmod $tmp" + continue + } fi if test $decomp -eq 0; then - sed 1q $0 >> $tmp - sed "s|^if tail|if $tail|" >> $tmp <<'EOF' -skip=23 -set -C + (cat <<'EOF' && +#!/bin/sh +skip=44 + +tab=' ' +nl=' +' +IFS=" $tab$nl" + umask=`umask` umask 77 -tmpfile=`tempfile -p gztmp -d /tmp` || tmpfile=/tmp/gztmp.$$ || exit 1 -if tail +$skip "$0" | /bin/gzip -cd >> $tmpfile; then + +gztmpdir= +trap 'res=$? + test -n "$gztmpdir" && rm -fr "$gztmpdir" + (exit $res); exit $res +' 0 1 2 3 5 10 13 15 + +if type mktemp >/dev/null 2>&1; then + gztmpdir=`mktemp -dt` +else + gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir +fi || { (exit 127); exit 127; } + +gztmp=$gztmpdir/$0 +case $0 in +-* | */*' +') mkdir -p "$gztmp" && rmdir "$gztmp";; +*/*) gztmp=$gztmpdir/`basename "$0"`;; +esac || { (exit 127); exit 127; } + +case `echo X | tail -n +1 2>/dev/null` in +X) tail_n=-n;; +*) tail_n=;; +esac +if tail $tail_n +$skip <"$0" | gzip -cd > "$gztmp"; then umask $umask - /bin/chmod 700 $tmpfile - prog="`echo $0 | /bin/sed 's|^.*/||'`" - if /bin/ln $tmpfile "/tmp/$prog" 2>/dev/null; then - trap '/bin/rm -f $tmpfile "/tmp/$prog"; exit $res' 0 - (/bin/sleep 5; /bin/rm -f $tmpfile "/tmp/$prog") 2>/dev/null & - /tmp/"$prog" ${1+"$@"}; res=$? - else - trap '/bin/rm -f $tmpfile; exit $res' 0 - (/bin/sleep 5; /bin/rm -f $tmpfile) 2>/dev/null & - $tmpfile ${1+"$@"}; res=$? - fi + chmod 700 "$gztmp" + (sleep 5; rm -fr "$gztmpdir") 2>/dev/null & + "$gztmp" ${1+"$@"}; res=$? else - echo Cannot decompress $0; exit 1 + echo >&2 "Cannot decompress $0" + (exit 127); res=127 fi; exit $res EOF - gzip -cv9 "$i" >> $tmp || { - /bin/rm -f $tmp - echo ${x}: compression not possible for $i, file unchanged. - res=1 + gzip -cv9 "$file") > "$tmp" || { + res=$? + echo >&2 "$0: compression not possible for $i, file unchanged." continue } else # decompression - skip=23 - if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then - eval `sed -e 1d -e 2q "$i"` - fi - if tail +$skip "$i" | gzip -cd > $tmp; then - : - else - echo ${x}: $i probably not in gzexe format, file unchanged. - res=1 + skip=44 + skip_line=`sed -e 1d -e 2q "$file"` + case $skip_line in + skip=[0-9] | skip=[0-9][0-9] | skip=[0-9][0-9][0-9]) + eval "$skip_line";; + esac + case `echo X | tail -n +1 2>/dev/null` in + X) tail_n=-n;; + *) tail_n=;; + esac + tail $tail_n +$skip "$file" | gzip -cd > "$tmp" || { + res=$? + echo >&2 "$0: $i probably not in gzexe format, file unchanged." continue - fi + } fi - rm -f "$i~" - mv "$i" "$i~" || { - echo ${x}: cannot backup $i as $i~ - rm -f $tmp - res=1 + test $writable -eq 1 || chmod u-w "$tmp" || { + res=$? + echo >&2 "$0: $tmp: cannot chmod" continue } - mv $tmp "$i" || cp -p $tmp "$i" 2>/dev/null || cp $tmp "$i" || { - echo ${x}: cannot create $i - rm -f $tmp - res=1 + ln -f "$file" "$file~" || { + res=$? + echo >&2 "$0: cannot backup $i as $i~" continue } - rm -f $tmp - if test -n "$cpmod"; then - $cpmod "$i~" "$i" 2>/dev/null - elif test $writable -eq 0; then - chmod u-w $i 2>/dev/null - fi + mv -f "$tmp" "$file" || { + res=$? + echo >&2 "$0: cannot rename $tmp to $i" + continue + } + tmp= done -exit $res +(exit $res); exit $res