1 1.1 mrg #!/bin/sh - 2 1.1 mrg # 3 1.3 wiz # $NetBSD: gzexe,v 1.3 2004/05/01 08:22:41 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 # first section needs variable expansion, second not 31 1.1 mrg cat <<- EOF 32 1.1 mrg #!/bin/sh - 33 1.1 mrg $magic 34 1.1 mrg lines=$lines 35 1.1 mrg EOF 36 1.1 mrg cat <<- 'EOF' 37 1.1 mrg prog=`/usr/bin/basename "$0"` 38 1.1 mrg tmp=`/usr/bin/mktemp -d /tmp/gzexeXXXXXXXXXX` || { 39 1.1 mrg /bin/echo "$prog: cannot create tmp dir"; exit 1 40 1.1 mrg } 41 1.1 mrg trap '/bin/rm -rf "$tmp"' 0 42 1.1 mrg if /usr/bin/tail +$lines "$0" | 43 1.1 mrg /usr/bin/gzip -dc > "$tmp/$prog" 2> /dev/null; then 44 1.1 mrg /bin/chmod u+x "$tmp/$prog" 45 1.1 mrg "$tmp/$prog" ${1+"$@"} 46 1.1 mrg ret=$? 47 1.1 mrg else 48 1.1 mrg /bin/echo "$prog: cannot decompress $0" 49 1.1 mrg ret=1 50 1.1 mrg fi 51 1.1 mrg exit $ret 52 1.1 mrg EOF 53 1.1 mrg } 54 1.1 mrg 55 1.1 mrg # Test if a file is compressed by checking the magic line 56 1.1 mrg compressed () { 57 1.1 mrg test "X`sed -n 2p "$1" 2> /dev/null`" = "X$magic" 58 1.1 mrg } 59 1.1 mrg 60 1.1 mrg # Decompress a file 61 1.1 mrg decompress () { 62 1.1 mrg tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || { 63 1.1 mrg echo "$prog: cannot create tmp file" 64 1.1 mrg return 1 65 1.1 mrg } 66 1.1 mrg if ! cp "$1" "$tmp"; then 67 1.1 mrg echo "$prog: cannot copy $1 to $tmp" 68 1.1 mrg rm -f "$tmp" 69 1.1 mrg return 1 70 1.1 mrg fi 71 1.1 mrg if ! tail +$lines "$tmp" | gzip -vdc > "$1"; then 72 1.1 mrg echo "$prog: cannot decompress $1" 73 1.1 mrg cp "$tmp" "$1" 74 1.1 mrg rm -f "$tmp" 75 1.1 mrg return 1 76 1.1 mrg fi 77 1.1 mrg } 78 1.1 mrg 79 1.1 mrg # Perform some sanity checks on the file 80 1.1 mrg check () { 81 1.1 mrg if test ! -e "$1"; then 82 1.1 mrg echo "$prog: cannot compress non-existing file $1" 83 1.1 mrg return 1 84 1.1 mrg fi 85 1.1 mrg 86 1.1 mrg if test ! -f "$1"; then 87 1.1 mrg echo "$prog: cannot compress non-regular file $1" 88 1.1 mrg return 1 89 1.1 mrg fi 90 1.1 mrg 91 1.1 mrg case `basename "$1"` in 92 1.1 mrg sh | mktemp | rm | echo | tail | gzip | chmod) 93 1.1 mrg echo "$prog: cannot compress $1, I depend on it" 94 1.1 mrg return 1 95 1.1 mrg esac 96 1.1 mrg 97 1.1 mrg if test ! -x "$1"; then 98 1.1 mrg echo "$prog: cannot compress $1, it is not executable" 99 1.1 mrg return 1 100 1.1 mrg fi 101 1.1 mrg 102 1.1 mrg if test -u "$1" -o -g "$1"; then 103 1.1 mrg echo "$prog: cannot compress $1, it has an s bit set" 104 1.1 mrg return 1 105 1.1 mrg fi 106 1.1 mrg } 107 1.1 mrg 108 1.1 mrg # Compress a file 109 1.1 mrg compress () { 110 1.1 mrg tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || { 111 1.1 mrg echo "$prog: cannot create tmp file" 112 1.1 mrg return 1 113 1.1 mrg } 114 1.1 mrg if ! cp "$1" "$tmp"; then 115 1.1 mrg echo "$prog: cannot copy $1 to $tmp" 116 1.1 mrg rm -f "$tmp" 117 1.1 mrg return 1 118 1.1 mrg fi 119 1.1 mrg if ! cp "$1" "$1"~; then 120 1.1 mrg echo "$prog: cannot create backup copy $1~" 121 1.1 mrg rm -f "$1"~ "$tmp" 122 1.1 mrg return 1 123 1.1 mrg fi 124 1.1 mrg 125 1.1 mrg # Use cp to overwrite the existing file preserving mode and owner 126 1.1 mrg # if possible. If the file is not writable, this will produce an 127 1.1 mrg # error. 128 1.1 mrg 129 1.1 mrg if header "$1" > "$tmp" && gzip -vc "$1" >> "$tmp"; then 130 1.1 mrg if ! cp "$tmp" "$1"; then 131 1.1 mrg echo "$prog: cannot copy $tmp to $1" 132 1.1 mrg rm -f "$tmp" 133 1.1 mrg return 1 134 1.1 mrg fi 135 1.1 mrg else 136 1.1 mrg echo "$prog: cannot compress $1" 137 1.1 mrg rm -f "$1"~ "$tmp" 138 1.1 mrg return 1 139 1.1 mrg fi 140 1.1 mrg } 141 1.1 mrg 142 1.1 mrg # Is the -d flag specified? 143 1.1 mrg dflag= 144 1.1 mrg 145 1.1 mrg # Return value 146 1.1 mrg rc=0 147 1.1 mrg 148 1.1 mrg if test "X$1" = X-d; then 149 1.1 mrg dflag=1 150 1.1 mrg shift 151 1.1 mrg fi 152 1.1 mrg 153 1.1 mrg prog=`basename "$0"` 154 1.1 mrg USAGE="usage: $prog [-d] file ..." 155 1.1 mrg if test $# -eq 0; then 156 1.1 mrg echo $USAGE 157 1.1 mrg exit 1 158 1.1 mrg fi 159 1.1 mrg 160 1.1 mrg while test $# -ne 0; do 161 1.1 mrg if test $dflag; then 162 1.1 mrg if ! compressed "$1"; then 163 1.1 mrg echo "$prog: $1 is not compressed" 164 1.1 mrg rc=1; 165 1.1 mrg elif ! decompress "$1"; then 166 1.1 mrg rc=$? 167 1.1 mrg fi 168 1.1 mrg else 169 1.1 mrg if compressed "$1"; then 170 1.1 mrg echo "$prog: $1 is already compressed" 171 1.1 mrg rc=1; 172 1.1 mrg elif ! check "$1" || ! compress "$1"; then 173 1.1 mrg rc=$? 174 1.1 mrg fi 175 1.1 mrg fi 176 1.1 mrg shift 177 1.1 mrg done 178 1.1 mrg exit $rc 179