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/sh
12 # The : is required for some old versions of csh.
13 # On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5
16 # Copyright (C) 1998, 2002, 2004, 2006 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) @VERSION@
39 Copyright (C) 2006 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: gzexe [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>.'
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
87 if test ! -f "$file" || test ! -r "$file"; then
89 echo >&2 "$0: $i is not a readable regular file"
92 if test $decomp -eq 0; then
93 if sed -e 1d -e 2q "$file" | grep "^skip=[0-9][0-9]*$" >/dev/null; then
94 echo >&2 "$0: $i is already gzexe'd"
98 if test -u "$file"; then
99 echo >&2 "$0: $i has setuid permission, unchanged"
102 if test -g "$file"; then
103 echo >&2 "$0: $i has setgid permission, unchanged"
107 */basename | */cat | */chmod | */cp | \
108 */dirname | */echo | */expr | */gzip | \
109 */ln | */mkdir | */mktemp | */mv | */rm | */rmdir | \
110 */sed | */sh | */sleep | */test | */tail)
111 echo >&2 "$0: $i would depend on itself"; continue;;
114 dir=`dirname "$file"` || dir=$TMPDIR
115 test -d "$dir" && test -w "$dir" && test -x "$dir" || dir=/tmp
116 test -n "$tmp" && rm -f "$tmp"
117 tmp=`TMPDIR=$dir mktemp -t gzexeXXXXXX` || tmp=$dir/gzexe$$
118 cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp" || {
120 echo >&2 "$0: cannot copy $file"
123 if test -w "$tmp"; then
127 chmod u+w "$tmp" || {
129 echo >&2 "$0: cannot chmod $tmp"
133 if test $decomp -eq 0; then
148 test -n "$gztmpdir" && rm -fr "$gztmpdir"
149 (exit $res); exit $res
152 gztmpdir=`(mktemp -dt) 2>/dev/null` ||
153 { gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir; } ||
154 { (exit 127); exit 127; }
159 ') mkdir -p "$gztmp" && rmdir "$gztmp";;
160 */*) gztmp=$gztmpdir/`basename "$0"`;;
161 esac || { (exit 127); exit 127; }
163 case `echo X | tail -n +1 2>/dev/null` in
167 if tail $tail_n +$skip <"$0" | gzip -cd > "$gztmp"; then
170 (sleep 5; rm -fr "$gztmpdir") 2>/dev/null &
171 "$gztmp" ${1+"$@"}; res=$?
173 echo >&2 "Cannot decompress $0"
177 gzip -cv9 "$file") > "$tmp" || {
179 echo >&2 "$0: compression not possible for $i, file unchanged."
186 skip_line=`sed -e 1d -e 2q "$file"`
188 skip=[0-9] | skip=[0-9][0-9] | skip=[0-9][0-9][0-9])
191 case `echo X | tail -n +1 2>/dev/null` in
195 tail $tail_n +$skip "$file" | gzip -cd > "$tmp" || {
197 echo >&2 "$0: $i probably not in gzexe format, file unchanged."
201 test $writable -eq 1 || chmod u-w "$tmp" || {
203 echo >&2 "$0: $tmp: cannot chmod"
206 ln -f "$file" "$file~" || {
208 echo >&2 "$0: cannot backup $i as $i~"
211 mv -f "$tmp" "$file" || {
213 echo >&2 "$0: cannot rename $tmp to $i"
218 (exit $res); exit $res