Home | History | Annotate | Line # | Download | only in gzip
znew revision 1.2.6.1
      1      1.1  mrg #!/bin/ksh -
      2      1.1  mrg #
      3  1.2.6.1  jdc # $NetBSD: znew,v 1.2.6.1 2008/05/08 11:49:00 jdc 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.6.1  jdc 	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