15ddb4360Smrg#!/bin/ksh - 25ddb4360Smrg# 3*c9f8548dSnakayama# $NetBSD: znew,v 1.3 2008/04/27 09:07:13 nakayama Exp $ 43a92ef57Swiz# 55ddb4360Smrg# $OpenBSD: znew,v 1.2 2003/08/05 18:22:17 deraadt Exp $ 65ddb4360Smrg# 75ddb4360Smrg# Copyright (c) 2003 Otto Moerbeek <otto@drijf.net> 85ddb4360Smrg# 95ddb4360Smrg# Permission to use, copy, modify, and distribute this software for any 105ddb4360Smrg# purpose with or without fee is hereby granted, provided that the above 115ddb4360Smrg# copyright notice and this permission notice appear in all copies. 125ddb4360Smrg# 135ddb4360Smrg# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 145ddb4360Smrg# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 155ddb4360Smrg# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 165ddb4360Smrg# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 175ddb4360Smrg# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 185ddb4360Smrg# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 195ddb4360Smrg# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 205ddb4360Smrg# 215ddb4360Smrg 225ddb4360Smrg# Return 0 if the first arg file size is smaller than the second, 1 otherwise. 235ddb4360Smrgsmaller () { 245ddb4360Smrg a=`du -k "$1" | awk '{ print $1 }'` 255ddb4360Smrg b=`du -k "$2" | awk '{ print $1 }'` 265ddb4360Smrg test $a -lt $b 275ddb4360Smrg} 285ddb4360Smrg 295ddb4360Smrg# Check gzip integrity if the -t flag is specified 305ddb4360Smrgcheckfile () { 315ddb4360Smrg if test $tflag -eq 1; then 325ddb4360Smrg gzip -qt < "$1" 335ddb4360Smrg fi 345ddb4360Smrg} 355ddb4360Smrg 365ddb4360Smrg# Decompress a file and then gzip it 375ddb4360Smrgprocess () { 385ddb4360Smrg prefix="${1%.Z}" 395ddb4360Smrg filez="$prefix".Z 405ddb4360Smrg filegz="$prefix".gz 415ddb4360Smrg 425ddb4360Smrg if test ! -e "$filez"; then 435ddb4360Smrg echo "$prog: $filez does not exist" 445ddb4360Smrg return 1 455ddb4360Smrg fi 465ddb4360Smrg if test ! -f "$filez"; then 475ddb4360Smrg echo "$prog: $filez is not a regular file" 485ddb4360Smrg return 1 495ddb4360Smrg fi 505ddb4360Smrg if test -e "$filegz" -a $fflag -eq 0; then 515ddb4360Smrg echo "$prog: $filegz already exists" 525ddb4360Smrg return 1 535ddb4360Smrg fi 545ddb4360Smrg 555ddb4360Smrg tmp=`mktemp /tmp/znewXXXXXXXXXX` || { 565ddb4360Smrg echo "$prog: cannot create tmp file" 575ddb4360Smrg return 1 585ddb4360Smrg } 595ddb4360Smrg trap 'rm -f "$tmp"; exit 1' HUP INT QUIT PIPE TERM 605ddb4360Smrg 615ddb4360Smrg # Do the actual work, producing a file "$tmp" 62*c9f8548dSnakayama if uncompress -f -c < "$filez" | gzip -f $gzipflags > "$tmp"; then 635ddb4360Smrg 645ddb4360Smrg if test $kflag -eq 1 && smaller "$filez" "$tmp"; then 655ddb4360Smrg echo -n "$prog: $filez is smaller than $filegz" 665ddb4360Smrg echo "; keeping it" 675ddb4360Smrg rm -f "$tmp" 685ddb4360Smrg return 0 695ddb4360Smrg fi 705ddb4360Smrg if ! checkfile "$tmp"; then 715ddb4360Smrg echo "$prog: integrity check of $tmp failed" 725ddb4360Smrg rm -f "$tmp" 735ddb4360Smrg return 1; 745ddb4360Smrg fi 755ddb4360Smrg 765ddb4360Smrg # Try to keep the mode of the original file 775ddb4360Smrg if ! cp -fp "$filez" "$filegz"; then 785ddb4360Smrg echo "$prog: warning: could not keep mode of $filez" 795ddb4360Smrg fi 805ddb4360Smrg if ! cp "$tmp" "$filegz" 2> /dev/null; then 815ddb4360Smrg echo "$prog: warning: could not keep mode of $filez" 825ddb4360Smrg if ! cp -f "$tmp" "$filegz" 2> /dev/null; then 835ddb4360Smrg echo "$prog: could not copy $tmp to $filegz" 845ddb4360Smrg rm -f "$filegz" "$tmp" 855ddb4360Smrg return 1 865ddb4360Smrg fi 875ddb4360Smrg fi 885ddb4360Smrg if ! touch -fr "$filez" "$filegz"; then 895ddb4360Smrg echo -n "$prog: warning: could not keep timestamp of " 905ddb4360Smrg echo "$filez" 915ddb4360Smrg fi 925ddb4360Smrg rm -f "$filez" "$tmp" 935ddb4360Smrg else 945ddb4360Smrg echo "$prog: failed to process $filez" 955ddb4360Smrg rm -f "$tmp" 965ddb4360Smrg return 1 975ddb4360Smrg fi 985ddb4360Smrg} 995ddb4360Smrg 1005ddb4360Smrgprog=`basename "$0"` 1015ddb4360Smrgusage="usage: $prog [-ftv9K] file ..." 1025ddb4360Smrg 1035ddb4360Smrgfflag=0 1045ddb4360Smrgtflag=0 1055ddb4360Smrgkflag=0 1065ddb4360Smrggzipflags= 1075ddb4360Smrg 1085ddb4360Smrg# -P flag is recognized to maintain compatibility, but ignored. Pipe mode is 1095ddb4360Smrg# always used 1105ddb4360Smrgwhile getopts :ftv9PK i; do 1115ddb4360Smrg case $i in 1125ddb4360Smrg f) fflag=1;; 1135ddb4360Smrg t) tflag=1;; 1145ddb4360Smrg v) gzipflags="-v $gzipflags";; 1155ddb4360Smrg 9) gzipflags="-9 $gzipflags";; 1165ddb4360Smrg P) ;; 1175ddb4360Smrg K) kflag=1;; 1185ddb4360Smrg \?) echo "$usage"; exit 1;; 1195ddb4360Smrg esac 1205ddb4360Smrgdone 1215ddb4360Smrg 1225ddb4360Smrgshift OPTIND-1 1235ddb4360Smrg 1245ddb4360Smrgif test $# -eq 0; then 1255ddb4360Smrg echo "$usage" 1265ddb4360Smrg exit 1 1275ddb4360Smrgfi 1285ddb4360Smrg 1295ddb4360Smrgrc=0 1305ddb4360Smrg 1315ddb4360Smrgwhile test $# -ne 0; do 1325ddb4360Smrg if ! process "$1"; then 1335ddb4360Smrg rc=$? 1345ddb4360Smrg fi 1355ddb4360Smrg shift 1365ddb4360Smrgdone 1375ddb4360Smrgexit $rc 138