summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/gzip/znew
blob: c580e09f01593847401aff0d59fcd8160c15001c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/bin/sh

check=0
pipe=0
opt=
files=
keep=0
res=0
old=0
new=0
block=1024
# block is the disk block size (best guess, need not be exact)

case "$GZIP" in
  *-S*) ext=`echo "$GZIP" | sed 's/^.*-S[ 	]*\([^ 	]*\).*$/\1/'`
	;;
  *-suffix*) ext=`echo "$GZIP" | sed 's/^.*--suffix[ 	=]*\([^ 	]*\).*$/\1/'`
	;;
  *)	ext='.gz'
	;;
esac
if test "$ext" = ".Z"; then
  echo znew: cannot use .Z as gzip extension.
  exit 1
fi

warn="(does not preserve modes and timestamp)"
TMP1=`mktemp /tmp/zfoo.XXXXXXXXXX` || exit 1
TMP2=`mktemp /tmp/zbar.XXXXXXXXXX`
if [ $? -ne 0 ]; then
  rm -f $TMP1
  exit 1
fi
echo hi > $TMP1
echo hi > $TMP2
if test -z "`(${CPMOD-cpmod} $TMP1 $TMP2) 2>&1`"; then
  cpmod=${CPMOD-cpmod}
  warn=""
fi

if test -z "$cpmod" && ${TOUCH-touch} -r $TMP1 $TMP2 2>/dev/null; then
  cpmod="${TOUCH-touch}"
  cpmodarg="-r"
  warn="(does not preserve file modes)"
fi
rm -f $TMP1 $TMP2

for arg
do
  case "$arg" in
  -*)     opt="$opt $arg"; shift;;
   *)     break;;
  esac
done

if test $# -eq 0; then
  echo "recompress .Z files into $ext (gzip) files"
  echo usage: `echo $0 | sed 's,^.*/,,'` "[-tv9KP]" file.Z...
  echo "  -t tests the new files before deleting originals"
  echo "  -v be verbose"
  echo "  -9 use the slowest compression method (optimal compression)"
  echo "  -K keep a .Z file when it is smaller than the $ext file"
  echo "  -P use pipes for the conversion $warn"
  exit 1
fi

opt=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
case "$opt" in
  *t*) check=1; opt=`echo "$opt" | sed 's/t//g'`
esac
case "$opt" in
  *K*) keep=1; opt=`echo "$opt" | sed 's/K//g'`
esac
case "$opt" in
  *P*) pipe=1; opt=`echo "$opt" | sed 's/P//g'`
esac
if test -n "$opt"; then
  opt="-$opt"
fi

for i do
  n=`echo $i | sed 's/.Z$//'`
  if test ! -f "$n.Z" ; then
    echo $n.Z not found
    res=1; continue
  fi
  test $keep -eq 1 && old=`wc -c < "$n.Z"`
  if test $pipe -eq 1; then
    if gzip -d < "$n.Z" | gzip $opt > "$n$ext"; then
      # Copy file attributes from old file to new one, if possible.
      test -n "$cpmod" && $cpmod $cpmodarg "$n.Z" "$n$ext" 2> /dev/null
    else
      echo error while recompressing $n.Z
      res=1; continue
    fi
  else
    if test $check -eq 1; then
      if cp -p "$n.Z" "$n.$$" 2> /dev/null || cp "$n.Z" "$n.$$"; then
	:
      else
	echo cannot backup "$n.Z"
        res=1; continue
      fi
    fi
    if gzip -d "$n.Z"; then
      :
    else
      test $check -eq 1 && mv "$n.$$" "$n.Z"
      echo error while uncompressing $n.Z
      res=1; continue
    fi
    if gzip $opt "$n"; then
      :
    else
      if test $check -eq 1; then
	mv "$n.$$" "$n.Z" && rm -f "$n"
        echo error while recompressing $n
      else
	# compress $n  (might be dangerous if disk full)
        echo error while recompressing $n, left uncompressed
      fi
      res=1; continue
    fi
  fi
  test $keep -eq 1 && new=`wc -c < "$n$ext"`
  if test $keep -eq 1 -a `expr \( $old + $block - 1 \) / $block` -lt \
                         `expr \( $new + $block - 1 \) / $block`; then
    if test $pipe -eq 1; then
      rm -f "$n$ext"
    elif test $check -eq 1; then
      mv "$n.$$" "$n.Z" && rm -f "$n$ext"
    else
      gzip -d "$n$ext" && compress "$n" && rm -f "$n$ext"
    fi
    echo "$n.Z smaller than $n$ext -- unchanged"

  elif test $check -eq 1; then
    if gzip -t "$n$ext" ; then
      rm -f "$n.$$" "$n.Z"
    else
      test $pipe -eq 0 && mv "$n.$$" "$n.Z"
      rm -f "$n$ext"
      echo error while testing $n$ext, $n.Z unchanged
      res=1; continue
    fi
  elif test $pipe -eq 1; then
    rm -f "$n.Z"
  fi
done
exit $res