15ddb4360Smrg#!/bin/sh - 25ddb4360Smrg# 3*af350435Swiz# $NetBSD: gzexe,v 1.3 2004/05/01 08:22:41 wiz Exp $ 43a92ef57Swiz# 55ddb4360Smrg# $OpenBSD: gzexe,v 1.3 2003/08/05 18:22:17 deraadt Exp $ 65ddb4360Smrg# 75ddb4360Smrg# Copyright (c) 2003 Otto Moerbeek <otto@drijf.net> 85ddb4360Smrg# 95ddb4360Smrg# Permission to use, copy, modify, and distribute this software for any 105ddb4360Smrg# purpose with or without fee is hereby granted, provided that the above 115ddb4360Smrg# copyright notice and this permission notice appear in all copies. 125ddb4360Smrg# 135ddb4360Smrg# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 145ddb4360Smrg# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 155ddb4360Smrg# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 165ddb4360Smrg# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 175ddb4360Smrg# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 185ddb4360Smrg# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 195ddb4360Smrg# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 205ddb4360Smrg# 215ddb4360Smrg 225ddb4360Smrg# The number of lines plus one in the on-the-fly decompression script 235ddb4360Smrglines=19 245ddb4360Smrg 255ddb4360Smrg# A simple string to recognize already compressed files 265ddb4360Smrgmagic="# compressed by gzexe" 275ddb4360Smrg 285ddb4360Smrg# Write the decompression script to stdout 295ddb4360Smrgheader () { 305ddb4360Smrg # first section needs variable expansion, second not 315ddb4360Smrg cat <<- EOF 325ddb4360Smrg #!/bin/sh - 335ddb4360Smrg $magic 345ddb4360Smrg lines=$lines 355ddb4360Smrg EOF 365ddb4360Smrg cat <<- 'EOF' 375ddb4360Smrg prog=`/usr/bin/basename "$0"` 385ddb4360Smrg tmp=`/usr/bin/mktemp -d /tmp/gzexeXXXXXXXXXX` || { 395ddb4360Smrg /bin/echo "$prog: cannot create tmp dir"; exit 1 405ddb4360Smrg } 415ddb4360Smrg trap '/bin/rm -rf "$tmp"' 0 425ddb4360Smrg if /usr/bin/tail +$lines "$0" | 435ddb4360Smrg /usr/bin/gzip -dc > "$tmp/$prog" 2> /dev/null; then 445ddb4360Smrg /bin/chmod u+x "$tmp/$prog" 455ddb4360Smrg "$tmp/$prog" ${1+"$@"} 465ddb4360Smrg ret=$? 475ddb4360Smrg else 485ddb4360Smrg /bin/echo "$prog: cannot decompress $0" 495ddb4360Smrg ret=1 505ddb4360Smrg fi 515ddb4360Smrg exit $ret 525ddb4360Smrg EOF 535ddb4360Smrg} 545ddb4360Smrg 555ddb4360Smrg# Test if a file is compressed by checking the magic line 565ddb4360Smrgcompressed () { 575ddb4360Smrg test "X`sed -n 2p "$1" 2> /dev/null`" = "X$magic" 585ddb4360Smrg} 595ddb4360Smrg 605ddb4360Smrg# Decompress a file 615ddb4360Smrgdecompress () { 625ddb4360Smrg tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || { 635ddb4360Smrg echo "$prog: cannot create tmp file" 645ddb4360Smrg return 1 655ddb4360Smrg } 665ddb4360Smrg if ! cp "$1" "$tmp"; then 675ddb4360Smrg echo "$prog: cannot copy $1 to $tmp" 685ddb4360Smrg rm -f "$tmp" 695ddb4360Smrg return 1 705ddb4360Smrg fi 715ddb4360Smrg if ! tail +$lines "$tmp" | gzip -vdc > "$1"; then 725ddb4360Smrg echo "$prog: cannot decompress $1" 735ddb4360Smrg cp "$tmp" "$1" 745ddb4360Smrg rm -f "$tmp" 755ddb4360Smrg return 1 765ddb4360Smrg fi 775ddb4360Smrg} 785ddb4360Smrg 795ddb4360Smrg# Perform some sanity checks on the file 805ddb4360Smrgcheck () { 815ddb4360Smrg if test ! -e "$1"; then 825ddb4360Smrg echo "$prog: cannot compress non-existing file $1" 835ddb4360Smrg return 1 845ddb4360Smrg fi 855ddb4360Smrg 865ddb4360Smrg if test ! -f "$1"; then 875ddb4360Smrg echo "$prog: cannot compress non-regular file $1" 885ddb4360Smrg return 1 895ddb4360Smrg fi 905ddb4360Smrg 915ddb4360Smrg case `basename "$1"` in 925ddb4360Smrg sh | mktemp | rm | echo | tail | gzip | chmod) 935ddb4360Smrg echo "$prog: cannot compress $1, I depend on it" 945ddb4360Smrg return 1 955ddb4360Smrg esac 965ddb4360Smrg 975ddb4360Smrg if test ! -x "$1"; then 985ddb4360Smrg echo "$prog: cannot compress $1, it is not executable" 995ddb4360Smrg return 1 1005ddb4360Smrg fi 1015ddb4360Smrg 1025ddb4360Smrg if test -u "$1" -o -g "$1"; then 1035ddb4360Smrg echo "$prog: cannot compress $1, it has an s bit set" 1045ddb4360Smrg return 1 1055ddb4360Smrg fi 1065ddb4360Smrg} 1075ddb4360Smrg 1085ddb4360Smrg# Compress a file 1095ddb4360Smrgcompress () { 1105ddb4360Smrg tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || { 1115ddb4360Smrg echo "$prog: cannot create tmp file" 1125ddb4360Smrg return 1 1135ddb4360Smrg } 1145ddb4360Smrg if ! cp "$1" "$tmp"; then 1155ddb4360Smrg echo "$prog: cannot copy $1 to $tmp" 1165ddb4360Smrg rm -f "$tmp" 1175ddb4360Smrg return 1 1185ddb4360Smrg fi 1195ddb4360Smrg if ! cp "$1" "$1"~; then 1205ddb4360Smrg echo "$prog: cannot create backup copy $1~" 1215ddb4360Smrg rm -f "$1"~ "$tmp" 1225ddb4360Smrg return 1 1235ddb4360Smrg fi 1245ddb4360Smrg 1255ddb4360Smrg # Use cp to overwrite the existing file preserving mode and owner 1265ddb4360Smrg # if possible. If the file is not writable, this will produce an 1275ddb4360Smrg # error. 1285ddb4360Smrg 1295ddb4360Smrg if header "$1" > "$tmp" && gzip -vc "$1" >> "$tmp"; then 1305ddb4360Smrg if ! cp "$tmp" "$1"; then 1315ddb4360Smrg echo "$prog: cannot copy $tmp to $1" 1325ddb4360Smrg rm -f "$tmp" 1335ddb4360Smrg return 1 1345ddb4360Smrg fi 1355ddb4360Smrg else 1365ddb4360Smrg echo "$prog: cannot compress $1" 1375ddb4360Smrg rm -f "$1"~ "$tmp" 1385ddb4360Smrg return 1 1395ddb4360Smrg fi 1405ddb4360Smrg} 1415ddb4360Smrg 1425ddb4360Smrg# Is the -d flag specified? 1435ddb4360Smrgdflag= 1445ddb4360Smrg 1455ddb4360Smrg# Return value 1465ddb4360Smrgrc=0 1475ddb4360Smrg 1485ddb4360Smrgif test "X$1" = X-d; then 1495ddb4360Smrg dflag=1 1505ddb4360Smrg shift 1515ddb4360Smrgfi 1525ddb4360Smrg 1535ddb4360Smrgprog=`basename "$0"` 1545ddb4360SmrgUSAGE="usage: $prog [-d] file ..." 1555ddb4360Smrgif test $# -eq 0; then 1565ddb4360Smrg echo $USAGE 1575ddb4360Smrg exit 1 1585ddb4360Smrgfi 1595ddb4360Smrg 1605ddb4360Smrgwhile test $# -ne 0; do 1615ddb4360Smrg if test $dflag; then 1625ddb4360Smrg if ! compressed "$1"; then 1635ddb4360Smrg echo "$prog: $1 is not compressed" 1645ddb4360Smrg rc=1; 1655ddb4360Smrg elif ! decompress "$1"; then 1665ddb4360Smrg rc=$? 1675ddb4360Smrg fi 1685ddb4360Smrg else 1695ddb4360Smrg if compressed "$1"; then 1705ddb4360Smrg echo "$prog: $1 is already compressed" 1715ddb4360Smrg rc=1; 1725ddb4360Smrg elif ! check "$1" || ! compress "$1"; then 1735ddb4360Smrg rc=$? 1745ddb4360Smrg fi 1755ddb4360Smrg fi 1765ddb4360Smrg shift 1775ddb4360Smrgdone 1785ddb4360Smrgexit $rc 179