Blame install-sh

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