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