Tizen 2.0 Release
[pkgs/o/oma-ds-service.git] / bin / gzexe
1 #!/bin/bash
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/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
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
33 tab='   '
34 nl='
35 '
36 IFS=" $tab$nl"
37
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.
43
44 Written by Jean-loup Gailly.'
45
46 usage="Usage: $0 [OPTION] FILE...
47 Rename 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
53 Report bugs to <bug-gzip@gnu.org>."
54
55
56 PATH="${GZIP_BINDIR-'/bin'}:$PATH"
57
58 decomp=0
59 res=0
60 while :; 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
68 done
69
70 if test $# -eq 0; then
71   echo >&2 "$0: missing operand
72 Try \`$0 --help' for more information."
73   exit 1
74 fi
75
76 tmp=
77 trap 'res=$?
78   test -n "$tmp" && rm -f "$tmp"
79   (exit $res); exit $res
80 ' 0 1 2 3 5 10 13 15
81
82 mktemp_status=
83
84 for 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/bash
145 skip=44
146
147 tab='   '
148 nl='
149 '
150 IFS=" $tab$nl"
151
152 umask=`umask`
153 umask 77
154
155 gztmpdir=
156 trap 'res=$?
157   test -n "$gztmpdir" && rm -fr "$gztmpdir"
158   (exit $res); exit $res
159 ' 0 1 2 3 5 10 13 15
160
161 if type mktemp >/dev/null 2>&1; then
162   gztmpdir=`mktemp -dt`
163 else
164   gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir
165 fi || { (exit 127); exit 127; }
166
167 gztmp=$gztmpdir/$0
168 case $0 in
169 -* | */*'
170 ') mkdir -p "$gztmp" && rm -r "$gztmp";;
171 */*) gztmp=$gztmpdir/`basename "$0"`;;
172 esac || { (exit 127); exit 127; }
173
174 case `echo X | tail -n +1 2>/dev/null` in
175 X) tail_n=-n;;
176 *) tail_n=;;
177 esac
178 if 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=$?
183 else
184   echo >&2 "Cannot decompress $0"
185   (exit 127); res=127
186 fi; exit $res
187 EOF
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=
228 done
229 (exit $res); exit $res