]> git.cworth.org Git - gzip/blobdiff - gzexe.in
Imported Debian patch 1.3.9-1
[gzip] / gzexe.in
old mode 100755 (executable)
new mode 100644 (file)
index bcd788c..a27ec5c
--- a/gzexe.in
+++ b/gzexe.in
@@ -1,4 +1,3 @@
-:
 #!/bin/sh
 # gzexe: compressor for Unix executables.
 # Use this only for binaries that you do not use frequently.
 # On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5
 
 
-# Copyright (C) 1998, 2002 Free Software Foundation
+# Copyright (C) 1998, 2002, 2004, 2006 Free Software Foundation
 # Copyright (C) 1993 Jean-loup Gailly
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
+tab='  '
+nl='
+'
+IFS=" $tab$nl"
 
-PATH="BINDIR:$PATH"
-x=`basename $0`
-if test $# = 0; then
-  echo compress executables. original file foo is renamed to foo~
-  echo usage: ${x} [-d] files...
-  echo   "   -d  decompress the executables"
-  exit 1
-fi
+version='gzexe (gzip) @VERSION@
+Copyright (C) 2006 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>.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by Jean-loup Gailly.'
+
+usage='Usage: gzexe [OPTION] FILE...
+Rename each FILE with a compressed version of itself, renaming FILE to FILE~.
+
+  -d             Decompress each FILE instead of compressing it.
+      --help     display this help and exit
+      --version  output version information and exit
 
-set -C
-tmp=gz$$
-trap "rm -f $tmp; exit 1" HUP INT QUIT TRAP USR1 PIPE TERM
-: > $tmp || exit 1
+Report bugs to <bug-gzip@gnu.org>.'
+
+
+PATH="BINDIR:$PATH"
 
 decomp=0
 res=0
-test "$x" = "ungzexe" && decomp=1
-if test "x$1" = "x-d"; then
-  decomp=1
-  shift
-fi
-
-echo hi > zfoo1$$ || exit 1
-echo hi > zfoo2$$ || exit 1
-if test -z "`(${CPMOD-cpmod} zfoo1$$ zfoo2$$) 2>&1`"; then
-  cpmod=${CPMOD-cpmod}
-fi
-rm -f zfoo[12]$$
-
-tail=""
-IFS="${IFS=    }"; saveifs="$IFS"; IFS="${IFS}:"
-for dir in $PATH; do
-  test -z "$dir" && dir=.
-  if test -f $dir/tail; then
-    tail="$dir/tail"
-    break
-  fi
+while :; do
+  case $1 in
+  -d) decomp=1; shift;;
+  --h*) exec echo "$usage";;
+  --v*) exec echo "$version";;
+  --) shift; break;;
+  *) break;;
+  esac
 done
-IFS="$saveifs"
-if test -z "$tail"; then
-  echo cannot find tail
+
+if test $# -eq 0; then
+  echo >&2 "$0: missing operand
+Try \`$0 --help' for more information."
   exit 1
 fi
-case `echo foo | $tail -n +1 2>/dev/null` in
-foo) tail="$tail -n";;
-esac
+
+tmp=
+trap 'res=$?
+  test -n "$tmp" && rm -f "$tmp"
+  (exit $res); exit $res
+' 0 1 2 3 5 10 13 15
+
+mktemp_status=
 
 for i do
-  if test ! -f "$i" ; then
-    echo ${x}: $i not a file
-    res=1
+  case $i in
+  -*) file=./$i;;
+  *)  file=$i;;
+  esac
+  if test ! -f "$file" || test ! -r "$file"; then
+    res=$?
+    echo >&2 "$0: $i is not a readable regular file"
     continue
   fi
   if test $decomp -eq 0; then
-    if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then
-      echo "${x}: $i is already gzexe'd"
+    if sed -e 1d -e 2q "$file" | grep "^skip=[0-9][0-9]*$" >/dev/null; then
+      echo >&2 "$0: $i is already gzexe'd"
       continue
     fi
   fi
-  if ls -l "$i" | grep '^...[sS]' > /dev/null; then
-    echo "${x}: $i has setuid permission, unchanged"
+  if test -u "$file"; then
+    echo >&2 "$0: $i has setuid permission, unchanged"
     continue
   fi
-  if ls -l "$i" | grep '^......[sS]' > /dev/null; then
-    echo "${x}: $i has setgid permission, unchanged"
+  if test -g "$file"; then
+    echo >&2 "$0: $i has setgid permission, unchanged"
     continue
   fi
-  case "`basename $i`" in
-  gzip | tail | sed | chmod | ln | sleep | rm)
-       echo "${x}: $i would depend on itself"; continue ;;
+  case /$file in
+  */basename | */cat | */chmod | */cp | \
+  */dirname | */echo | */expr | */gzip | \
+  */ln | */mkdir | */mktemp | */mv | */rm | */rmdir | \
+  */sed | */sh | */sleep | */test | */tail)
+    echo >&2 "$0: $i would depend on itself"; continue;;
   esac
-  if test -z "$cpmod"; then
-    cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp
-    if test -w $tmp 2>/dev/null; then
-      writable=1
-    else
-      writable=0
-      chmod u+w $tmp 2>/dev/null
-    fi
-    : >| $tmp  # truncate the file, ignoring set -C
+
+  dir=`dirname "$file"` || dir=$TMPDIR
+  test -d "$dir" && test -w "$dir" && test -x "$dir" || dir=/tmp
+  test -n "$tmp" && rm -f "$tmp"
+  if test -z "$mktemp_status"; then
+    type mktemp >/dev/null 2>&1
+    mktemp_status=$?
+  fi
+  if test $mktemp_status -eq 0; then
+    tmp=`TMPDIR=$dir mktemp -t gzexeXXXXXX`
+  else
+    tmp=$dir/gzexe$$
+  fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || {
+    res=$?
+    echo >&2 "$0: cannot copy $file"
+    continue
+  }
+  if test -w "$tmp"; then
+    writable=1
+  else
+    writable=0
+    chmod u+w "$tmp" || {
+      res=$?
+      echo >&2 "$0: cannot chmod $tmp"
+      continue
+    }
   fi
   if test $decomp -eq 0; then
-    sed 1q $0 >> $tmp
-    sed "s|^if tail|if $tail|" >> $tmp <<'EOF'
-skip=23
-set -C
+    (cat <<'EOF' &&
+#!/bin/sh
+skip=44
+
+tab='  '
+nl='
+'
+IFS=" $tab$nl"
+
 umask=`umask`
 umask 77
-tmpfile=`tempfile -p gztmp -d /tmp` || tmpfile=/tmp/gztmp.$$ || exit 1
-if tail +$skip "$0" | /bin/gzip -cd >> $tmpfile; then
+
+gztmpdir=
+trap 'res=$?
+  test -n "$gztmpdir" && rm -fr "$gztmpdir"
+  (exit $res); exit $res
+' 0 1 2 3 5 10 13 15
+
+if type mktemp >/dev/null 2>&1; then
+  gztmpdir=`mktemp -dt`
+else
+  gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir
+fi || { (exit 127); exit 127; }
+
+gztmp=$gztmpdir/$0
+case $0 in
+-* | */*'
+') mkdir -p "$gztmp" && rmdir "$gztmp";;
+*/*) gztmp=$gztmpdir/`basename "$0"`;;
+esac || { (exit 127); exit 127; }
+
+case `echo X | tail -n +1 2>/dev/null` in
+X) tail_n=-n;;
+*) tail_n=;;
+esac
+if tail $tail_n +$skip <"$0" | gzip -cd > "$gztmp"; then
   umask $umask
-  /bin/chmod 700 $tmpfile
-  prog="`echo $0 | /bin/sed 's|^.*/||'`"
-  if /bin/ln $tmpfile "/tmp/$prog" 2>/dev/null; then
-    trap '/bin/rm -f $tmpfile "/tmp/$prog"; exit $res' 0
-    (/bin/sleep 5; /bin/rm -f $tmpfile "/tmp/$prog") 2>/dev/null &
-    /tmp/"$prog" ${1+"$@"}; res=$?
-  else
-    trap '/bin/rm -f $tmpfile; exit $res' 0
-    (/bin/sleep 5; /bin/rm -f $tmpfile) 2>/dev/null &
-    $tmpfile ${1+"$@"}; res=$?
-  fi
+  chmod 700 "$gztmp"
+  (sleep 5; rm -fr "$gztmpdir") 2>/dev/null &
+  "$gztmp" ${1+"$@"}; res=$?
 else
-  echo Cannot decompress $0; exit 1
+  echo >&2 "Cannot decompress $0"
+  (exit 127); res=127
 fi; exit $res
 EOF
-    gzip -cv9 "$i" >> $tmp || {
-      /bin/rm -f $tmp
-      echo ${x}: compression not possible for $i, file unchanged.
-      res=1
+    gzip -cv9 "$file") > "$tmp" || {
+      res=$?
+      echo >&2 "$0: compression not possible for $i, file unchanged."
       continue
     }
 
   else
     # decompression
-    skip=23
-    if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then
-      eval `sed -e 1d -e 2q "$i"`
-    fi
-    if tail +$skip "$i" | gzip -cd > $tmp; then
-      :
-    else
-      echo ${x}: $i probably not in gzexe format, file unchanged.
-      res=1
+    skip=44
+    skip_line=`sed -e 1d -e 2q "$file"`
+    case $skip_line in
+    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
+    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."
       continue
-    fi
+    }
   fi
-  rm -f "$i~"
-  mv "$i" "$i~" || {
-    echo ${x}: cannot backup $i as $i~
-    rm -f $tmp
-    res=1
+  test $writable -eq 1 || chmod u-w "$tmp" || {
+    res=$?
+    echo >&2 "$0: $tmp: cannot chmod"
     continue
   }
-  mv $tmp "$i" || cp -p $tmp "$i" 2>/dev/null || cp $tmp "$i" || {
-    echo ${x}: cannot create $i
-    rm -f $tmp
-    res=1
+  ln -f "$file" "$file~" || {
+    res=$?
+    echo >&2 "$0: cannot backup $i as $i~"
     continue
   }
-  rm -f $tmp
-  if test -n "$cpmod"; then
-    $cpmod "$i~" "$i" 2>/dev/null
-  elif test $writable -eq 0; then
-    chmod u-w $i 2>/dev/null
-  fi
+  mv -f "$tmp" "$file" || {
+    res=$?
+    echo >&2 "$0: cannot rename $tmp to $i"
+    continue
+  }
+  tmp=
 done
-exit $res
+(exit $res); exit $res