xref: /netbsd-src/usr.bin/gzip/gzexe (revision af350435db773914540528e1b2b0598bd6dd3f55)
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