znew revision 1.1 1 1.1 mrg #!/bin/ksh -
2 1.1 mrg #
3 1.1 mrg # $OpenBSD: znew,v 1.2 2003/08/05 18:22:17 deraadt Exp $
4 1.1 mrg #
5 1.1 mrg # Copyright (c) 2003 Otto Moerbeek <otto (at] drijf.net>
6 1.1 mrg #
7 1.1 mrg # Permission to use, copy, modify, and distribute this software for any
8 1.1 mrg # purpose with or without fee is hereby granted, provided that the above
9 1.1 mrg # copyright notice and this permission notice appear in all copies.
10 1.1 mrg #
11 1.1 mrg # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 1.1 mrg # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 1.1 mrg # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 1.1 mrg # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 1.1 mrg # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 1.1 mrg # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 1.1 mrg # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 1.1 mrg #
19 1.1 mrg
20 1.1 mrg # Return 0 if the first arg file size is smaller than the second, 1 otherwise.
21 1.1 mrg smaller () {
22 1.1 mrg a=`du -k "$1" | awk '{ print $1 }'`
23 1.1 mrg b=`du -k "$2" | awk '{ print $1 }'`
24 1.1 mrg test $a -lt $b
25 1.1 mrg }
26 1.1 mrg
27 1.1 mrg # Check gzip integrity if the -t flag is specified
28 1.1 mrg checkfile () {
29 1.1 mrg if test $tflag -eq 1; then
30 1.1 mrg gzip -qt < "$1"
31 1.1 mrg fi
32 1.1 mrg }
33 1.1 mrg
34 1.1 mrg # Decompress a file and then gzip it
35 1.1 mrg process () {
36 1.1 mrg prefix="${1%.Z}"
37 1.1 mrg filez="$prefix".Z
38 1.1 mrg filegz="$prefix".gz
39 1.1 mrg
40 1.1 mrg if test ! -e "$filez"; then
41 1.1 mrg echo "$prog: $filez does not exist"
42 1.1 mrg return 1
43 1.1 mrg fi
44 1.1 mrg if test ! -f "$filez"; then
45 1.1 mrg echo "$prog: $filez is not a regular file"
46 1.1 mrg return 1
47 1.1 mrg fi
48 1.1 mrg if test -e "$filegz" -a $fflag -eq 0; then
49 1.1 mrg echo "$prog: $filegz already exists"
50 1.1 mrg return 1
51 1.1 mrg fi
52 1.1 mrg
53 1.1 mrg tmp=`mktemp /tmp/znewXXXXXXXXXX` || {
54 1.1 mrg echo "$prog: cannot create tmp file"
55 1.1 mrg return 1
56 1.1 mrg }
57 1.1 mrg trap 'rm -f "$tmp"; exit 1' HUP INT QUIT PIPE TERM
58 1.1 mrg
59 1.1 mrg # Do the actual work, producing a file "$tmp"
60 1.1 mrg if uncompress -f -c < "$filez" | gzip -f $gzipflags -o "$tmp"; then
61 1.1 mrg
62 1.1 mrg if test $kflag -eq 1 && smaller "$filez" "$tmp"; then
63 1.1 mrg echo -n "$prog: $filez is smaller than $filegz"
64 1.1 mrg echo "; keeping it"
65 1.1 mrg rm -f "$tmp"
66 1.1 mrg return 0
67 1.1 mrg fi
68 1.1 mrg if ! checkfile "$tmp"; then
69 1.1 mrg echo "$prog: integrity check of $tmp failed"
70 1.1 mrg rm -f "$tmp"
71 1.1 mrg return 1;
72 1.1 mrg fi
73 1.1 mrg
74 1.1 mrg # Try to keep the mode of the original file
75 1.1 mrg if ! cp -fp "$filez" "$filegz"; then
76 1.1 mrg echo "$prog: warning: could not keep mode of $filez"
77 1.1 mrg fi
78 1.1 mrg if ! cp "$tmp" "$filegz" 2> /dev/null; then
79 1.1 mrg echo "$prog: warning: could not keep mode of $filez"
80 1.1 mrg if ! cp -f "$tmp" "$filegz" 2> /dev/null; then
81 1.1 mrg echo "$prog: could not copy $tmp to $filegz"
82 1.1 mrg rm -f "$filegz" "$tmp"
83 1.1 mrg return 1
84 1.1 mrg fi
85 1.1 mrg fi
86 1.1 mrg if ! touch -fr "$filez" "$filegz"; then
87 1.1 mrg echo -n "$prog: warning: could not keep timestamp of "
88 1.1 mrg echo "$filez"
89 1.1 mrg fi
90 1.1 mrg rm -f "$filez" "$tmp"
91 1.1 mrg else
92 1.1 mrg echo "$prog: failed to process $filez"
93 1.1 mrg rm -f "$tmp"
94 1.1 mrg return 1
95 1.1 mrg fi
96 1.1 mrg }
97 1.1 mrg
98 1.1 mrg prog=`basename "$0"`
99 1.1 mrg usage="usage: $prog [-ftv9K] file ..."
100 1.1 mrg
101 1.1 mrg fflag=0
102 1.1 mrg tflag=0
103 1.1 mrg kflag=0
104 1.1 mrg gzipflags=
105 1.1 mrg
106 1.1 mrg # -P flag is recognized to maintain compatibility, but ignored. Pipe mode is
107 1.1 mrg # always used
108 1.1 mrg while getopts :ftv9PK i; do
109 1.1 mrg case $i in
110 1.1 mrg f) fflag=1;;
111 1.1 mrg t) tflag=1;;
112 1.1 mrg v) gzipflags="-v $gzipflags";;
113 1.1 mrg 9) gzipflags="-9 $gzipflags";;
114 1.1 mrg P) ;;
115 1.1 mrg K) kflag=1;;
116 1.1 mrg \?) echo "$usage"; exit 1;;
117 1.1 mrg esac
118 1.1 mrg done
119 1.1 mrg
120 1.1 mrg shift OPTIND-1
121 1.1 mrg
122 1.1 mrg if test $# -eq 0; then
123 1.1 mrg echo "$usage"
124 1.1 mrg exit 1
125 1.1 mrg fi
126 1.1 mrg
127 1.1 mrg rc=0
128 1.1 mrg
129 1.1 mrg while test $# -ne 0; do
130 1.1 mrg if ! process "$1"; then
131 1.1 mrg rc=$?
132 1.1 mrg fi
133 1.1 mrg shift
134 1.1 mrg done
135 1.1 mrg exit $rc
136