gzexe revision 1.2 1 1.1 mrg #!/bin/sh -
2 1.1 mrg #
3 1.2 wiz # $NetBSD: gzexe,v 1.2 2003/12/28 12:43:43 wiz Exp $
4 1.2 wiz #
5 1.1 mrg # $OpenBSD: gzexe,v 1.3 2003/08/05 18:22:17 deraadt Exp $
6 1.1 mrg #
7 1.1 mrg # Copyright (c) 2003 Otto Moerbeek <otto (at] drijf.net>
8 1.1 mrg #
9 1.1 mrg # Permission to use, copy, modify, and distribute this software for any
10 1.1 mrg # purpose with or without fee is hereby granted, provided that the above
11 1.1 mrg # copyright notice and this permission notice appear in all copies.
12 1.1 mrg #
13 1.1 mrg # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14 1.1 mrg # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15 1.1 mrg # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16 1.1 mrg # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17 1.1 mrg # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18 1.1 mrg # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19 1.1 mrg # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 1.1 mrg #
21 1.1 mrg
22 1.1 mrg # The number of lines plus one in the on-the-fly decompression script
23 1.1 mrg lines=19
24 1.1 mrg
25 1.1 mrg # A simple string to recognize already compressed files
26 1.1 mrg magic="# compressed by gzexe"
27 1.1 mrg
28 1.1 mrg # Write the decompression script to stdout
29 1.1 mrg header () {
30 1.1 mrg typeset prog tmp
31 1.1 mrg # first section needs variable expansion, second not
32 1.1 mrg cat <<- EOF
33 1.1 mrg #!/bin/sh -
34 1.1 mrg $magic
35 1.1 mrg lines=$lines
36 1.1 mrg EOF
37 1.1 mrg cat <<- 'EOF'
38 1.1 mrg prog=`/usr/bin/basename "$0"`
39 1.1 mrg tmp=`/usr/bin/mktemp -d /tmp/gzexeXXXXXXXXXX` || {
40 1.1 mrg /bin/echo "$prog: cannot create tmp dir"; exit 1
41 1.1 mrg }
42 1.1 mrg trap '/bin/rm -rf "$tmp"' 0
43 1.1 mrg if /usr/bin/tail +$lines "$0" |
44 1.1 mrg /usr/bin/gzip -dc > "$tmp/$prog" 2> /dev/null; then
45 1.1 mrg /bin/chmod u+x "$tmp/$prog"
46 1.1 mrg "$tmp/$prog" ${1+"$@"}
47 1.1 mrg ret=$?
48 1.1 mrg else
49 1.1 mrg /bin/echo "$prog: cannot decompress $0"
50 1.1 mrg ret=1
51 1.1 mrg fi
52 1.1 mrg exit $ret
53 1.1 mrg EOF
54 1.1 mrg }
55 1.1 mrg
56 1.1 mrg # Test if a file is compressed by checking the magic line
57 1.1 mrg compressed () {
58 1.1 mrg test "X`sed -n 2p "$1" 2> /dev/null`" = "X$magic"
59 1.1 mrg }
60 1.1 mrg
61 1.1 mrg # Decompress a file
62 1.1 mrg decompress () {
63 1.1 mrg tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || {
64 1.1 mrg echo "$prog: cannot create tmp file"
65 1.1 mrg return 1
66 1.1 mrg }
67 1.1 mrg if ! cp "$1" "$tmp"; then
68 1.1 mrg echo "$prog: cannot copy $1 to $tmp"
69 1.1 mrg rm -f "$tmp"
70 1.1 mrg return 1
71 1.1 mrg fi
72 1.1 mrg if ! tail +$lines "$tmp" | gzip -vdc > "$1"; then
73 1.1 mrg echo "$prog: cannot decompress $1"
74 1.1 mrg cp "$tmp" "$1"
75 1.1 mrg rm -f "$tmp"
76 1.1 mrg return 1
77 1.1 mrg fi
78 1.1 mrg }
79 1.1 mrg
80 1.1 mrg # Perform some sanity checks on the file
81 1.1 mrg check () {
82 1.1 mrg if test ! -e "$1"; then
83 1.1 mrg echo "$prog: cannot compress non-existing file $1"
84 1.1 mrg return 1
85 1.1 mrg fi
86 1.1 mrg
87 1.1 mrg if test ! -f "$1"; then
88 1.1 mrg echo "$prog: cannot compress non-regular file $1"
89 1.1 mrg return 1
90 1.1 mrg fi
91 1.1 mrg
92 1.1 mrg case `basename "$1"` in
93 1.1 mrg sh | mktemp | rm | echo | tail | gzip | chmod)
94 1.1 mrg echo "$prog: cannot compress $1, I depend on it"
95 1.1 mrg return 1
96 1.1 mrg esac
97 1.1 mrg
98 1.1 mrg if test ! -x "$1"; then
99 1.1 mrg echo "$prog: cannot compress $1, it is not executable"
100 1.1 mrg return 1
101 1.1 mrg fi
102 1.1 mrg
103 1.1 mrg if test -u "$1" -o -g "$1"; then
104 1.1 mrg echo "$prog: cannot compress $1, it has an s bit set"
105 1.1 mrg return 1
106 1.1 mrg fi
107 1.1 mrg }
108 1.1 mrg
109 1.1 mrg # Compress a file
110 1.1 mrg compress () {
111 1.1 mrg tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || {
112 1.1 mrg echo "$prog: cannot create tmp file"
113 1.1 mrg return 1
114 1.1 mrg }
115 1.1 mrg if ! cp "$1" "$tmp"; then
116 1.1 mrg echo "$prog: cannot copy $1 to $tmp"
117 1.1 mrg rm -f "$tmp"
118 1.1 mrg return 1
119 1.1 mrg fi
120 1.1 mrg if ! cp "$1" "$1"~; then
121 1.1 mrg echo "$prog: cannot create backup copy $1~"
122 1.1 mrg rm -f "$1"~ "$tmp"
123 1.1 mrg return 1
124 1.1 mrg fi
125 1.1 mrg
126 1.1 mrg # Use cp to overwrite the existing file preserving mode and owner
127 1.1 mrg # if possible. If the file is not writable, this will produce an
128 1.1 mrg # error.
129 1.1 mrg
130 1.1 mrg if header "$1" > "$tmp" && gzip -vc "$1" >> "$tmp"; then
131 1.1 mrg if ! cp "$tmp" "$1"; then
132 1.1 mrg echo "$prog: cannot copy $tmp to $1"
133 1.1 mrg rm -f "$tmp"
134 1.1 mrg return 1
135 1.1 mrg fi
136 1.1 mrg else
137 1.1 mrg echo "$prog: cannot compress $1"
138 1.1 mrg rm -f "$1"~ "$tmp"
139 1.1 mrg return 1
140 1.1 mrg fi
141 1.1 mrg }
142 1.1 mrg
143 1.1 mrg # Is the -d flag specified?
144 1.1 mrg dflag=
145 1.1 mrg
146 1.1 mrg # Return value
147 1.1 mrg rc=0
148 1.1 mrg
149 1.1 mrg if test "X$1" = X-d; then
150 1.1 mrg dflag=1
151 1.1 mrg shift
152 1.1 mrg fi
153 1.1 mrg
154 1.1 mrg prog=`basename "$0"`
155 1.1 mrg USAGE="usage: $prog [-d] file ..."
156 1.1 mrg if test $# -eq 0; then
157 1.1 mrg echo $USAGE
158 1.1 mrg exit 1
159 1.1 mrg fi
160 1.1 mrg
161 1.1 mrg while test $# -ne 0; do
162 1.1 mrg if test $dflag; then
163 1.1 mrg if ! compressed "$1"; then
164 1.1 mrg echo "$prog: $1 is not compressed"
165 1.1 mrg rc=1;
166 1.1 mrg elif ! decompress "$1"; then
167 1.1 mrg rc=$?
168 1.1 mrg fi
169 1.1 mrg else
170 1.1 mrg if compressed "$1"; then
171 1.1 mrg echo "$prog: $1 is already compressed"
172 1.1 mrg rc=1;
173 1.1 mrg elif ! check "$1" || ! compress "$1"; then
174 1.1 mrg rc=$?
175 1.1 mrg fi
176 1.1 mrg fi
177 1.1 mrg shift
178 1.1 mrg done
179 1.1 mrg exit $rc
180