2 # gzexe: compressor for Unix executables.
3 # Use this only for binaries that you do not use frequently.
5 # The compressed version is a shell script which decompresses itself after
6 # skipping $skip lines of shell commands. We try invoking the compressed
7 # executable with the original name (for programs looking at their name).
8 # We also try to retain the original file permissions on the compressed file.
9 # For safety reasons, gzexe will not create setuid or setgid shell scripts.
11 # WARNING: the first line of this file must be either : or #!/bin/bash
12 # The : is required for some old versions of csh.
13 # On Ultrix, /bin/bash is too buggy, change the first line to: #!/bin/bash5
16 # Copyright (C) 1998, 2002, 2004, 2006, 2007 Free Software Foundation
17 # Copyright (C) 1993 Jean-loup Gailly
19 # This program is free software; you can redistribute it and/or modify
20 # it under the terms of the GNU General Public License as published by
21 # the Free Software Foundation; either version 2 of the License, or
22 # (at your option) any later version.
24 # This program is distributed in the hope that it will be useful,
25 # but WITHOUT ANY WARRANTY; without even the implied warranty of
26 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 # GNU General Public License for more details.
29 # You should have received a copy of the GNU General Public License along
30 # with this program; if not, write to the Free Software Foundation, Inc.,
31 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
38 version='gzexe (gzip) 1.3.12
39 Copyright (C) 2007 Free Software Foundation, Inc.
40 This is free software. You may redistribute copies of it under the terms of
41 the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
42 There is NO WARRANTY, to the extent permitted by law.
44 Written by Jean-loup Gailly.'
46 usage="Usage: $0 [OPTION] FILE...
47 Rename each FILE with a compressed version of itself, renaming FILE to FILE~.
49 -d Decompress each FILE instead of compressing it.
50 --help display this help and exit
51 --version output version information and exit
53 Report bugs to <bug-gzip@gnu.org>."
56 PATH="${GZIP_BINDIR-'/bin'}:$PATH"
63 --h*) exec echo "$usage";;
64 --v*) exec echo "$version";;
70 if test $# -eq 0; then
71 echo >&2 "$0: missing operand
72 Try \`$0 --help' for more information."
78 test -n "$tmp" && rm -f "$tmp"
79 (exit $res); exit $res
89 if test ! -f "$file" || test ! -r "$file"; then
91 echo >&2 "$0: $i is not a readable regular file"
94 if test $decomp -eq 0; then
95 if sed -e 1d -e 2q "$file" | grep "^skip=[0-9][0-9]*$" >/dev/null; then
96 echo >&2 "$0: $i is already gzexe'd"
100 if test -u "$file"; then
101 echo >&2 "$0: $i has setuid permission, unchanged"
104 if test -g "$file"; then
105 echo >&2 "$0: $i has setgid permission, unchanged"
109 */basename | */bash | */cat | */chmod | */cp | \
110 */dirname | */echo | */expr | */gzip | \
111 */ln | */mkdir | */mktemp | */mv | */rm | \
112 */sed | */sh | */sleep | */test | */tail)
113 echo >&2 "$0: $i might depend on itself"; continue;;
116 dir=`dirname "$file"` || dir=$TMPDIR
117 test -d "$dir" && test -w "$dir" && test -x "$dir" || dir=/tmp
118 test -n "$tmp" && rm -f "$tmp"
119 if test -z "$mktemp_status"; then
120 type mktemp >/dev/null 2>&1
123 if test $mktemp_status -eq 0; then
124 tmp=`TMPDIR=$dir mktemp -t gzexeXXXXXX`
127 fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || {
129 echo >&2 "$0: cannot copy $file"
132 if test -w "$tmp"; then
136 chmod u+w "$tmp" || {
138 echo >&2 "$0: cannot chmod $tmp"
142 if test $decomp -eq 0; then
157 test -n "$gztmpdir" && rm -fr "$gztmpdir"
158 (exit $res); exit $res
161 if type mktemp >/dev/null 2>&1; then
162 gztmpdir=`mktemp -dt`
164 gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir
165 fi || { (exit 127); exit 127; }
170 ') mkdir -p "$gztmp" && rm -r "$gztmp";;
171 */*) gztmp=$gztmpdir/`basename "$0"`;;
172 esac || { (exit 127); exit 127; }
174 case `echo X | tail -n +1 2>/dev/null` in
178 if tail $tail_n +$skip <"$0" | gzip -cd > "$gztmp"; then
181 (sleep 5; rm -fr "$gztmpdir") 2>/dev/null &
182 "$gztmp" ${1+"$@"}; res=$?
184 echo >&2 "Cannot decompress $0"
188 gzip -cv9 "$file") > "$tmp" || {
190 echo >&2 "$0: compression not possible for $i, file unchanged."
197 skip_line=`sed -e 1d -e 2q "$file"`
199 skip=[0-9] | skip=[0-9][0-9] | skip=[0-9][0-9][0-9])
202 case `echo X | tail -n +1 2>/dev/null` in
206 tail $tail_n +$skip "$file" | gzip -cd > "$tmp" || {
208 echo >&2 "$0: $i probably not in gzexe format, file unchanged."
212 test $writable -eq 1 || chmod u-w "$tmp" || {
214 echo >&2 "$0: $tmp: cannot chmod"
217 ln -f "$file" "$file~" || {
219 echo >&2 "$0: cannot backup $i as $i~"
222 mv -f "$tmp" "$file" || {
224 echo >&2 "$0: cannot rename $tmp to $i"
229 (exit $res); exit $res