Home | History | Annotate | Line # | Download | only in gzip
znew revision 1.2
      1  1.1  mrg #!/bin/ksh -
      2  1.1  mrg #
      3  1.2  wiz # $NetBSD: znew,v 1.2 2003/12/28 12:43:43 wiz Exp $
      4  1.2  wiz #
      5  1.1  mrg # $OpenBSD: znew,v 1.2 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 # Return 0 if the first arg file size is smaller than the second, 1 otherwise.
     23  1.1  mrg smaller () {
     24  1.1  mrg 	a=`du -k "$1" | awk '{ print $1 }'`
     25  1.1  mrg 	b=`du -k "$2" | awk '{ print $1 }'`
     26  1.1  mrg 	test $a -lt $b
     27  1.1  mrg }
     28  1.1  mrg 
     29  1.1  mrg # Check gzip integrity if the -t flag is specified
     30  1.1  mrg checkfile () {
     31  1.1  mrg 	if test $tflag -eq 1; then
     32  1.1  mrg 		gzip -qt < "$1"
     33  1.1  mrg 	fi
     34  1.1  mrg }
     35  1.1  mrg 
     36  1.1  mrg # Decompress a file and then gzip it
     37  1.1  mrg process () {
     38  1.1  mrg 	prefix="${1%.Z}"
     39  1.1  mrg 	filez="$prefix".Z
     40  1.1  mrg 	filegz="$prefix".gz
     41  1.1  mrg 
     42  1.1  mrg 	if test ! -e "$filez"; then
     43  1.1  mrg 		echo "$prog: $filez does not exist"
     44  1.1  mrg 		return 1
     45  1.1  mrg 	fi
     46  1.1  mrg 	if test ! -f "$filez"; then
     47  1.1  mrg 		echo "$prog: $filez is not a regular file"
     48  1.1  mrg 		return 1
     49  1.1  mrg 	fi
     50  1.1  mrg 	if test -e "$filegz" -a $fflag -eq 0; then
     51  1.1  mrg 		echo "$prog: $filegz already exists"
     52  1.1  mrg 		return 1
     53  1.1  mrg 	fi
     54  1.1  mrg 
     55  1.1  mrg 	tmp=`mktemp /tmp/znewXXXXXXXXXX` || {
     56  1.1  mrg 		echo "$prog: cannot create tmp file"
     57  1.1  mrg 		return 1
     58  1.1  mrg 	}
     59  1.1  mrg 	trap 'rm -f "$tmp"; exit 1' HUP INT QUIT PIPE TERM
     60  1.1  mrg 
     61  1.1  mrg 	# Do the actual work, producing a file "$tmp"
     62  1.1  mrg 	if uncompress -f -c < "$filez" | gzip -f $gzipflags -o "$tmp"; then
     63  1.1  mrg 
     64  1.1  mrg 		if test $kflag -eq 1 && smaller "$filez" "$tmp"; then
     65  1.1  mrg 			echo -n "$prog: $filez is smaller than $filegz"
     66  1.1  mrg 			echo "; keeping it"
     67  1.1  mrg 			rm -f "$tmp"
     68  1.1  mrg 			return 0
     69  1.1  mrg 		fi
     70  1.1  mrg 		if ! checkfile "$tmp"; then
     71  1.1  mrg 			echo "$prog: integrity check of $tmp failed"
     72  1.1  mrg 			rm -f "$tmp"
     73  1.1  mrg 			return 1;
     74  1.1  mrg 		fi
     75  1.1  mrg 
     76  1.1  mrg 		# Try to keep the mode of the original file
     77  1.1  mrg 		if ! cp -fp "$filez" "$filegz"; then
     78  1.1  mrg 			echo "$prog: warning: could not keep mode of $filez"
     79  1.1  mrg 		fi
     80  1.1  mrg 		if  ! cp "$tmp" "$filegz" 2> /dev/null; then
     81  1.1  mrg 			echo "$prog: warning: could not keep mode of $filez"
     82  1.1  mrg 			if ! cp -f "$tmp" "$filegz" 2> /dev/null; then
     83  1.1  mrg 				echo "$prog: could not copy $tmp to $filegz"
     84  1.1  mrg 				rm -f "$filegz" "$tmp"
     85  1.1  mrg 				return 1
     86  1.1  mrg 			fi
     87  1.1  mrg 		fi
     88  1.1  mrg 		if ! touch -fr "$filez" "$filegz"; then
     89  1.1  mrg 			echo -n "$prog: warning: could not keep timestamp of "
     90  1.1  mrg 			echo "$filez"
     91  1.1  mrg 		fi
     92  1.1  mrg 		rm -f "$filez" "$tmp"
     93  1.1  mrg 	else
     94  1.1  mrg 		echo "$prog: failed to process $filez"
     95  1.1  mrg 		rm -f "$tmp"
     96  1.1  mrg 		return 1
     97  1.1  mrg 	fi
     98  1.1  mrg }
     99  1.1  mrg 
    100  1.1  mrg prog=`basename "$0"`
    101  1.1  mrg usage="usage: $prog [-ftv9K] file ..."
    102  1.1  mrg 
    103  1.1  mrg fflag=0
    104  1.1  mrg tflag=0
    105  1.1  mrg kflag=0
    106  1.1  mrg gzipflags=
    107  1.1  mrg 
    108  1.1  mrg # -P flag is recognized to maintain compatibility, but ignored. Pipe mode is
    109  1.1  mrg # always used
    110  1.1  mrg while getopts :ftv9PK i; do
    111  1.1  mrg 	case $i in
    112  1.1  mrg 		f) fflag=1;;
    113  1.1  mrg 		t) tflag=1;;
    114  1.1  mrg 		v) gzipflags="-v $gzipflags";;
    115  1.1  mrg 		9) gzipflags="-9 $gzipflags";;
    116  1.1  mrg 		P) ;;
    117  1.1  mrg 		K) kflag=1;;
    118  1.1  mrg 		\?) echo "$usage"; exit 1;;
    119  1.1  mrg 	esac
    120  1.1  mrg done
    121  1.1  mrg 
    122  1.1  mrg shift OPTIND-1
    123  1.1  mrg 
    124  1.1  mrg if test $# -eq 0; then
    125  1.1  mrg 	echo "$usage"
    126  1.1  mrg 	exit 1
    127  1.1  mrg fi
    128  1.1  mrg 
    129  1.1  mrg rc=0
    130  1.1  mrg 
    131  1.1  mrg while test $# -ne 0; do
    132  1.1  mrg 	if ! process "$1"; then
    133  1.1  mrg 		rc=$?
    134  1.1  mrg 	fi
    135  1.1  mrg 	shift
    136  1.1  mrg done
    137  1.1  mrg exit $rc
    138