193249ebfSmrg#!/bin/sh
293249ebfSmrg# install - install a program, script, or datafile
393249ebfSmrg
493249ebfSmrgscriptversion=2020-11-14.01; # UTC
593249ebfSmrg
693249ebfSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was
793249ebfSmrg# later released in X11R6 (xc/config/util/install.sh) with the
893249ebfSmrg# following copyright and license.
993249ebfSmrg#
1093249ebfSmrg# Copyright (C) 1994 X Consortium
1193249ebfSmrg#
1293249ebfSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy
1393249ebfSmrg# of this software and associated documentation files (the "Software"), to
1493249ebfSmrg# deal in the Software without restriction, including without limitation the
1593249ebfSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1693249ebfSmrg# sell copies of the Software, and to permit persons to whom the Software is
1793249ebfSmrg# furnished to do so, subject to the following conditions:
1893249ebfSmrg#
1993249ebfSmrg# The above copyright notice and this permission notice shall be included in
2093249ebfSmrg# all copies or substantial portions of the Software.
2193249ebfSmrg#
2293249ebfSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2393249ebfSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2493249ebfSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
2593249ebfSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2693249ebfSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
2793249ebfSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2893249ebfSmrg#
2993249ebfSmrg# Except as contained in this notice, the name of the X Consortium shall not
3093249ebfSmrg# be used in advertising or otherwise to promote the sale, use or other deal-
3193249ebfSmrg# ings in this Software without prior written authorization from the X Consor-
3293249ebfSmrg# tium.
3393249ebfSmrg#
3493249ebfSmrg#
3593249ebfSmrg# FSF changes to this file are in the public domain.
3693249ebfSmrg#
3793249ebfSmrg# Calling this script install-sh is preferred over install.sh, to prevent
3893249ebfSmrg# 'make' implicit rules from creating a file called install from it
3993249ebfSmrg# when there is no Makefile.
4093249ebfSmrg#
4193249ebfSmrg# This script is compatible with the BSD install script, but was written
4293249ebfSmrg# from scratch.
4393249ebfSmrg
4493249ebfSmrgtab='	'
4593249ebfSmrgnl='
4693249ebfSmrg'
4793249ebfSmrgIFS=" $tab$nl"
4893249ebfSmrg
4993249ebfSmrg# Set DOITPROG to "echo" to test this script.
5093249ebfSmrg
5193249ebfSmrgdoit=${DOITPROG-}
5293249ebfSmrgdoit_exec=${doit:-exec}
5393249ebfSmrg
5493249ebfSmrg# Put in absolute file names if you don't have them in your path;
5593249ebfSmrg# or use environment vars.
5693249ebfSmrg
5793249ebfSmrgchgrpprog=${CHGRPPROG-chgrp}
5893249ebfSmrgchmodprog=${CHMODPROG-chmod}
5993249ebfSmrgchownprog=${CHOWNPROG-chown}
6093249ebfSmrgcmpprog=${CMPPROG-cmp}
6193249ebfSmrgcpprog=${CPPROG-cp}
6293249ebfSmrgmkdirprog=${MKDIRPROG-mkdir}
6393249ebfSmrgmvprog=${MVPROG-mv}
6493249ebfSmrgrmprog=${RMPROG-rm}
6593249ebfSmrgstripprog=${STRIPPROG-strip}
6693249ebfSmrg
6793249ebfSmrgposix_mkdir=
6893249ebfSmrg
6993249ebfSmrg# Desired mode of installed file.
7093249ebfSmrgmode=0755
7193249ebfSmrg
7293249ebfSmrg# Create dirs (including intermediate dirs) using mode 755.
7393249ebfSmrg# This is like GNU 'install' as of coreutils 8.32 (2020).
7493249ebfSmrgmkdir_umask=22
7593249ebfSmrg
7693249ebfSmrgbackupsuffix=
7793249ebfSmrgchgrpcmd=
7893249ebfSmrgchmodcmd=$chmodprog
7993249ebfSmrgchowncmd=
8093249ebfSmrgmvcmd=$mvprog
8193249ebfSmrgrmcmd="$rmprog -f"
8293249ebfSmrgstripcmd=
8393249ebfSmrg
8493249ebfSmrgsrc=
8593249ebfSmrgdst=
8693249ebfSmrgdir_arg=
8793249ebfSmrgdst_arg=
8893249ebfSmrg
8993249ebfSmrgcopy_on_change=false
9093249ebfSmrgis_target_a_directory=possibly
9193249ebfSmrg
9293249ebfSmrgusage="\
9393249ebfSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
9493249ebfSmrg   or: $0 [OPTION]... SRCFILES... DIRECTORY
9593249ebfSmrg   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
9693249ebfSmrg   or: $0 [OPTION]... -d DIRECTORIES...
9793249ebfSmrg
9893249ebfSmrgIn the 1st form, copy SRCFILE to DSTFILE.
9993249ebfSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
10093249ebfSmrgIn the 4th, create DIRECTORIES.
10193249ebfSmrg
10293249ebfSmrgOptions:
10393249ebfSmrg     --help     display this help and exit.
10493249ebfSmrg     --version  display version info and exit.
10593249ebfSmrg
10693249ebfSmrg  -c            (ignored)
10793249ebfSmrg  -C            install only if different (preserve data modification time)
10893249ebfSmrg  -d            create directories instead of installing files.
10993249ebfSmrg  -g GROUP      $chgrpprog installed files to GROUP.
11093249ebfSmrg  -m MODE       $chmodprog installed files to MODE.
11193249ebfSmrg  -o USER       $chownprog installed files to USER.
11293249ebfSmrg  -p            pass -p to $cpprog.
11393249ebfSmrg  -s            $stripprog installed files.
11493249ebfSmrg  -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.
11593249ebfSmrg  -t DIRECTORY  install into DIRECTORY.
11693249ebfSmrg  -T            report an error if DSTFILE is a directory.
11793249ebfSmrg
11893249ebfSmrgEnvironment variables override the default commands:
11993249ebfSmrg  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
12093249ebfSmrg  RMPROG STRIPPROG
12193249ebfSmrg
12293249ebfSmrgBy default, rm is invoked with -f; when overridden with RMPROG,
12393249ebfSmrgit's up to you to specify -f if you want it.
12493249ebfSmrg
12593249ebfSmrgIf -S is not specified, no backups are attempted.
12693249ebfSmrg
12793249ebfSmrgEmail bug reports to bug-automake@gnu.org.
12893249ebfSmrgAutomake home page: https://www.gnu.org/software/automake/
12993249ebfSmrg"
13093249ebfSmrg
13193249ebfSmrgwhile test $# -ne 0; do
13293249ebfSmrg  case $1 in
13393249ebfSmrg    -c) ;;
13493249ebfSmrg
13593249ebfSmrg    -C) copy_on_change=true;;
13693249ebfSmrg
13793249ebfSmrg    -d) dir_arg=true;;
13893249ebfSmrg
13993249ebfSmrg    -g) chgrpcmd="$chgrpprog $2"
14093249ebfSmrg        shift;;
14193249ebfSmrg
14293249ebfSmrg    --help) echo "$usage"; exit $?;;
14393249ebfSmrg
14493249ebfSmrg    -m) mode=$2
14593249ebfSmrg        case $mode in
14693249ebfSmrg          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
14793249ebfSmrg            echo "$0: invalid mode: $mode" >&2
14893249ebfSmrg            exit 1;;
14993249ebfSmrg        esac
15093249ebfSmrg        shift;;
15193249ebfSmrg
15293249ebfSmrg    -o) chowncmd="$chownprog $2"
15393249ebfSmrg        shift;;
15493249ebfSmrg
15593249ebfSmrg    -p) cpprog="$cpprog -p";;
15693249ebfSmrg
15793249ebfSmrg    -s) stripcmd=$stripprog;;
15893249ebfSmrg
15993249ebfSmrg    -S) backupsuffix="$2"
16093249ebfSmrg        shift;;
16193249ebfSmrg
16293249ebfSmrg    -t)
16393249ebfSmrg        is_target_a_directory=always
16493249ebfSmrg        dst_arg=$2
16593249ebfSmrg        # Protect names problematic for 'test' and other utilities.
16693249ebfSmrg        case $dst_arg in
16793249ebfSmrg          -* | [=\(\)!]) dst_arg=./$dst_arg;;
16893249ebfSmrg        esac
16993249ebfSmrg        shift;;
17093249ebfSmrg
17193249ebfSmrg    -T) is_target_a_directory=never;;
17293249ebfSmrg
17393249ebfSmrg    --version) echo "$0 $scriptversion"; exit $?;;
17493249ebfSmrg
17593249ebfSmrg    --) shift
17693249ebfSmrg        break;;
17793249ebfSmrg
17893249ebfSmrg    -*) echo "$0: invalid option: $1" >&2
17993249ebfSmrg        exit 1;;
18093249ebfSmrg
18193249ebfSmrg    *)  break;;
18293249ebfSmrg  esac
18393249ebfSmrg  shift
18493249ebfSmrgdone
18593249ebfSmrg
18693249ebfSmrg# We allow the use of options -d and -T together, by making -d
18793249ebfSmrg# take the precedence; this is for compatibility with GNU install.
18893249ebfSmrg
18993249ebfSmrgif test -n "$dir_arg"; then
19093249ebfSmrg  if test -n "$dst_arg"; then
19193249ebfSmrg    echo "$0: target directory not allowed when installing a directory." >&2
19293249ebfSmrg    exit 1
19393249ebfSmrg  fi
19493249ebfSmrgfi
19593249ebfSmrg
19693249ebfSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
19793249ebfSmrg  # When -d is used, all remaining arguments are directories to create.
19893249ebfSmrg  # When -t is used, the destination is already specified.
19993249ebfSmrg  # Otherwise, the last argument is the destination.  Remove it from $@.
20093249ebfSmrg  for arg
20193249ebfSmrg  do
20293249ebfSmrg    if test -n "$dst_arg"; then
20393249ebfSmrg      # $@ is not empty: it contains at least $arg.
20493249ebfSmrg      set fnord "$@" "$dst_arg"
20593249ebfSmrg      shift # fnord
20693249ebfSmrg    fi
20793249ebfSmrg    shift # arg
20893249ebfSmrg    dst_arg=$arg
20993249ebfSmrg    # Protect names problematic for 'test' and other utilities.
21093249ebfSmrg    case $dst_arg in
21193249ebfSmrg      -* | [=\(\)!]) dst_arg=./$dst_arg;;
21293249ebfSmrg    esac
21393249ebfSmrg  done
21493249ebfSmrgfi
21593249ebfSmrg
21693249ebfSmrgif test $# -eq 0; then
21793249ebfSmrg  if test -z "$dir_arg"; then
21893249ebfSmrg    echo "$0: no input file specified." >&2
21993249ebfSmrg    exit 1
22093249ebfSmrg  fi
22193249ebfSmrg  # It's OK to call 'install-sh -d' without argument.
22293249ebfSmrg  # This can happen when creating conditional directories.
22393249ebfSmrg  exit 0
22493249ebfSmrgfi
22593249ebfSmrg
22693249ebfSmrgif test -z "$dir_arg"; then
22793249ebfSmrg  if test $# -gt 1 || test "$is_target_a_directory" = always; then
22893249ebfSmrg    if test ! -d "$dst_arg"; then
22993249ebfSmrg      echo "$0: $dst_arg: Is not a directory." >&2
23093249ebfSmrg      exit 1
23193249ebfSmrg    fi
23293249ebfSmrg  fi
23393249ebfSmrgfi
23493249ebfSmrg
23593249ebfSmrgif test -z "$dir_arg"; then
23693249ebfSmrg  do_exit='(exit $ret); exit $ret'
23793249ebfSmrg  trap "ret=129; $do_exit" 1
23893249ebfSmrg  trap "ret=130; $do_exit" 2
23993249ebfSmrg  trap "ret=141; $do_exit" 13
24093249ebfSmrg  trap "ret=143; $do_exit" 15
24193249ebfSmrg
24293249ebfSmrg  # Set umask so as not to create temps with too-generous modes.
24393249ebfSmrg  # However, 'strip' requires both read and write access to temps.
24493249ebfSmrg  case $mode in
24593249ebfSmrg    # Optimize common cases.
24693249ebfSmrg    *644) cp_umask=133;;
24793249ebfSmrg    *755) cp_umask=22;;
24893249ebfSmrg
24993249ebfSmrg    *[0-7])
25093249ebfSmrg      if test -z "$stripcmd"; then
25193249ebfSmrg        u_plus_rw=
25293249ebfSmrg      else
25393249ebfSmrg        u_plus_rw='% 200'
25493249ebfSmrg      fi
25593249ebfSmrg      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
25693249ebfSmrg    *)
25793249ebfSmrg      if test -z "$stripcmd"; then
25893249ebfSmrg        u_plus_rw=
25993249ebfSmrg      else
26093249ebfSmrg        u_plus_rw=,u+rw
26193249ebfSmrg      fi
26293249ebfSmrg      cp_umask=$mode$u_plus_rw;;
26393249ebfSmrg  esac
26493249ebfSmrgfi
26593249ebfSmrg
26693249ebfSmrgfor src
26793249ebfSmrgdo
26893249ebfSmrg  # Protect names problematic for 'test' and other utilities.
26993249ebfSmrg  case $src in
27093249ebfSmrg    -* | [=\(\)!]) src=./$src;;
27193249ebfSmrg  esac
27293249ebfSmrg
27393249ebfSmrg  if test -n "$dir_arg"; then
27493249ebfSmrg    dst=$src
27593249ebfSmrg    dstdir=$dst
27693249ebfSmrg    test -d "$dstdir"
27793249ebfSmrg    dstdir_status=$?
27893249ebfSmrg    # Don't chown directories that already exist.
27993249ebfSmrg    if test $dstdir_status = 0; then
28093249ebfSmrg      chowncmd=""
28193249ebfSmrg    fi
28293249ebfSmrg  else
28393249ebfSmrg
28493249ebfSmrg    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
28593249ebfSmrg    # might cause directories to be created, which would be especially bad
28693249ebfSmrg    # if $src (and thus $dsttmp) contains '*'.
28793249ebfSmrg    if test ! -f "$src" && test ! -d "$src"; then
28893249ebfSmrg      echo "$0: $src does not exist." >&2
28993249ebfSmrg      exit 1
29093249ebfSmrg    fi
29193249ebfSmrg
29293249ebfSmrg    if test -z "$dst_arg"; then
29393249ebfSmrg      echo "$0: no destination specified." >&2
29493249ebfSmrg      exit 1
29593249ebfSmrg    fi
29693249ebfSmrg    dst=$dst_arg
29793249ebfSmrg
29893249ebfSmrg    # If destination is a directory, append the input filename.
29993249ebfSmrg    if test -d "$dst"; then
30093249ebfSmrg      if test "$is_target_a_directory" = never; then
30193249ebfSmrg        echo "$0: $dst_arg: Is a directory" >&2
30293249ebfSmrg        exit 1
30393249ebfSmrg      fi
30493249ebfSmrg      dstdir=$dst
30593249ebfSmrg      dstbase=`basename "$src"`
30693249ebfSmrg      case $dst in
30793249ebfSmrg	*/) dst=$dst$dstbase;;
30893249ebfSmrg	*)  dst=$dst/$dstbase;;
30993249ebfSmrg      esac
31093249ebfSmrg      dstdir_status=0
31193249ebfSmrg    else
31293249ebfSmrg      dstdir=`dirname "$dst"`
31393249ebfSmrg      test -d "$dstdir"
31493249ebfSmrg      dstdir_status=$?
31593249ebfSmrg    fi
31693249ebfSmrg  fi
31793249ebfSmrg
31893249ebfSmrg  case $dstdir in
31993249ebfSmrg    */) dstdirslash=$dstdir;;
32093249ebfSmrg    *)  dstdirslash=$dstdir/;;
32193249ebfSmrg  esac
32293249ebfSmrg
32393249ebfSmrg  obsolete_mkdir_used=false
32493249ebfSmrg
32593249ebfSmrg  if test $dstdir_status != 0; then
32693249ebfSmrg    case $posix_mkdir in
32793249ebfSmrg      '')
32893249ebfSmrg        # With -d, create the new directory with the user-specified mode.
32993249ebfSmrg        # Otherwise, rely on $mkdir_umask.
33093249ebfSmrg        if test -n "$dir_arg"; then
33193249ebfSmrg          mkdir_mode=-m$mode
33293249ebfSmrg        else
33393249ebfSmrg          mkdir_mode=
33493249ebfSmrg        fi
33593249ebfSmrg
33693249ebfSmrg        posix_mkdir=false
33793249ebfSmrg	# The $RANDOM variable is not portable (e.g., dash).  Use it
33893249ebfSmrg	# here however when possible just to lower collision chance.
33993249ebfSmrg	tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
34093249ebfSmrg
34193249ebfSmrg	trap '
34293249ebfSmrg	  ret=$?
34393249ebfSmrg	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
34493249ebfSmrg	  exit $ret
34593249ebfSmrg	' 0
34693249ebfSmrg
34793249ebfSmrg	# Because "mkdir -p" follows existing symlinks and we likely work
34893249ebfSmrg	# directly in world-writeable /tmp, make sure that the '$tmpdir'
34993249ebfSmrg	# directory is successfully created first before we actually test
35093249ebfSmrg	# 'mkdir -p'.
35193249ebfSmrg	if (umask $mkdir_umask &&
35293249ebfSmrg	    $mkdirprog $mkdir_mode "$tmpdir" &&
35393249ebfSmrg	    exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
35493249ebfSmrg	then
35593249ebfSmrg	  if test -z "$dir_arg" || {
35693249ebfSmrg	       # Check for POSIX incompatibilities with -m.
35793249ebfSmrg	       # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
35893249ebfSmrg	       # other-writable bit of parent directory when it shouldn't.
35993249ebfSmrg	       # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
36093249ebfSmrg	       test_tmpdir="$tmpdir/a"
36193249ebfSmrg	       ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
36293249ebfSmrg	       case $ls_ld_tmpdir in
36393249ebfSmrg		 d????-?r-*) different_mode=700;;
36493249ebfSmrg		 d????-?--*) different_mode=755;;
36593249ebfSmrg		 *) false;;
36693249ebfSmrg	       esac &&
36793249ebfSmrg	       $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
36893249ebfSmrg		 ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
36993249ebfSmrg		 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
37093249ebfSmrg	       }
37193249ebfSmrg	     }
37293249ebfSmrg	  then posix_mkdir=:
37393249ebfSmrg	  fi
37493249ebfSmrg	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
37593249ebfSmrg	else
37693249ebfSmrg	  # Remove any dirs left behind by ancient mkdir implementations.
37793249ebfSmrg	  rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
37893249ebfSmrg	fi
37993249ebfSmrg	trap '' 0;;
38093249ebfSmrg    esac
38193249ebfSmrg
38293249ebfSmrg    if
38393249ebfSmrg      $posix_mkdir && (
38493249ebfSmrg        umask $mkdir_umask &&
38593249ebfSmrg        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
38693249ebfSmrg      )
38793249ebfSmrg    then :
38893249ebfSmrg    else
38993249ebfSmrg
39093249ebfSmrg      # mkdir does not conform to POSIX,
39193249ebfSmrg      # or it failed possibly due to a race condition.  Create the
39293249ebfSmrg      # directory the slow way, step by step, checking for races as we go.
39393249ebfSmrg
39493249ebfSmrg      case $dstdir in
39593249ebfSmrg        /*) prefix='/';;
39693249ebfSmrg        [-=\(\)!]*) prefix='./';;
39793249ebfSmrg        *)  prefix='';;
39893249ebfSmrg      esac
39993249ebfSmrg
40093249ebfSmrg      oIFS=$IFS
40193249ebfSmrg      IFS=/
40293249ebfSmrg      set -f
40393249ebfSmrg      set fnord $dstdir
40493249ebfSmrg      shift
40593249ebfSmrg      set +f
40693249ebfSmrg      IFS=$oIFS
40793249ebfSmrg
40893249ebfSmrg      prefixes=
40993249ebfSmrg
41093249ebfSmrg      for d
41193249ebfSmrg      do
41293249ebfSmrg        test X"$d" = X && continue
41393249ebfSmrg
41493249ebfSmrg        prefix=$prefix$d
41593249ebfSmrg        if test -d "$prefix"; then
41693249ebfSmrg          prefixes=
41793249ebfSmrg        else
41893249ebfSmrg          if $posix_mkdir; then
41993249ebfSmrg            (umask $mkdir_umask &&
42093249ebfSmrg             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
42193249ebfSmrg            # Don't fail if two instances are running concurrently.
42293249ebfSmrg            test -d "$prefix" || exit 1
42393249ebfSmrg          else
42493249ebfSmrg            case $prefix in
42593249ebfSmrg              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
42693249ebfSmrg              *) qprefix=$prefix;;
42793249ebfSmrg            esac
42893249ebfSmrg            prefixes="$prefixes '$qprefix'"
42993249ebfSmrg          fi
43093249ebfSmrg        fi
43193249ebfSmrg        prefix=$prefix/
43293249ebfSmrg      done
43393249ebfSmrg
43493249ebfSmrg      if test -n "$prefixes"; then
43593249ebfSmrg        # Don't fail if two instances are running concurrently.
43693249ebfSmrg        (umask $mkdir_umask &&
43793249ebfSmrg         eval "\$doit_exec \$mkdirprog $prefixes") ||
43893249ebfSmrg          test -d "$dstdir" || exit 1
43993249ebfSmrg        obsolete_mkdir_used=true
44093249ebfSmrg      fi
44193249ebfSmrg    fi
44293249ebfSmrg  fi
44393249ebfSmrg
44493249ebfSmrg  if test -n "$dir_arg"; then
44593249ebfSmrg    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
44693249ebfSmrg    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
44793249ebfSmrg    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
44893249ebfSmrg      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
44993249ebfSmrg  else
45093249ebfSmrg
45193249ebfSmrg    # Make a couple of temp file names in the proper directory.
45293249ebfSmrg    dsttmp=${dstdirslash}_inst.$$_
45393249ebfSmrg    rmtmp=${dstdirslash}_rm.$$_
45493249ebfSmrg
45593249ebfSmrg    # Trap to clean up those temp files at exit.
45693249ebfSmrg    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
45793249ebfSmrg
45893249ebfSmrg    # Copy the file name to the temp name.
45993249ebfSmrg    (umask $cp_umask &&
46093249ebfSmrg     { test -z "$stripcmd" || {
46193249ebfSmrg	 # Create $dsttmp read-write so that cp doesn't create it read-only,
46293249ebfSmrg	 # which would cause strip to fail.
46393249ebfSmrg	 if test -z "$doit"; then
46493249ebfSmrg	   : >"$dsttmp" # No need to fork-exec 'touch'.
46593249ebfSmrg	 else
46693249ebfSmrg	   $doit touch "$dsttmp"
46793249ebfSmrg	 fi
46893249ebfSmrg       }
46993249ebfSmrg     } &&
47093249ebfSmrg     $doit_exec $cpprog "$src" "$dsttmp") &&
47193249ebfSmrg
47293249ebfSmrg    # and set any options; do chmod last to preserve setuid bits.
47393249ebfSmrg    #
47493249ebfSmrg    # If any of these fail, we abort the whole thing.  If we want to
47593249ebfSmrg    # ignore errors from any of these, just make sure not to ignore
47693249ebfSmrg    # errors from the above "$doit $cpprog $src $dsttmp" command.
47793249ebfSmrg    #
47893249ebfSmrg    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
47993249ebfSmrg    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
48093249ebfSmrg    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
48193249ebfSmrg    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
48293249ebfSmrg
48393249ebfSmrg    # If -C, don't bother to copy if it wouldn't change the file.
48493249ebfSmrg    if $copy_on_change &&
48593249ebfSmrg       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
48693249ebfSmrg       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
48793249ebfSmrg       set -f &&
48893249ebfSmrg       set X $old && old=:$2:$4:$5:$6 &&
48993249ebfSmrg       set X $new && new=:$2:$4:$5:$6 &&
49093249ebfSmrg       set +f &&
49193249ebfSmrg       test "$old" = "$new" &&
49293249ebfSmrg       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
49393249ebfSmrg    then
49493249ebfSmrg      rm -f "$dsttmp"
49593249ebfSmrg    else
49693249ebfSmrg      # If $backupsuffix is set, and the file being installed
49793249ebfSmrg      # already exists, attempt a backup.  Don't worry if it fails,
49893249ebfSmrg      # e.g., if mv doesn't support -f.
49993249ebfSmrg      if test -n "$backupsuffix" && test -f "$dst"; then
50093249ebfSmrg        $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
50193249ebfSmrg      fi
50293249ebfSmrg
50393249ebfSmrg      # Rename the file to the real destination.
50493249ebfSmrg      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
50593249ebfSmrg
50693249ebfSmrg      # The rename failed, perhaps because mv can't rename something else
50793249ebfSmrg      # to itself, or perhaps because mv is so ancient that it does not
50893249ebfSmrg      # support -f.
50993249ebfSmrg      {
51093249ebfSmrg        # Now remove or move aside any old file at destination location.
51193249ebfSmrg        # We try this two ways since rm can't unlink itself on some
51293249ebfSmrg        # systems and the destination file might be busy for other
51393249ebfSmrg        # reasons.  In this case, the final cleanup might fail but the new
51493249ebfSmrg        # file should still install successfully.
51593249ebfSmrg        {
51693249ebfSmrg          test ! -f "$dst" ||
51793249ebfSmrg          $doit $rmcmd "$dst" 2>/dev/null ||
51893249ebfSmrg          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
51993249ebfSmrg            { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
52093249ebfSmrg          } ||
52193249ebfSmrg          { echo "$0: cannot unlink or rename $dst" >&2
52293249ebfSmrg            (exit 1); exit 1
52393249ebfSmrg          }
52493249ebfSmrg        } &&
52593249ebfSmrg
52693249ebfSmrg        # Now rename the file to the real destination.
52793249ebfSmrg        $doit $mvcmd "$dsttmp" "$dst"
52893249ebfSmrg      }
52993249ebfSmrg    fi || exit 1
53093249ebfSmrg
53193249ebfSmrg    trap '' 0
53293249ebfSmrg  fi
53393249ebfSmrgdone
53493249ebfSmrg
53593249ebfSmrg# Local variables:
53693249ebfSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
53793249ebfSmrg# time-stamp-start: "scriptversion="
53893249ebfSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
53993249ebfSmrg# time-stamp-time-zone: "UTC0"
54093249ebfSmrg# time-stamp-end: "; # UTC"
54193249ebfSmrg# End:
542