source: Daodan/MinGW/msys/1.0/bin/gzexe@ 1109

Last change on this file since 1109 was 1046, checked in by alloc, 8 years ago

Daodan: Added Windows MinGW and build batch file

File size: 5.7 KB
Line 
1#!/bin/sh
2# gzexe: compressor for Unix executables.
3# Use this only for binaries that you do not use frequently.
4#
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.
10
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
14
15
16# Copyright (C) 1998, 2002, 2004, 2006, 2007 Free Software Foundation
17# Copyright (C) 1993 Jean-loup Gailly
18
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.
23
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.
28
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.
32
33tab=' '
34nl='
35'
36IFS=" $tab$nl"
37
38version='gzexe (gzip) 1.3.12
39Copyright (C) 2007 Free Software Foundation, Inc.
40This is free software. You may redistribute copies of it under the terms of
41the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
42There is NO WARRANTY, to the extent permitted by law.
43
44Written by Jean-loup Gailly.'
45
46usage="Usage: $0 [OPTION] FILE...
47Rename each FILE with a compressed version of itself, renaming FILE to FILE~.
48
49 -d Decompress each FILE instead of compressing it.
50 --help display this help and exit
51 --version output version information and exit
52
53Report bugs to <bug-gzip@gnu.org>."
54
55
56PATH="${GZIP_BINDIR-'/usr/bin'}:$PATH"
57
58decomp=0
59res=0
60while :; do
61 case $1 in
62 -d) decomp=1; shift;;
63 --h*) exec echo "$usage";;
64 --v*) exec echo "$version";;
65 --) shift; break;;
66 *) break;;
67 esac
68done
69
70if test $# -eq 0; then
71 echo >&2 "$0: missing operand
72Try \`$0 --help' for more information."
73 exit 1
74fi
75
76tmp=
77trap 'res=$?
78 test -n "$tmp" && rm -f "$tmp"
79 (exit $res); exit $res
80' 0 1 2 3 5 10 13 15
81
82mktemp_status=
83
84for i do
85 case $i in
86 -*) file=./$i;;
87 *) file=$i;;
88 esac
89 if test ! -f "$file" || test ! -r "$file"; then
90 res=$?
91 echo >&2 "$0: $i is not a readable regular file"
92 continue
93 fi
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"
97 continue
98 fi
99 fi
100 if test -u "$file"; then
101 echo >&2 "$0: $i has setuid permission, unchanged"
102 continue
103 fi
104 if test -g "$file"; then
105 echo >&2 "$0: $i has setgid permission, unchanged"
106 continue
107 fi
108 case /$file in
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;;
114 esac
115
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
121 mktemp_status=$?
122 fi
123 if test $mktemp_status -eq 0; then
124 tmp=`TMPDIR=$dir mktemp -t gzexeXXXXXX`
125 else
126 tmp=$dir/gzexe$$
127 fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || {
128 res=$?
129 echo >&2 "$0: cannot copy $file"
130 continue
131 }
132 if test -w "$tmp"; then
133 writable=1
134 else
135 writable=0
136 chmod u+w "$tmp" || {
137 res=$?
138 echo >&2 "$0: cannot chmod $tmp"
139 continue
140 }
141 fi
142 if test $decomp -eq 0; then
143 (cat <<'EOF' &&
144#!/bin/sh
145skip=44
146
147tab=' '
148nl='
149'
150IFS=" $tab$nl"
151
152umask=`umask`
153umask 77
154
155gztmpdir=
156trap 'res=$?
157 test -n "$gztmpdir" && rm -fr "$gztmpdir"
158 (exit $res); exit $res
159' 0 1 2 3 5 10 13 15
160
161if type mktemp >/dev/null 2>&1; then
162 gztmpdir=`mktemp -dt`
163else
164 gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir
165fi || { (exit 127); exit 127; }
166
167gztmp=$gztmpdir/$0
168case $0 in
169-* | */*'
170') mkdir -p "$gztmp" && rm -r "$gztmp";;
171*/*) gztmp=$gztmpdir/`basename "$0"`;;
172esac || { (exit 127); exit 127; }
173
174case `echo X | tail -n +1 2>/dev/null` in
175X) tail_n=-n;;
176*) tail_n=;;
177esac
178if tail $tail_n +$skip <"$0" | gzip -cd > "$gztmp"; then
179 umask $umask
180 chmod 700 "$gztmp"
181 (sleep 5; rm -fr "$gztmpdir") 2>/dev/null &
182 "$gztmp" ${1+"$@"}; res=$?
183else
184 echo >&2 "Cannot decompress $0"
185 (exit 127); res=127
186fi; exit $res
187EOF
188 gzip -cv9 "$file") > "$tmp" || {
189 res=$?
190 echo >&2 "$0: compression not possible for $i, file unchanged."
191 continue
192 }
193
194 else
195 # decompression
196 skip=44
197 skip_line=`sed -e 1d -e 2q "$file"`
198 case $skip_line in
199 skip=[0-9] | skip=[0-9][0-9] | skip=[0-9][0-9][0-9])
200 eval "$skip_line";;
201 esac
202 case `echo X | tail -n +1 2>/dev/null` in
203 X) tail_n=-n;;
204 *) tail_n=;;
205 esac
206 tail $tail_n +$skip "$file" | gzip -cd > "$tmp" || {
207 res=$?
208 echo >&2 "$0: $i probably not in gzexe format, file unchanged."
209 continue
210 }
211 fi
212 test $writable -eq 1 || chmod u-w "$tmp" || {
213 res=$?
214 echo >&2 "$0: $tmp: cannot chmod"
215 continue
216 }
217 ln -f "$file" "$file~" || {
218 res=$?
219 echo >&2 "$0: cannot backup $i as $i~"
220 continue
221 }
222 mv -f "$tmp" "$file" || {
223 res=$?
224 echo >&2 "$0: cannot rename $tmp to $i"
225 continue
226 }
227 tmp=
228done
229(exit $res); exit $res
Note: See TracBrowser for help on using the repository browser.