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