Blame install-sh

Packit 56e0ee
#!/bin/sh
Packit 56e0ee
# install - install a program, script, or datafile
Packit 56e0ee
Packit 56e0ee
scriptversion=2013-12-25.23; # UTC
Packit 56e0ee
Packit 56e0ee
# This originates from X11R5 (mit/util/scripts/install.sh), which was
Packit 56e0ee
# later released in X11R6 (xc/config/util/install.sh) with the
Packit 56e0ee
# following copyright and license.
Packit 56e0ee
#
Packit 56e0ee
# Copyright (C) 1994 X Consortium
Packit 56e0ee
#
Packit 56e0ee
# Permission is hereby granted, free of charge, to any person obtaining a copy
Packit 56e0ee
# of this software and associated documentation files (the "Software"), to
Packit 56e0ee
# deal in the Software without restriction, including without limitation the
Packit 56e0ee
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit 56e0ee
# sell copies of the Software, and to permit persons to whom the Software is
Packit 56e0ee
# furnished to do so, subject to the following conditions:
Packit 56e0ee
#
Packit 56e0ee
# The above copyright notice and this permission notice shall be included in
Packit 56e0ee
# all copies or substantial portions of the Software.
Packit 56e0ee
#
Packit 56e0ee
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit 56e0ee
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit 56e0ee
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit 56e0ee
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit 56e0ee
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
Packit 56e0ee
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit 56e0ee
#
Packit 56e0ee
# Except as contained in this notice, the name of the X Consortium shall not
Packit 56e0ee
# be used in advertising or otherwise to promote the sale, use or other deal-
Packit 56e0ee
# ings in this Software without prior written authorization from the X Consor-
Packit 56e0ee
# tium.
Packit 56e0ee
#
Packit 56e0ee
#
Packit 56e0ee
# FSF changes to this file are in the public domain.
Packit 56e0ee
#
Packit 56e0ee
# Calling this script install-sh is preferred over install.sh, to prevent
Packit 56e0ee
# 'make' implicit rules from creating a file called install from it
Packit 56e0ee
# when there is no Makefile.
Packit 56e0ee
#
Packit 56e0ee
# This script is compatible with the BSD install script, but was written
Packit 56e0ee
# from scratch.
Packit 56e0ee
Packit 56e0ee
tab='	'
Packit 56e0ee
nl='
Packit 56e0ee
'
Packit 56e0ee
IFS=" $tab$nl"
Packit 56e0ee
Packit 56e0ee
# Set DOITPROG to "echo" to test this script.
Packit 56e0ee
Packit 56e0ee
doit=${DOITPROG-}
Packit 56e0ee
doit_exec=${doit:-exec}
Packit 56e0ee
Packit 56e0ee
# Put in absolute file names if you don't have them in your path;
Packit 56e0ee
# or use environment vars.
Packit 56e0ee
Packit 56e0ee
chgrpprog=${CHGRPPROG-chgrp}
Packit 56e0ee
chmodprog=${CHMODPROG-chmod}
Packit 56e0ee
chownprog=${CHOWNPROG-chown}
Packit 56e0ee
cmpprog=${CMPPROG-cmp}
Packit 56e0ee
cpprog=${CPPROG-cp}
Packit 56e0ee
mkdirprog=${MKDIRPROG-mkdir}
Packit 56e0ee
mvprog=${MVPROG-mv}
Packit 56e0ee
rmprog=${RMPROG-rm}
Packit 56e0ee
stripprog=${STRIPPROG-strip}
Packit 56e0ee
Packit 56e0ee
posix_mkdir=
Packit 56e0ee
Packit 56e0ee
# Desired mode of installed file.
Packit 56e0ee
mode=0755
Packit 56e0ee
Packit 56e0ee
chgrpcmd=
Packit 56e0ee
chmodcmd=$chmodprog
Packit 56e0ee
chowncmd=
Packit 56e0ee
mvcmd=$mvprog
Packit 56e0ee
rmcmd="$rmprog -f"
Packit 56e0ee
stripcmd=
Packit 56e0ee
Packit 56e0ee
src=
Packit 56e0ee
dst=
Packit 56e0ee
dir_arg=
Packit 56e0ee
dst_arg=
Packit 56e0ee
Packit 56e0ee
copy_on_change=false
Packit 56e0ee
is_target_a_directory=possibly
Packit 56e0ee
Packit 56e0ee
usage="\
Packit 56e0ee
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
Packit 56e0ee
   or: $0 [OPTION]... SRCFILES... DIRECTORY
Packit 56e0ee
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
Packit 56e0ee
   or: $0 [OPTION]... -d DIRECTORIES...
Packit 56e0ee
Packit 56e0ee
In the 1st form, copy SRCFILE to DSTFILE.
Packit 56e0ee
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
Packit 56e0ee
In the 4th, create DIRECTORIES.
Packit 56e0ee
Packit 56e0ee
Options:
Packit 56e0ee
     --help     display this help and exit.
Packit 56e0ee
     --version  display version info and exit.
Packit 56e0ee
Packit 56e0ee
  -c            (ignored)
Packit 56e0ee
  -C            install only if different (preserve the last data modification time)
Packit 56e0ee
  -d            create directories instead of installing files.
Packit 56e0ee
  -g GROUP      $chgrpprog installed files to GROUP.
Packit 56e0ee
  -m MODE       $chmodprog installed files to MODE.
Packit 56e0ee
  -o USER       $chownprog installed files to USER.
Packit 56e0ee
  -s            $stripprog installed files.
Packit 56e0ee
  -t DIRECTORY  install into DIRECTORY.
Packit 56e0ee
  -T            report an error if DSTFILE is a directory.
Packit 56e0ee
Packit 56e0ee
Environment variables override the default commands:
Packit 56e0ee
  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
Packit 56e0ee
  RMPROG STRIPPROG
Packit 56e0ee
"
Packit 56e0ee
Packit 56e0ee
while test $# -ne 0; do
Packit 56e0ee
  case $1 in
Packit 56e0ee
    -c) ;;
Packit 56e0ee
Packit 56e0ee
    -C) copy_on_change=true;;
Packit 56e0ee
Packit 56e0ee
    -d) dir_arg=true;;
Packit 56e0ee
Packit 56e0ee
    -g) chgrpcmd="$chgrpprog $2"
Packit 56e0ee
        shift;;
Packit 56e0ee
Packit 56e0ee
    --help) echo "$usage"; exit $?;;
Packit 56e0ee
Packit 56e0ee
    -m) mode=$2
Packit 56e0ee
        case $mode in
Packit 56e0ee
          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
Packit 56e0ee
            echo "$0: invalid mode: $mode" >&2
Packit 56e0ee
            exit 1;;
Packit 56e0ee
        esac
Packit 56e0ee
        shift;;
Packit 56e0ee
Packit 56e0ee
    -o) chowncmd="$chownprog $2"
Packit 56e0ee
        shift;;
Packit 56e0ee
Packit 56e0ee
    -s) stripcmd=$stripprog;;
Packit 56e0ee
Packit 56e0ee
    -t)
Packit 56e0ee
        is_target_a_directory=always
Packit 56e0ee
        dst_arg=$2
Packit 56e0ee
        # Protect names problematic for 'test' and other utilities.
Packit 56e0ee
        case $dst_arg in
Packit 56e0ee
          -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit 56e0ee
        esac
Packit 56e0ee
        shift;;
Packit 56e0ee
Packit 56e0ee
    -T) is_target_a_directory=never;;
Packit 56e0ee
Packit 56e0ee
    --version) echo "$0 $scriptversion"; exit $?;;
Packit 56e0ee
Packit 56e0ee
    --) shift
Packit 56e0ee
        break;;
Packit 56e0ee
Packit 56e0ee
    -*) echo "$0: invalid option: $1" >&2
Packit 56e0ee
        exit 1;;
Packit 56e0ee
Packit 56e0ee
    *)  break;;
Packit 56e0ee
  esac
Packit 56e0ee
  shift
Packit 56e0ee
done
Packit 56e0ee
Packit 56e0ee
# We allow the use of options -d and -T together, by making -d
Packit 56e0ee
# take the precedence; this is for compatibility with GNU install.
Packit 56e0ee
Packit 56e0ee
if test -n "$dir_arg"; then
Packit 56e0ee
  if test -n "$dst_arg"; then
Packit 56e0ee
    echo "$0: target directory not allowed when installing a directory." >&2
Packit 56e0ee
    exit 1
Packit 56e0ee
  fi
Packit 56e0ee
fi
Packit 56e0ee
Packit 56e0ee
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
Packit 56e0ee
  # When -d is used, all remaining arguments are directories to create.
Packit 56e0ee
  # When -t is used, the destination is already specified.
Packit 56e0ee
  # Otherwise, the last argument is the destination.  Remove it from $@.
Packit 56e0ee
  for arg
Packit 56e0ee
  do
Packit 56e0ee
    if test -n "$dst_arg"; then
Packit 56e0ee
      # $@ is not empty: it contains at least $arg.
Packit 56e0ee
      set fnord "$@" "$dst_arg"
Packit 56e0ee
      shift # fnord
Packit 56e0ee
    fi
Packit 56e0ee
    shift # arg
Packit 56e0ee
    dst_arg=$arg
Packit 56e0ee
    # Protect names problematic for 'test' and other utilities.
Packit 56e0ee
    case $dst_arg in
Packit 56e0ee
      -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit 56e0ee
    esac
Packit 56e0ee
  done
Packit 56e0ee
fi
Packit 56e0ee
Packit 56e0ee
if test $# -eq 0; then
Packit 56e0ee
  if test -z "$dir_arg"; then
Packit 56e0ee
    echo "$0: no input file specified." >&2
Packit 56e0ee
    exit 1
Packit 56e0ee
  fi
Packit 56e0ee
  # It's OK to call 'install-sh -d' without argument.
Packit 56e0ee
  # This can happen when creating conditional directories.
Packit 56e0ee
  exit 0
Packit 56e0ee
fi
Packit 56e0ee
Packit 56e0ee
if test -z "$dir_arg"; then
Packit 56e0ee
  if test $# -gt 1 || test "$is_target_a_directory" = always; then
Packit 56e0ee
    if test ! -d "$dst_arg"; then
Packit 56e0ee
      echo "$0: $dst_arg: Is not a directory." >&2
Packit 56e0ee
      exit 1
Packit 56e0ee
    fi
Packit 56e0ee
  fi
Packit 56e0ee
fi
Packit 56e0ee
Packit 56e0ee
if test -z "$dir_arg"; then
Packit 56e0ee
  do_exit='(exit $ret); exit $ret'
Packit 56e0ee
  trap "ret=129; $do_exit" 1
Packit 56e0ee
  trap "ret=130; $do_exit" 2
Packit 56e0ee
  trap "ret=141; $do_exit" 13
Packit 56e0ee
  trap "ret=143; $do_exit" 15
Packit 56e0ee
Packit 56e0ee
  # Set umask so as not to create temps with too-generous modes.
Packit 56e0ee
  # However, 'strip' requires both read and write access to temps.
Packit 56e0ee
  case $mode in
Packit 56e0ee
    # Optimize common cases.
Packit 56e0ee
    *644) cp_umask=133;;
Packit 56e0ee
    *755) cp_umask=22;;
Packit 56e0ee
Packit 56e0ee
    *[0-7])
Packit 56e0ee
      if test -z "$stripcmd"; then
Packit 56e0ee
        u_plus_rw=
Packit 56e0ee
      else
Packit 56e0ee
        u_plus_rw='% 200'
Packit 56e0ee
      fi
Packit 56e0ee
      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
Packit 56e0ee
    *)
Packit 56e0ee
      if test -z "$stripcmd"; then
Packit 56e0ee
        u_plus_rw=
Packit 56e0ee
      else
Packit 56e0ee
        u_plus_rw=,u+rw
Packit 56e0ee
      fi
Packit 56e0ee
      cp_umask=$mode$u_plus_rw;;
Packit 56e0ee
  esac
Packit 56e0ee
fi
Packit 56e0ee
Packit 56e0ee
for src
Packit 56e0ee
do
Packit 56e0ee
  # Protect names problematic for 'test' and other utilities.
Packit 56e0ee
  case $src in
Packit 56e0ee
    -* | [=\(\)!]) src=./$src;;
Packit 56e0ee
  esac
Packit 56e0ee
Packit 56e0ee
  if test -n "$dir_arg"; then
Packit 56e0ee
    dst=$src
Packit 56e0ee
    dstdir=$dst
Packit 56e0ee
    test -d "$dstdir"
Packit 56e0ee
    dstdir_status=$?
Packit 56e0ee
  else
Packit 56e0ee
Packit 56e0ee
    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
Packit 56e0ee
    # might cause directories to be created, which would be especially bad
Packit 56e0ee
    # if $src (and thus $dsttmp) contains '*'.
Packit 56e0ee
    if test ! -f "$src" && test ! -d "$src"; then
Packit 56e0ee
      echo "$0: $src does not exist." >&2
Packit 56e0ee
      exit 1
Packit 56e0ee
    fi
Packit 56e0ee
Packit 56e0ee
    if test -z "$dst_arg"; then
Packit 56e0ee
      echo "$0: no destination specified." >&2
Packit 56e0ee
      exit 1
Packit 56e0ee
    fi
Packit 56e0ee
    dst=$dst_arg
Packit 56e0ee
Packit 56e0ee
    # If destination is a directory, append the input filename; won't work
Packit 56e0ee
    # if double slashes aren't ignored.
Packit 56e0ee
    if test -d "$dst"; then
Packit 56e0ee
      if test "$is_target_a_directory" = never; then
Packit 56e0ee
        echo "$0: $dst_arg: Is a directory" >&2
Packit 56e0ee
        exit 1
Packit 56e0ee
      fi
Packit 56e0ee
      dstdir=$dst
Packit 56e0ee
      dst=$dstdir/`basename "$src"`
Packit 56e0ee
      dstdir_status=0
Packit 56e0ee
    else
Packit 56e0ee
      dstdir=`dirname "$dst"`
Packit 56e0ee
      test -d "$dstdir"
Packit 56e0ee
      dstdir_status=$?
Packit 56e0ee
    fi
Packit 56e0ee
  fi
Packit 56e0ee
Packit 56e0ee
  obsolete_mkdir_used=false
Packit 56e0ee
Packit 56e0ee
  if test $dstdir_status != 0; then
Packit 56e0ee
    case $posix_mkdir in
Packit 56e0ee
      '')
Packit 56e0ee
        # Create intermediate dirs using mode 755 as modified by the umask.
Packit 56e0ee
        # This is like FreeBSD 'install' as of 1997-10-28.
Packit 56e0ee
        umask=`umask`
Packit 56e0ee
        case $stripcmd.$umask in
Packit 56e0ee
          # Optimize common cases.
Packit 56e0ee
          *[2367][2367]) mkdir_umask=$umask;;
Packit 56e0ee
          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
Packit 56e0ee
Packit 56e0ee
          *[0-7])
Packit 56e0ee
            mkdir_umask=`expr $umask + 22 \
Packit 56e0ee
              - $umask % 100 % 40 + $umask % 20 \
Packit 56e0ee
              - $umask % 10 % 4 + $umask % 2
Packit 56e0ee
            `;;
Packit 56e0ee
          *) mkdir_umask=$umask,go-w;;
Packit 56e0ee
        esac
Packit 56e0ee
Packit 56e0ee
        # With -d, create the new directory with the user-specified mode.
Packit 56e0ee
        # Otherwise, rely on $mkdir_umask.
Packit 56e0ee
        if test -n "$dir_arg"; then
Packit 56e0ee
          mkdir_mode=-m$mode
Packit 56e0ee
        else
Packit 56e0ee
          mkdir_mode=
Packit 56e0ee
        fi
Packit 56e0ee
Packit 56e0ee
        posix_mkdir=false
Packit 56e0ee
        case $umask in
Packit 56e0ee
          *[123567][0-7][0-7])
Packit 56e0ee
            # POSIX mkdir -p sets u+wx bits regardless of umask, which
Packit 56e0ee
            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
Packit 56e0ee
            ;;
Packit 56e0ee
          *)
Packit 56e0ee
            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
Packit 56e0ee
            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
Packit 56e0ee
Packit 56e0ee
            if (umask $mkdir_umask &&
Packit 56e0ee
                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
Packit 56e0ee
            then
Packit 56e0ee
              if test -z "$dir_arg" || {
Packit 56e0ee
                   # Check for POSIX incompatibilities with -m.
Packit 56e0ee
                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
Packit 56e0ee
                   # other-writable bit of parent directory when it shouldn't.
Packit 56e0ee
                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
Packit 56e0ee
                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
Packit 56e0ee
                   case $ls_ld_tmpdir in
Packit 56e0ee
                     d????-?r-*) different_mode=700;;
Packit 56e0ee
                     d????-?--*) different_mode=755;;
Packit 56e0ee
                     *) false;;
Packit 56e0ee
                   esac &&
Packit 56e0ee
                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
Packit 56e0ee
                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
Packit 56e0ee
                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
Packit 56e0ee
                   }
Packit 56e0ee
                 }
Packit 56e0ee
              then posix_mkdir=:
Packit 56e0ee
              fi
Packit 56e0ee
              rmdir "$tmpdir/d" "$tmpdir"
Packit 56e0ee
            else
Packit 56e0ee
              # Remove any dirs left behind by ancient mkdir implementations.
Packit 56e0ee
              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
Packit 56e0ee
            fi
Packit 56e0ee
            trap '' 0;;
Packit 56e0ee
        esac;;
Packit 56e0ee
    esac
Packit 56e0ee
Packit 56e0ee
    if
Packit 56e0ee
      $posix_mkdir && (
Packit 56e0ee
        umask $mkdir_umask &&
Packit 56e0ee
        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
Packit 56e0ee
      )
Packit 56e0ee
    then :
Packit 56e0ee
    else
Packit 56e0ee
Packit 56e0ee
      # The umask is ridiculous, or mkdir does not conform to POSIX,
Packit 56e0ee
      # or it failed possibly due to a race condition.  Create the
Packit 56e0ee
      # directory the slow way, step by step, checking for races as we go.
Packit 56e0ee
Packit 56e0ee
      case $dstdir in
Packit 56e0ee
        /*) prefix='/';;
Packit 56e0ee
        [-=\(\)!]*) prefix='./';;
Packit 56e0ee
        *)  prefix='';;
Packit 56e0ee
      esac
Packit 56e0ee
Packit 56e0ee
      oIFS=$IFS
Packit 56e0ee
      IFS=/
Packit 56e0ee
      set -f
Packit 56e0ee
      set fnord $dstdir
Packit 56e0ee
      shift
Packit 56e0ee
      set +f
Packit 56e0ee
      IFS=$oIFS
Packit 56e0ee
Packit 56e0ee
      prefixes=
Packit 56e0ee
Packit 56e0ee
      for d
Packit 56e0ee
      do
Packit 56e0ee
        test X"$d" = X && continue
Packit 56e0ee
Packit 56e0ee
        prefix=$prefix$d
Packit 56e0ee
        if test -d "$prefix"; then
Packit 56e0ee
          prefixes=
Packit 56e0ee
        else
Packit 56e0ee
          if $posix_mkdir; then
Packit 56e0ee
            (umask=$mkdir_umask &&
Packit 56e0ee
             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
Packit 56e0ee
            # Don't fail if two instances are running concurrently.
Packit 56e0ee
            test -d "$prefix" || exit 1
Packit 56e0ee
          else
Packit 56e0ee
            case $prefix in
Packit 56e0ee
              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
Packit 56e0ee
              *) qprefix=$prefix;;
Packit 56e0ee
            esac
Packit 56e0ee
            prefixes="$prefixes '$qprefix'"
Packit 56e0ee
          fi
Packit 56e0ee
        fi
Packit 56e0ee
        prefix=$prefix/
Packit 56e0ee
      done
Packit 56e0ee
Packit 56e0ee
      if test -n "$prefixes"; then
Packit 56e0ee
        # Don't fail if two instances are running concurrently.
Packit 56e0ee
        (umask $mkdir_umask &&
Packit 56e0ee
         eval "\$doit_exec \$mkdirprog $prefixes") ||
Packit 56e0ee
          test -d "$dstdir" || exit 1
Packit 56e0ee
        obsolete_mkdir_used=true
Packit 56e0ee
      fi
Packit 56e0ee
    fi
Packit 56e0ee
  fi
Packit 56e0ee
Packit 56e0ee
  if test -n "$dir_arg"; then
Packit 56e0ee
    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
Packit 56e0ee
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
Packit 56e0ee
    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
Packit 56e0ee
      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
Packit 56e0ee
  else
Packit 56e0ee
Packit 56e0ee
    # Make a couple of temp file names in the proper directory.
Packit 56e0ee
    dsttmp=$dstdir/_inst.$$_
Packit 56e0ee
    rmtmp=$dstdir/_rm.$$_
Packit 56e0ee
Packit 56e0ee
    # Trap to clean up those temp files at exit.
Packit 56e0ee
    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
Packit 56e0ee
Packit 56e0ee
    # Copy the file name to the temp name.
Packit 56e0ee
    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
Packit 56e0ee
Packit 56e0ee
    # and set any options; do chmod last to preserve setuid bits.
Packit 56e0ee
    #
Packit 56e0ee
    # If any of these fail, we abort the whole thing.  If we want to
Packit 56e0ee
    # ignore errors from any of these, just make sure not to ignore
Packit 56e0ee
    # errors from the above "$doit $cpprog $src $dsttmp" command.
Packit 56e0ee
    #
Packit 56e0ee
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
Packit 56e0ee
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
Packit 56e0ee
    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
Packit 56e0ee
    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
Packit 56e0ee
Packit 56e0ee
    # If -C, don't bother to copy if it wouldn't change the file.
Packit 56e0ee
    if $copy_on_change &&
Packit 56e0ee
       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
Packit 56e0ee
       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
Packit 56e0ee
       set -f &&
Packit 56e0ee
       set X $old && old=:$2:$4:$5:$6 &&
Packit 56e0ee
       set X $new && new=:$2:$4:$5:$6 &&
Packit 56e0ee
       set +f &&
Packit 56e0ee
       test "$old" = "$new" &&
Packit 56e0ee
       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
Packit 56e0ee
    then
Packit 56e0ee
      rm -f "$dsttmp"
Packit 56e0ee
    else
Packit 56e0ee
      # Rename the file to the real destination.
Packit 56e0ee
      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
Packit 56e0ee
Packit 56e0ee
      # The rename failed, perhaps because mv can't rename something else
Packit 56e0ee
      # to itself, or perhaps because mv is so ancient that it does not
Packit 56e0ee
      # support -f.
Packit 56e0ee
      {
Packit 56e0ee
        # Now remove or move aside any old file at destination location.
Packit 56e0ee
        # We try this two ways since rm can't unlink itself on some
Packit 56e0ee
        # systems and the destination file might be busy for other
Packit 56e0ee
        # reasons.  In this case, the final cleanup might fail but the new
Packit 56e0ee
        # file should still install successfully.
Packit 56e0ee
        {
Packit 56e0ee
          test ! -f "$dst" ||
Packit 56e0ee
          $doit $rmcmd -f "$dst" 2>/dev/null ||
Packit 56e0ee
          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
Packit 56e0ee
            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
Packit 56e0ee
          } ||
Packit 56e0ee
          { echo "$0: cannot unlink or rename $dst" >&2
Packit 56e0ee
            (exit 1); exit 1
Packit 56e0ee
          }
Packit 56e0ee
        } &&
Packit 56e0ee
Packit 56e0ee
        # Now rename the file to the real destination.
Packit 56e0ee
        $doit $mvcmd "$dsttmp" "$dst"
Packit 56e0ee
      }
Packit 56e0ee
    fi || exit 1
Packit 56e0ee
Packit 56e0ee
    trap '' 0
Packit 56e0ee
  fi
Packit 56e0ee
done
Packit 56e0ee
Packit 56e0ee
# Local variables:
Packit 56e0ee
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit 56e0ee
# time-stamp-start: "scriptversion="
Packit 56e0ee
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit 56e0ee
# time-stamp-time-zone: "UTC"
Packit 56e0ee
# time-stamp-end: "; # UTC"
Packit 56e0ee
# End: