document mingw linker fix and close associated bug
[debian/gzip] / gzexe.in
index 282e3854afa3e542c7d5b4aa9e40fabb692fcb51..3076b6808ba2ec22070da32c6b3963f711921931 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
 
 
 # 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
 
 # Foundation, Inc.
 # Copyright (C) 1993 Jean-loup Gailly
 
@@ -37,15 +37,16 @@ nl='
 IFS=" $tab$nl"
 
 version='gzexe (gzip) @VERSION@
 IFS=" $tab$nl"
 
 version='gzexe (gzip) @VERSION@
-Copyright (C) 2007, 2011-2016 Free Software Foundation, Inc.
+Copyright (C) 2007, 2011-2018 Free Software Foundation, Inc.
 This is free software.  You may redistribute copies of it under the terms of
 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...
 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
 
   -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;;
 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
   --) 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
 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=$?
   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
     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
       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
     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 | \
     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)
   */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
   esac
 
   dir=`dirname "$file"` || dir=$TMPDIR
@@ -118,13 +119,17 @@ for i do
     type mktemp >/dev/null 2>&1
     mktemp_status=$?
   fi
     type mktemp >/dev/null 2>&1
     mktemp_status=$?
   fi
+  case $dir in
+    */) ;;
+    *) dir=$dir/;;
+  esac
   if test $mktemp_status -eq 0; then
   if test $mktemp_status -eq 0; then
-    tmp=`TMPDIR=$dir mktemp`
+    tmp=`mktemp "${dir}gzexeXXXXXXXXX"`
   else
   else
-    tmp=$dir/gzexe$$
+    tmp=${dir}gzexe$$
   fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || {
     res=$?
   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
     continue
   }
   if test -w "$tmp"; then
@@ -133,7 +138,7 @@ for i do
     writable=0
     chmod u+w "$tmp" || {
       res=$?
     writable=0
     chmod u+w "$tmp" || {
       res=$?
-      echo >&2 "$0: cannot chmod $tmp"
+      printf >&2 '%s\n' "$0: cannot chmod $tmp"
       continue
     }
   fi
       continue
     }
   fi
@@ -156,10 +161,15 @@ trap 'res=$?
   (exit $res); exit $res
 ' 0 1 2 3 5 10 13 15
 
   (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
 if type mktemp >/dev/null 2>&1; then
-  gztmpdir=`mktemp -d`
+  gztmpdir=`mktemp -d "${TMPDIR}gztmpXXXXXXXXX"`
 else
 else
-  gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir
+  gztmpdir=${TMPDIR}gztmp$$; mkdir $gztmpdir
 fi || { (exit 127); exit 127; }
 
 gztmp=$gztmpdir/$0
 fi || { (exit 127); exit 127; }
 
 gztmp=$gztmpdir/$0
@@ -169,7 +179,7 @@ case $0 in
 */*) gztmp=$gztmpdir/`basename "$0"`;;
 esac || { (exit 127); exit 127; }
 
 */*) 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
 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
   (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=$?
   (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
     }
 
       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
     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=$?
     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=$?
       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
   }
     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=$?
     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=$?
     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=
     continue
   }
   tmp=