New upstream version 1.9
[debian/gzip] / gzexe.in
index 282e3854afa3e542c7d5b4aa9e40fabb692fcb51..6c6118389b7140680f33a21a001ab9137acdaee9 100644 (file)
--- a/gzexe.in
+++ b/gzexe.in
@@ -13,7 +13,7 @@
 # On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5
 
 
-# Copyright (C) 1998, 2002, 2004, 2006-2007, 2010-2016 Free Software
+# Copyright (C) 1998, 2002, 2004, 2006-2007, 2010-2018 Free Software
 # Foundation, Inc.
 # Copyright (C) 1993 Jean-loup Gailly
 
@@ -37,15 +37,16 @@ nl='
 IFS=" $tab$nl"
 
 version='gzexe (gzip) @VERSION@
-Copyright (C) 2007, 2011-2016 Free Software Foundation, Inc.
+Copyright (C) 2007, 2011-2017 Free Software Foundation, Inc.
 This is free software.  You may redistribute copies of it under the terms of
-the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
+the GNU General Public License <https://www.gnu.org/licenses/gpl.html>.
 There is NO WARRANTY, to the extent permitted by law.
 
 Written by Jean-loup Gailly.'
 
 usage="Usage: $0 [OPTION] FILE...
-Rename each FILE with a compressed version of itself, renaming FILE to FILE~.
+Replace each executable FILE with a compressed version of itself.
+Make a backup FILE~ of the old version of FILE.
 
   -d             Decompress each FILE instead of compressing it.
       --help     display this help and exit
@@ -58,15 +59,15 @@ res=0
 while :; do
   case $1 in
   -d) decomp=1; shift;;
-  --h*) exec echo "$usage";;
-  --v*) exec echo "$version";;
+  --h*) printf '%s\n' "$usage"   || exit 1; exit;;
+  --v*) printf '%s\n' "$version" || exit 1; exit;;
   --) shift; break;;
   *) break;;
   esac
 done
 
 if test $# -eq 0; then
-  echo >&2 "$0: missing operand
+  printf >&2 '%s\n' "$0: missing operand
 Try \`$0 --help' for more information."
   exit 1
 fi
@@ -86,29 +87,29 @@ for i do
   esac
   if test ! -f "$file" || test ! -r "$file"; then
     res=$?
-    echo >&2 "$0: $i is not a readable regular file"
+    printf >&2 '%s\n' "$0: $i is not a readable regular file"
     continue
   fi
   if test $decomp -eq 0; then
     if sed -e 1d -e 2q "$file" | grep "^skip=[0-9][0-9]*$" >/dev/null; then
-      echo >&2 "$0: $i is already gzexe'd"
+      printf >&2 '%s\n' "$0: $i is already gzexe'd"
       continue
     fi
   fi
   if test -u "$file"; then
-    echo >&2 "$0: $i has setuid permission, unchanged"
+    printf >&2 '%s\n' "$0: $i has setuid permission, unchanged"
     continue
   fi
   if test -g "$file"; then
-    echo >&2 "$0: $i has setgid permission, unchanged"
+    printf >&2 '%s\n' "$0: $i has setgid permission, unchanged"
     continue
   fi
   case /$file in
   */basename | */bash | */cat | */chmod | */cp | \
-  */dirname | */echo | */expr | */gzip | \
-  */ln | */mkdir | */mktemp | */mv | */rm | \
+  */dirname | */expr | */gzip | \
+  */ln | */mkdir | */mktemp | */mv | */printf | */rm | \
   */sed | */sh | */sleep | */test | */tail)
-    echo >&2 "$0: $i might depend on itself"; continue;;
+    printf >&2 '%s\n' "$0: $i might depend on itself"; continue;;
   esac
 
   dir=`dirname "$file"` || dir=$TMPDIR
@@ -118,13 +119,17 @@ for i do
     type mktemp >/dev/null 2>&1
     mktemp_status=$?
   fi
+  case $dir in
+    */) ;;
+    *) dir=$dir/;;
+  esac
   if test $mktemp_status -eq 0; then
-    tmp=`TMPDIR=$dir mktemp`
+    tmp=`mktemp "${dir}gzexeXXXXXXXXX"`
   else
-    tmp=$dir/gzexe$$
+    tmp=${dir}gzexe$$
   fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || {
     res=$?
-    echo >&2 "$0: cannot copy $file"
+    printf >&2 '%s\n' "$0: cannot copy $file"
     continue
   }
   if test -w "$tmp"; then
@@ -133,7 +138,7 @@ for i do
     writable=0
     chmod u+w "$tmp" || {
       res=$?
-      echo >&2 "$0: cannot chmod $tmp"
+      printf >&2 '%s\n' "$0: cannot chmod $tmp"
       continue
     }
   fi
@@ -156,10 +161,15 @@ trap 'res=$?
   (exit $res); exit $res
 ' 0 1 2 3 5 10 13 15
 
+case $TMPDIR in
+  / | /*/) ;;
+  /*) TMPDIR=$TMPDIR/;;
+  *) TMPDIR=/tmp/;;
+esac
 if type mktemp >/dev/null 2>&1; then
-  gztmpdir=`mktemp -d`
+  gztmpdir=`mktemp -d "${TMPDIR}gztmpXXXXXXXXX"`
 else
-  gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir
+  gztmpdir=${TMPDIR}gztmp$$; mkdir $gztmpdir
 fi || { (exit 127); exit 127; }
 
 gztmp=$gztmpdir/$0
@@ -169,7 +179,7 @@ case $0 in
 */*) gztmp=$gztmpdir/`basename "$0"`;;
 esac || { (exit 127); exit 127; }
 
-case `echo X | tail -n +1 2>/dev/null` in
+case `printf 'X\n' | tail -n +1 2>/dev/null` in
 X) tail_n=-n;;
 *) tail_n=;;
 esac
@@ -179,13 +189,13 @@ if tail $tail_n +$skip <"$0" | gzip -cd > "$gztmp"; then
   (sleep 5; rm -fr "$gztmpdir") 2>/dev/null &
   "$gztmp" ${1+"$@"}; res=$?
 else
-  echo >&2 "Cannot decompress $0"
+  printf >&2 '%s\n' "Cannot decompress $0"
   (exit 127); res=127
 fi; exit $res
 EOF
     gzip -cv9 "$file") > "$tmp" || {
       res=$?
-      echo >&2 "$0: compression not possible for $i, file unchanged."
+      printf >&2 '%s\n' "$0: compression not possible for $i, file unchanged."
       continue
     }
 
@@ -197,29 +207,32 @@ EOF
     skip=[0-9] | skip=[0-9][0-9] | skip=[0-9][0-9][0-9])
       eval "$skip_line";;
     esac
-    case `echo X | tail -n +1 2>/dev/null` in
+    case `printf 'X\n' | tail -n +1 2>/dev/null` in
     X) tail_n=-n;;
     *) tail_n=;;
     esac
     tail $tail_n +$skip "$file" | gzip -cd > "$tmp" || {
       res=$?
-      echo >&2 "$0: $i probably not in gzexe format, file unchanged."
+      printf >&2 '%s\n' "$0: $i probably not in gzexe format, file unchanged."
       continue
     }
   fi
   test $writable -eq 1 || chmod u-w "$tmp" || {
     res=$?
-    echo >&2 "$0: $tmp: cannot chmod"
+    printf >&2 '%s\n' "$0: $tmp: cannot chmod"
     continue
   }
-  ln -f "$file" "$file~" || {
+  ln -f "$file" "$file~" 2>/dev/null || {
+    # Hard links may not work.  Fall back on rm+cp so that $file always exists.
+    rm -f "$file~" && cp -p "$file" "$file~"
+  } || {
     res=$?
-    echo >&2 "$0: cannot backup $i as $i~"
+    printf >&2 '%s\n' "$0: cannot backup $i as $i~"
     continue
   }
   mv -f "$tmp" "$file" || {
     res=$?
-    echo >&2 "$0: cannot rename $tmp to $i"
+    printf >&2 '%s\n' "$0: cannot rename $tmp to $i"
     continue
   }
   tmp=