znew revision 1.2.18.1 1 1.1 mrg #!/bin/ksh -
2 1.1 mrg #
3 1.2.18.1 jdc # $NetBSD: znew,v 1.2.18.1 2008/05/08 07:59:17 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.18.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