11.1Smrg#!/bin/ksh - 21.1Smrg# 31.3Snakayama# $NetBSD: znew,v 1.3 2008/04/27 09:07:13 nakayama Exp $ 41.2Swiz# 51.1Smrg# $OpenBSD: znew,v 1.2 2003/08/05 18:22:17 deraadt Exp $ 61.1Smrg# 71.1Smrg# Copyright (c) 2003 Otto Moerbeek <otto@drijf.net> 81.1Smrg# 91.1Smrg# Permission to use, copy, modify, and distribute this software for any 101.1Smrg# purpose with or without fee is hereby granted, provided that the above 111.1Smrg# copyright notice and this permission notice appear in all copies. 121.1Smrg# 131.1Smrg# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 141.1Smrg# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 151.1Smrg# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 161.1Smrg# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 171.1Smrg# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 181.1Smrg# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 191.1Smrg# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 201.1Smrg# 211.1Smrg 221.1Smrg# Return 0 if the first arg file size is smaller than the second, 1 otherwise. 231.1Smrgsmaller () { 241.1Smrg a=`du -k "$1" | awk '{ print $1 }'` 251.1Smrg b=`du -k "$2" | awk '{ print $1 }'` 261.1Smrg test $a -lt $b 271.1Smrg} 281.1Smrg 291.1Smrg# Check gzip integrity if the -t flag is specified 301.1Smrgcheckfile () { 311.1Smrg if test $tflag -eq 1; then 321.1Smrg gzip -qt < "$1" 331.1Smrg fi 341.1Smrg} 351.1Smrg 361.1Smrg# Decompress a file and then gzip it 371.1Smrgprocess () { 381.1Smrg prefix="${1%.Z}" 391.1Smrg filez="$prefix".Z 401.1Smrg filegz="$prefix".gz 411.1Smrg 421.1Smrg if test ! -e "$filez"; then 431.1Smrg echo "$prog: $filez does not exist" 441.1Smrg return 1 451.1Smrg fi 461.1Smrg if test ! -f "$filez"; then 471.1Smrg echo "$prog: $filez is not a regular file" 481.1Smrg return 1 491.1Smrg fi 501.1Smrg if test -e "$filegz" -a $fflag -eq 0; then 511.1Smrg echo "$prog: $filegz already exists" 521.1Smrg return 1 531.1Smrg fi 541.1Smrg 551.1Smrg tmp=`mktemp /tmp/znewXXXXXXXXXX` || { 561.1Smrg echo "$prog: cannot create tmp file" 571.1Smrg return 1 581.1Smrg } 591.1Smrg trap 'rm -f "$tmp"; exit 1' HUP INT QUIT PIPE TERM 601.1Smrg 611.1Smrg # Do the actual work, producing a file "$tmp" 621.3Snakayama if uncompress -f -c < "$filez" | gzip -f $gzipflags > "$tmp"; then 631.1Smrg 641.1Smrg if test $kflag -eq 1 && smaller "$filez" "$tmp"; then 651.1Smrg echo -n "$prog: $filez is smaller than $filegz" 661.1Smrg echo "; keeping it" 671.1Smrg rm -f "$tmp" 681.1Smrg return 0 691.1Smrg fi 701.1Smrg if ! checkfile "$tmp"; then 711.1Smrg echo "$prog: integrity check of $tmp failed" 721.1Smrg rm -f "$tmp" 731.1Smrg return 1; 741.1Smrg fi 751.1Smrg 761.1Smrg # Try to keep the mode of the original file 771.1Smrg if ! cp -fp "$filez" "$filegz"; then 781.1Smrg echo "$prog: warning: could not keep mode of $filez" 791.1Smrg fi 801.1Smrg if ! cp "$tmp" "$filegz" 2> /dev/null; then 811.1Smrg echo "$prog: warning: could not keep mode of $filez" 821.1Smrg if ! cp -f "$tmp" "$filegz" 2> /dev/null; then 831.1Smrg echo "$prog: could not copy $tmp to $filegz" 841.1Smrg rm -f "$filegz" "$tmp" 851.1Smrg return 1 861.1Smrg fi 871.1Smrg fi 881.1Smrg if ! touch -fr "$filez" "$filegz"; then 891.1Smrg echo -n "$prog: warning: could not keep timestamp of " 901.1Smrg echo "$filez" 911.1Smrg fi 921.1Smrg rm -f "$filez" "$tmp" 931.1Smrg else 941.1Smrg echo "$prog: failed to process $filez" 951.1Smrg rm -f "$tmp" 961.1Smrg return 1 971.1Smrg fi 981.1Smrg} 991.1Smrg 1001.1Smrgprog=`basename "$0"` 1011.1Smrgusage="usage: $prog [-ftv9K] file ..." 1021.1Smrg 1031.1Smrgfflag=0 1041.1Smrgtflag=0 1051.1Smrgkflag=0 1061.1Smrggzipflags= 1071.1Smrg 1081.1Smrg# -P flag is recognized to maintain compatibility, but ignored. Pipe mode is 1091.1Smrg# always used 1101.1Smrgwhile getopts :ftv9PK i; do 1111.1Smrg case $i in 1121.1Smrg f) fflag=1;; 1131.1Smrg t) tflag=1;; 1141.1Smrg v) gzipflags="-v $gzipflags";; 1151.1Smrg 9) gzipflags="-9 $gzipflags";; 1161.1Smrg P) ;; 1171.1Smrg K) kflag=1;; 1181.1Smrg \?) echo "$usage"; exit 1;; 1191.1Smrg esac 1201.1Smrgdone 1211.1Smrg 1221.1Smrgshift OPTIND-1 1231.1Smrg 1241.1Smrgif test $# -eq 0; then 1251.1Smrg echo "$usage" 1261.1Smrg exit 1 1271.1Smrgfi 1281.1Smrg 1291.1Smrgrc=0 1301.1Smrg 1311.1Smrgwhile test $# -ne 0; do 1321.1Smrg if ! process "$1"; then 1331.1Smrg rc=$? 1341.1Smrg fi 1351.1Smrg shift 1361.1Smrgdone 1371.1Smrgexit $rc 138