Home | History | Annotate | Line # | Download | only in gzip
znew revision 1.2.20.1
      1       1.1    mrg #!/bin/ksh -
      2       1.1    mrg #
      3  1.2.20.1  skrll # $NetBSD: znew,v 1.2.20.1 2008/06/03 20:47:47 skrll 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.2.20.1  skrll 	if uncompress -f -c < "$filez" | gzip -f $gzipflags > "$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