1*077be2d6Szrj#!/bin/sh - 262529567SJoerg Sonnenberger# 300e71414SPeter Avalos# $NetBSD: znew,v 1.3 2008/04/27 09:07:13 nakayama Exp $ 462529567SJoerg Sonnenberger# $OpenBSD: znew,v 1.2 2003/08/05 18:22:17 deraadt Exp $ 562529567SJoerg Sonnenberger# 662529567SJoerg Sonnenberger# Copyright (c) 2003 Otto Moerbeek <otto@drijf.net> 762529567SJoerg Sonnenberger# 862529567SJoerg Sonnenberger# Permission to use, copy, modify, and distribute this software for any 962529567SJoerg Sonnenberger# purpose with or without fee is hereby granted, provided that the above 1062529567SJoerg Sonnenberger# copyright notice and this permission notice appear in all copies. 1162529567SJoerg Sonnenberger# 1262529567SJoerg Sonnenberger# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1362529567SJoerg Sonnenberger# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1462529567SJoerg Sonnenberger# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1562529567SJoerg Sonnenberger# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1662529567SJoerg Sonnenberger# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1762529567SJoerg Sonnenberger# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1862529567SJoerg Sonnenberger# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1962529567SJoerg Sonnenberger# 2062529567SJoerg Sonnenberger 2162529567SJoerg Sonnenberger# Return 0 if the first arg file size is smaller than the second, 1 otherwise. 2262529567SJoerg Sonnenbergersmaller () { 2362529567SJoerg Sonnenberger a=`du -k "$1" | awk '{ print $1 }'` 2462529567SJoerg Sonnenberger b=`du -k "$2" | awk '{ print $1 }'` 2562529567SJoerg Sonnenberger test $a -lt $b 2662529567SJoerg Sonnenberger} 2762529567SJoerg Sonnenberger 2862529567SJoerg Sonnenberger# Check gzip integrity if the -t flag is specified 2962529567SJoerg Sonnenbergercheckfile () { 3062529567SJoerg Sonnenberger if test $tflag -eq 1; then 3162529567SJoerg Sonnenberger gzip -qt < "$1" 3262529567SJoerg Sonnenberger fi 3362529567SJoerg Sonnenberger} 3462529567SJoerg Sonnenberger 3562529567SJoerg Sonnenberger# Decompress a file and then gzip it 3662529567SJoerg Sonnenbergerprocess () { 3762529567SJoerg Sonnenberger prefix="${1%.Z}" 3862529567SJoerg Sonnenberger filez="$prefix".Z 3962529567SJoerg Sonnenberger filegz="$prefix".gz 4062529567SJoerg Sonnenberger 4162529567SJoerg Sonnenberger if test ! -e "$filez"; then 4262529567SJoerg Sonnenberger echo "$prog: $filez does not exist" 4362529567SJoerg Sonnenberger return 1 4462529567SJoerg Sonnenberger fi 4562529567SJoerg Sonnenberger if test ! -f "$filez"; then 4662529567SJoerg Sonnenberger echo "$prog: $filez is not a regular file" 4762529567SJoerg Sonnenberger return 1 4862529567SJoerg Sonnenberger fi 4962529567SJoerg Sonnenberger if test -e "$filegz" -a $fflag -eq 0; then 5062529567SJoerg Sonnenberger echo "$prog: $filegz already exists" 5162529567SJoerg Sonnenberger return 1 5262529567SJoerg Sonnenberger fi 5362529567SJoerg Sonnenberger 5462529567SJoerg Sonnenberger tmp=`mktemp /tmp/znewXXXXXXXXXX` || { 5562529567SJoerg Sonnenberger echo "$prog: cannot create tmp file" 5662529567SJoerg Sonnenberger return 1 5762529567SJoerg Sonnenberger } 5862529567SJoerg Sonnenberger trap 'rm -f "$tmp"; exit 1' HUP INT QUIT PIPE TERM 5962529567SJoerg Sonnenberger 6062529567SJoerg Sonnenberger # Do the actual work, producing a file "$tmp" 6100e71414SPeter Avalos if uncompress -f -c < "$filez" | gzip -f $gzipflags > "$tmp"; then 6262529567SJoerg Sonnenberger 6362529567SJoerg Sonnenberger if test $kflag -eq 1 && smaller "$filez" "$tmp"; then 6462529567SJoerg Sonnenberger echo -n "$prog: $filez is smaller than $filegz" 6562529567SJoerg Sonnenberger echo "; keeping it" 6662529567SJoerg Sonnenberger rm -f "$tmp" 6762529567SJoerg Sonnenberger return 0 6862529567SJoerg Sonnenberger fi 6962529567SJoerg Sonnenberger if ! checkfile "$tmp"; then 7062529567SJoerg Sonnenberger echo "$prog: integrity check of $tmp failed" 7162529567SJoerg Sonnenberger rm -f "$tmp" 7262529567SJoerg Sonnenberger return 1; 7362529567SJoerg Sonnenberger fi 7462529567SJoerg Sonnenberger 7562529567SJoerg Sonnenberger # Try to keep the mode of the original file 7662529567SJoerg Sonnenberger if ! cp -fp "$filez" "$filegz"; then 7762529567SJoerg Sonnenberger echo "$prog: warning: could not keep mode of $filez" 7862529567SJoerg Sonnenberger fi 7962529567SJoerg Sonnenberger if ! cp "$tmp" "$filegz" 2> /dev/null; then 8062529567SJoerg Sonnenberger echo "$prog: warning: could not keep mode of $filez" 8162529567SJoerg Sonnenberger if ! cp -f "$tmp" "$filegz" 2> /dev/null; then 8262529567SJoerg Sonnenberger echo "$prog: could not copy $tmp to $filegz" 8362529567SJoerg Sonnenberger rm -f "$filegz" "$tmp" 8462529567SJoerg Sonnenberger return 1 8562529567SJoerg Sonnenberger fi 8662529567SJoerg Sonnenberger fi 8762529567SJoerg Sonnenberger if ! touch -fr "$filez" "$filegz"; then 8862529567SJoerg Sonnenberger echo -n "$prog: warning: could not keep timestamp of " 8962529567SJoerg Sonnenberger echo "$filez" 9062529567SJoerg Sonnenberger fi 9162529567SJoerg Sonnenberger rm -f "$filez" "$tmp" 9262529567SJoerg Sonnenberger else 9362529567SJoerg Sonnenberger echo "$prog: failed to process $filez" 9462529567SJoerg Sonnenberger rm -f "$tmp" 9562529567SJoerg Sonnenberger return 1 9662529567SJoerg Sonnenberger fi 9762529567SJoerg Sonnenberger} 9862529567SJoerg Sonnenberger 9962529567SJoerg Sonnenbergerprog=`basename "$0"` 10000e71414SPeter Avalosusage="usage: $prog [-9fKtv] file ..." 10162529567SJoerg Sonnenberger 10262529567SJoerg Sonnenbergerfflag=0 10362529567SJoerg Sonnenbergertflag=0 10462529567SJoerg Sonnenbergerkflag=0 10562529567SJoerg Sonnenbergergzipflags= 10662529567SJoerg Sonnenberger 10762529567SJoerg Sonnenberger# -P flag is recognized to maintain compatibility, but ignored. Pipe mode is 10862529567SJoerg Sonnenberger# always used 10962529567SJoerg Sonnenbergerwhile getopts :ftv9PK i; do 11062529567SJoerg Sonnenberger case $i in 11162529567SJoerg Sonnenberger f) fflag=1;; 11262529567SJoerg Sonnenberger t) tflag=1;; 11362529567SJoerg Sonnenberger v) gzipflags="-v $gzipflags";; 11462529567SJoerg Sonnenberger 9) gzipflags="-9 $gzipflags";; 11562529567SJoerg Sonnenberger P) ;; 11662529567SJoerg Sonnenberger K) kflag=1;; 11762529567SJoerg Sonnenberger \?) echo "$usage"; exit 1;; 11862529567SJoerg Sonnenberger esac 11962529567SJoerg Sonnenbergerdone 12062529567SJoerg Sonnenberger 121*077be2d6Szrjshift $((OPTIND - 1)) 12262529567SJoerg Sonnenberger 12362529567SJoerg Sonnenbergerif test $# -eq 0; then 12462529567SJoerg Sonnenberger echo "$usage" 12562529567SJoerg Sonnenberger exit 1 12662529567SJoerg Sonnenbergerfi 12762529567SJoerg Sonnenberger 12862529567SJoerg Sonnenbergerrc=0 12962529567SJoerg Sonnenberger 13062529567SJoerg Sonnenbergerwhile test $# -ne 0; do 13162529567SJoerg Sonnenberger if ! process "$1"; then 13262529567SJoerg Sonnenberger rc=$? 13362529567SJoerg Sonnenberger fi 13462529567SJoerg Sonnenberger shift 13562529567SJoerg Sonnenbergerdone 13662529567SJoerg Sonnenbergerexit $rc 137