-:
#!/bin/sh
# gzexe: compressor for Unix executables.
# Use this only for binaries that you do not use frequently.
# The : is required for some old versions of csh.
# On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5
-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
-tmp=gz$$
-trap "rm -f $tmp; exit 1" 1 2 3 5 10 13 15
+# Copyright (C) 1998, 2002, 2004, 2006-2007, 2010-2018 Free Software
+# Foundation, Inc.
+# 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 3 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.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+version='gzexe (gzip) @VERSION@
+Copyright (C) 2007, 2011-2017 Free Software Foundation, Inc.
+This is free software. You may redistribute copies of it under the terms of
+the GNU General Public License <https://www.gnu.org/licenses/gpl.html>.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by Jean-loup Gailly.'
+
+usage="Usage: $0 [OPTION] FILE...
+Replace each executable FILE with a compressed version of itself.
+Make a backup FILE~ of the old version of FILE.
+
+ -d Decompress each FILE instead of compressing it.
+ --help display this help and exit
+ --version output version information and exit
+
+Report bugs to <bug-gzip@gnu.org>."
decomp=0
res=0
-test "$x" = "ungzexe" && decomp=1
-if test "x$1" = "x-d"; then
- decomp=1
- shift
-fi
-
-echo hi > zfoo1$$
-echo hi > zfoo2$$
-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*) printf '%s\n' "$usage" || exit 1; exit;;
+ --v*) printf '%s\n' "$version" || exit 1; exit;;
+ --) shift; break;;
+ *) break;;
+ esac
done
-IFS="$saveifs"
-if test -z "$tail"; then
- echo cannot find tail
+
+if test $# -eq 0; then
+ printf >&2 '%s\n' "$0: missing operand
+Try \`$0 --help' for more information."
exit 1
fi
+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=$?
+ printf >&2 '%s\n' "$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
+ printf >&2 '%s\n' "$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
+ printf >&2 '%s\n' "$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
+ printf >&2 '%s\n' "$0: $i has setgid permission, unchanged"
continue
fi
- case "`basename $i`" in
- gzip | tail | chmod | ln | sleep | rm)
- echo "${x}: $i would depend on itself"; continue ;;
+ case /$file in
+ */basename | */bash | */cat | */chmod | */cp | \
+ */dirname | */expr | */gzip | \
+ */ln | */mkdir | */mktemp | */mv | */printf | */rm | \
+ */sed | */sh | */sleep | */test | */tail)
+ printf >&2 '%s\n' "$0: $i might 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
+
+ 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
+ case $dir in
+ */) ;;
+ *) dir=$dir/;;
+ esac
+ if test $mktemp_status -eq 0; then
+ tmp=`mktemp "${dir}gzexeXXXXXXXXX"`
+ else
+ tmp=${dir}gzexe$$
+ fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || {
+ res=$?
+ printf >&2 '%s\n' "$0: cannot copy $file"
+ continue
+ }
+ if test -w "$tmp"; then
+ writable=1
+ else
+ writable=0
+ chmod u+w "$tmp" || {
+ res=$?
+ printf >&2 '%s\n' "$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=22
-set -C
+ (cat <<'EOF' &&
+#!/bin/sh
+skip=44
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
umask=`umask`
umask 77
-if tail +$skip $0 | "BINDIR"/gzip -cd > /tmp/gztmp$$; then
+
+gztmpdir=
+trap 'res=$?
+ test -n "$gztmpdir" && rm -fr "$gztmpdir"
+ (exit $res); exit $res
+' 0 1 2 3 5 10 13 15
+
+case $TMPDIR in
+ / | /*/) ;;
+ /*) TMPDIR=$TMPDIR/;;
+ *) TMPDIR=/tmp/;;
+esac
+if type mktemp >/dev/null 2>&1; then
+ gztmpdir=`mktemp -d "${TMPDIR}gztmpXXXXXXXXX"`
+else
+ gztmpdir=${TMPDIR}gztmp$$; mkdir $gztmpdir
+fi || { (exit 127); exit 127; }
+
+gztmp=$gztmpdir/$0
+case $0 in
+-* | */*'
+') mkdir -p "$gztmp" && rm -r "$gztmp";;
+*/*) gztmp=$gztmpdir/`basename "$0"`;;
+esac || { (exit 127); exit 127; }
+
+case `printf 'X\n' | 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 /tmp/gztmp$$
- prog="`echo $0 | /bin/sed 's|^.*/||'`"
- if /bin/ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then
- trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0
- (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null &
- /tmp/"$prog" ${1+"$@"}; res=$?
- else
- trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0
- (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null &
- /tmp/gztmp$$ ${1+"$@"}; res=$?
- fi
+ chmod 700 "$gztmp"
+ (sleep 5; rm -fr "$gztmpdir") 2>/dev/null &
+ "$gztmp" ${1+"$@"}; res=$?
else
- echo Cannot decompress $0; exit 1
+ printf >&2 '%s\n' "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=$?
+ printf >&2 '%s\n' "$0: compression not possible for $i, file unchanged."
continue
}
else
# decompression
- skip=22
- 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 `printf 'X\n' | tail -n +1 2>/dev/null` in
+ X) tail_n=-n;;
+ *) tail_n=;;
+ esac
+ tail $tail_n +$skip "$file" | gzip -cd > "$tmp" || {
+ res=$?
+ printf >&2 '%s\n' "$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=$?
+ printf >&2 '%s\n' "$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~" 2>/dev/null || {
+ # Hard links may not work. Fall back on rm+cp so that $file always exists.
+ rm -f "$file~" && cp -p "$file" "$file~"
+ } || {
+ res=$?
+ printf >&2 '%s\n' "$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=$?
+ printf >&2 '%s\n' "$0: cannot rename $tmp to $i"
+ continue
+ }
+ tmp=
done
-exit $res
+(exit $res); exit $res