xref: /netbsd-src/external/bsd/tmux/dist/etc/install-sh (revision 8f3b94834e97ac2c2a7fe1b0ae81072bf0844b41)
14e179ddaSchristos#!/bin/sh
24e179ddaSchristos# install - install a program, script, or datafile
34e179ddaSchristos
4*8f3b9483Schristosscriptversion=2016-01-11.22; # UTC
54e179ddaSchristos
64e179ddaSchristos# This originates from X11R5 (mit/util/scripts/install.sh), which was
74e179ddaSchristos# later released in X11R6 (xc/config/util/install.sh) with the
84e179ddaSchristos# following copyright and license.
94e179ddaSchristos#
104e179ddaSchristos# Copyright (C) 1994 X Consortium
114e179ddaSchristos#
124e179ddaSchristos# Permission is hereby granted, free of charge, to any person obtaining a copy
134e179ddaSchristos# of this software and associated documentation files (the "Software"), to
144e179ddaSchristos# deal in the Software without restriction, including without limitation the
154e179ddaSchristos# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
164e179ddaSchristos# sell copies of the Software, and to permit persons to whom the Software is
174e179ddaSchristos# furnished to do so, subject to the following conditions:
184e179ddaSchristos#
194e179ddaSchristos# The above copyright notice and this permission notice shall be included in
204e179ddaSchristos# all copies or substantial portions of the Software.
214e179ddaSchristos#
224e179ddaSchristos# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
234e179ddaSchristos# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
244e179ddaSchristos# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
254e179ddaSchristos# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
264e179ddaSchristos# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
274e179ddaSchristos# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
284e179ddaSchristos#
294e179ddaSchristos# Except as contained in this notice, the name of the X Consortium shall not
304e179ddaSchristos# be used in advertising or otherwise to promote the sale, use or other deal-
314e179ddaSchristos# ings in this Software without prior written authorization from the X Consor-
324e179ddaSchristos# tium.
334e179ddaSchristos#
344e179ddaSchristos#
354e179ddaSchristos# FSF changes to this file are in the public domain.
364e179ddaSchristos#
374e179ddaSchristos# Calling this script install-sh is preferred over install.sh, to prevent
384e179ddaSchristos# 'make' implicit rules from creating a file called install from it
394e179ddaSchristos# when there is no Makefile.
404e179ddaSchristos#
414e179ddaSchristos# This script is compatible with the BSD install script, but was written
424e179ddaSchristos# from scratch.
434e179ddaSchristos
444e179ddaSchristostab='	'
454e179ddaSchristosnl='
464e179ddaSchristos'
474e179ddaSchristosIFS=" $tab$nl"
484e179ddaSchristos
494e179ddaSchristos# Set DOITPROG to "echo" to test this script.
504e179ddaSchristos
514e179ddaSchristosdoit=${DOITPROG-}
524e179ddaSchristosdoit_exec=${doit:-exec}
534e179ddaSchristos
544e179ddaSchristos# Put in absolute file names if you don't have them in your path;
554e179ddaSchristos# or use environment vars.
564e179ddaSchristos
574e179ddaSchristoschgrpprog=${CHGRPPROG-chgrp}
584e179ddaSchristoschmodprog=${CHMODPROG-chmod}
594e179ddaSchristoschownprog=${CHOWNPROG-chown}
604e179ddaSchristoscmpprog=${CMPPROG-cmp}
614e179ddaSchristoscpprog=${CPPROG-cp}
624e179ddaSchristosmkdirprog=${MKDIRPROG-mkdir}
634e179ddaSchristosmvprog=${MVPROG-mv}
644e179ddaSchristosrmprog=${RMPROG-rm}
654e179ddaSchristosstripprog=${STRIPPROG-strip}
664e179ddaSchristos
674e179ddaSchristosposix_mkdir=
684e179ddaSchristos
694e179ddaSchristos# Desired mode of installed file.
704e179ddaSchristosmode=0755
714e179ddaSchristos
724e179ddaSchristoschgrpcmd=
734e179ddaSchristoschmodcmd=$chmodprog
744e179ddaSchristoschowncmd=
754e179ddaSchristosmvcmd=$mvprog
764e179ddaSchristosrmcmd="$rmprog -f"
774e179ddaSchristosstripcmd=
784e179ddaSchristos
794e179ddaSchristossrc=
804e179ddaSchristosdst=
814e179ddaSchristosdir_arg=
824e179ddaSchristosdst_arg=
834e179ddaSchristos
844e179ddaSchristoscopy_on_change=false
854e179ddaSchristosis_target_a_directory=possibly
864e179ddaSchristos
874e179ddaSchristosusage="\
884e179ddaSchristosUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
894e179ddaSchristos   or: $0 [OPTION]... SRCFILES... DIRECTORY
904e179ddaSchristos   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
914e179ddaSchristos   or: $0 [OPTION]... -d DIRECTORIES...
924e179ddaSchristos
934e179ddaSchristosIn the 1st form, copy SRCFILE to DSTFILE.
944e179ddaSchristosIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
954e179ddaSchristosIn the 4th, create DIRECTORIES.
964e179ddaSchristos
974e179ddaSchristosOptions:
984e179ddaSchristos     --help     display this help and exit.
994e179ddaSchristos     --version  display version info and exit.
1004e179ddaSchristos
1014e179ddaSchristos  -c            (ignored)
1024e179ddaSchristos  -C            install only if different (preserve the last data modification time)
1034e179ddaSchristos  -d            create directories instead of installing files.
1044e179ddaSchristos  -g GROUP      $chgrpprog installed files to GROUP.
1054e179ddaSchristos  -m MODE       $chmodprog installed files to MODE.
1064e179ddaSchristos  -o USER       $chownprog installed files to USER.
1074e179ddaSchristos  -s            $stripprog installed files.
1084e179ddaSchristos  -t DIRECTORY  install into DIRECTORY.
1094e179ddaSchristos  -T            report an error if DSTFILE is a directory.
1104e179ddaSchristos
1114e179ddaSchristosEnvironment variables override the default commands:
1124e179ddaSchristos  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
1134e179ddaSchristos  RMPROG STRIPPROG
1144e179ddaSchristos"
1154e179ddaSchristos
1164e179ddaSchristoswhile test $# -ne 0; do
1174e179ddaSchristos  case $1 in
1184e179ddaSchristos    -c) ;;
1194e179ddaSchristos
1204e179ddaSchristos    -C) copy_on_change=true;;
1214e179ddaSchristos
1224e179ddaSchristos    -d) dir_arg=true;;
1234e179ddaSchristos
1244e179ddaSchristos    -g) chgrpcmd="$chgrpprog $2"
1254e179ddaSchristos        shift;;
1264e179ddaSchristos
1274e179ddaSchristos    --help) echo "$usage"; exit $?;;
1284e179ddaSchristos
1294e179ddaSchristos    -m) mode=$2
1304e179ddaSchristos        case $mode in
1314e179ddaSchristos          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
1324e179ddaSchristos            echo "$0: invalid mode: $mode" >&2
1334e179ddaSchristos            exit 1;;
1344e179ddaSchristos        esac
1354e179ddaSchristos        shift;;
1364e179ddaSchristos
1374e179ddaSchristos    -o) chowncmd="$chownprog $2"
1384e179ddaSchristos        shift;;
1394e179ddaSchristos
1404e179ddaSchristos    -s) stripcmd=$stripprog;;
1414e179ddaSchristos
1424e179ddaSchristos    -t)
1434e179ddaSchristos        is_target_a_directory=always
1444e179ddaSchristos        dst_arg=$2
1454e179ddaSchristos        # Protect names problematic for 'test' and other utilities.
1464e179ddaSchristos        case $dst_arg in
1474e179ddaSchristos          -* | [=\(\)!]) dst_arg=./$dst_arg;;
1484e179ddaSchristos        esac
1494e179ddaSchristos        shift;;
1504e179ddaSchristos
1514e179ddaSchristos    -T) is_target_a_directory=never;;
1524e179ddaSchristos
1534e179ddaSchristos    --version) echo "$0 $scriptversion"; exit $?;;
1544e179ddaSchristos
1554e179ddaSchristos    --) shift
1564e179ddaSchristos        break;;
1574e179ddaSchristos
1584e179ddaSchristos    -*) echo "$0: invalid option: $1" >&2
1594e179ddaSchristos        exit 1;;
1604e179ddaSchristos
1614e179ddaSchristos    *)  break;;
1624e179ddaSchristos  esac
1634e179ddaSchristos  shift
1644e179ddaSchristosdone
1654e179ddaSchristos
1664e179ddaSchristos# We allow the use of options -d and -T together, by making -d
1674e179ddaSchristos# take the precedence; this is for compatibility with GNU install.
1684e179ddaSchristos
1694e179ddaSchristosif test -n "$dir_arg"; then
1704e179ddaSchristos  if test -n "$dst_arg"; then
1714e179ddaSchristos    echo "$0: target directory not allowed when installing a directory." >&2
1724e179ddaSchristos    exit 1
1734e179ddaSchristos  fi
1744e179ddaSchristosfi
1754e179ddaSchristos
1764e179ddaSchristosif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
1774e179ddaSchristos  # When -d is used, all remaining arguments are directories to create.
1784e179ddaSchristos  # When -t is used, the destination is already specified.
1794e179ddaSchristos  # Otherwise, the last argument is the destination.  Remove it from $@.
1804e179ddaSchristos  for arg
1814e179ddaSchristos  do
1824e179ddaSchristos    if test -n "$dst_arg"; then
1834e179ddaSchristos      # $@ is not empty: it contains at least $arg.
1844e179ddaSchristos      set fnord "$@" "$dst_arg"
1854e179ddaSchristos      shift # fnord
1864e179ddaSchristos    fi
1874e179ddaSchristos    shift # arg
1884e179ddaSchristos    dst_arg=$arg
1894e179ddaSchristos    # Protect names problematic for 'test' and other utilities.
1904e179ddaSchristos    case $dst_arg in
1914e179ddaSchristos      -* | [=\(\)!]) dst_arg=./$dst_arg;;
1924e179ddaSchristos    esac
1934e179ddaSchristos  done
1944e179ddaSchristosfi
1954e179ddaSchristos
1964e179ddaSchristosif test $# -eq 0; then
1974e179ddaSchristos  if test -z "$dir_arg"; then
1984e179ddaSchristos    echo "$0: no input file specified." >&2
1994e179ddaSchristos    exit 1
2004e179ddaSchristos  fi
2014e179ddaSchristos  # It's OK to call 'install-sh -d' without argument.
2024e179ddaSchristos  # This can happen when creating conditional directories.
2034e179ddaSchristos  exit 0
2044e179ddaSchristosfi
2054e179ddaSchristos
2064e179ddaSchristosif test -z "$dir_arg"; then
2074e179ddaSchristos  if test $# -gt 1 || test "$is_target_a_directory" = always; then
2084e179ddaSchristos    if test ! -d "$dst_arg"; then
2094e179ddaSchristos      echo "$0: $dst_arg: Is not a directory." >&2
2104e179ddaSchristos      exit 1
2114e179ddaSchristos    fi
2124e179ddaSchristos  fi
2134e179ddaSchristosfi
2144e179ddaSchristos
2154e179ddaSchristosif test -z "$dir_arg"; then
2164e179ddaSchristos  do_exit='(exit $ret); exit $ret'
2174e179ddaSchristos  trap "ret=129; $do_exit" 1
2184e179ddaSchristos  trap "ret=130; $do_exit" 2
2194e179ddaSchristos  trap "ret=141; $do_exit" 13
2204e179ddaSchristos  trap "ret=143; $do_exit" 15
2214e179ddaSchristos
2224e179ddaSchristos  # Set umask so as not to create temps with too-generous modes.
2234e179ddaSchristos  # However, 'strip' requires both read and write access to temps.
2244e179ddaSchristos  case $mode in
2254e179ddaSchristos    # Optimize common cases.
2264e179ddaSchristos    *644) cp_umask=133;;
2274e179ddaSchristos    *755) cp_umask=22;;
2284e179ddaSchristos
2294e179ddaSchristos    *[0-7])
2304e179ddaSchristos      if test -z "$stripcmd"; then
2314e179ddaSchristos        u_plus_rw=
2324e179ddaSchristos      else
2334e179ddaSchristos        u_plus_rw='% 200'
2344e179ddaSchristos      fi
2354e179ddaSchristos      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
2364e179ddaSchristos    *)
2374e179ddaSchristos      if test -z "$stripcmd"; then
2384e179ddaSchristos        u_plus_rw=
2394e179ddaSchristos      else
2404e179ddaSchristos        u_plus_rw=,u+rw
2414e179ddaSchristos      fi
2424e179ddaSchristos      cp_umask=$mode$u_plus_rw;;
2434e179ddaSchristos  esac
2444e179ddaSchristosfi
2454e179ddaSchristos
2464e179ddaSchristosfor src
2474e179ddaSchristosdo
2484e179ddaSchristos  # Protect names problematic for 'test' and other utilities.
2494e179ddaSchristos  case $src in
2504e179ddaSchristos    -* | [=\(\)!]) src=./$src;;
2514e179ddaSchristos  esac
2524e179ddaSchristos
2534e179ddaSchristos  if test -n "$dir_arg"; then
2544e179ddaSchristos    dst=$src
2554e179ddaSchristos    dstdir=$dst
2564e179ddaSchristos    test -d "$dstdir"
2574e179ddaSchristos    dstdir_status=$?
2584e179ddaSchristos  else
2594e179ddaSchristos
2604e179ddaSchristos    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
2614e179ddaSchristos    # might cause directories to be created, which would be especially bad
2624e179ddaSchristos    # if $src (and thus $dsttmp) contains '*'.
2634e179ddaSchristos    if test ! -f "$src" && test ! -d "$src"; then
2644e179ddaSchristos      echo "$0: $src does not exist." >&2
2654e179ddaSchristos      exit 1
2664e179ddaSchristos    fi
2674e179ddaSchristos
2684e179ddaSchristos    if test -z "$dst_arg"; then
2694e179ddaSchristos      echo "$0: no destination specified." >&2
2704e179ddaSchristos      exit 1
2714e179ddaSchristos    fi
2724e179ddaSchristos    dst=$dst_arg
2734e179ddaSchristos
2744e179ddaSchristos    # If destination is a directory, append the input filename; won't work
2754e179ddaSchristos    # if double slashes aren't ignored.
2764e179ddaSchristos    if test -d "$dst"; then
2774e179ddaSchristos      if test "$is_target_a_directory" = never; then
2784e179ddaSchristos        echo "$0: $dst_arg: Is a directory" >&2
2794e179ddaSchristos        exit 1
2804e179ddaSchristos      fi
2814e179ddaSchristos      dstdir=$dst
2824e179ddaSchristos      dst=$dstdir/`basename "$src"`
2834e179ddaSchristos      dstdir_status=0
2844e179ddaSchristos    else
2854e179ddaSchristos      dstdir=`dirname "$dst"`
2864e179ddaSchristos      test -d "$dstdir"
2874e179ddaSchristos      dstdir_status=$?
2884e179ddaSchristos    fi
2894e179ddaSchristos  fi
2904e179ddaSchristos
2914e179ddaSchristos  obsolete_mkdir_used=false
2924e179ddaSchristos
2934e179ddaSchristos  if test $dstdir_status != 0; then
2944e179ddaSchristos    case $posix_mkdir in
2954e179ddaSchristos      '')
2964e179ddaSchristos        # Create intermediate dirs using mode 755 as modified by the umask.
2974e179ddaSchristos        # This is like FreeBSD 'install' as of 1997-10-28.
2984e179ddaSchristos        umask=`umask`
2994e179ddaSchristos        case $stripcmd.$umask in
3004e179ddaSchristos          # Optimize common cases.
3014e179ddaSchristos          *[2367][2367]) mkdir_umask=$umask;;
3024e179ddaSchristos          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
3034e179ddaSchristos
3044e179ddaSchristos          *[0-7])
3054e179ddaSchristos            mkdir_umask=`expr $umask + 22 \
3064e179ddaSchristos              - $umask % 100 % 40 + $umask % 20 \
3074e179ddaSchristos              - $umask % 10 % 4 + $umask % 2
3084e179ddaSchristos            `;;
3094e179ddaSchristos          *) mkdir_umask=$umask,go-w;;
3104e179ddaSchristos        esac
3114e179ddaSchristos
3124e179ddaSchristos        # With -d, create the new directory with the user-specified mode.
3134e179ddaSchristos        # Otherwise, rely on $mkdir_umask.
3144e179ddaSchristos        if test -n "$dir_arg"; then
3154e179ddaSchristos          mkdir_mode=-m$mode
3164e179ddaSchristos        else
3174e179ddaSchristos          mkdir_mode=
3184e179ddaSchristos        fi
3194e179ddaSchristos
3204e179ddaSchristos        posix_mkdir=false
3214e179ddaSchristos        case $umask in
3224e179ddaSchristos          *[123567][0-7][0-7])
3234e179ddaSchristos            # POSIX mkdir -p sets u+wx bits regardless of umask, which
3244e179ddaSchristos            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
3254e179ddaSchristos            ;;
3264e179ddaSchristos          *)
3274e179ddaSchristos            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
328*8f3b9483Schristos            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
3294e179ddaSchristos
3304e179ddaSchristos            if (umask $mkdir_umask &&
331*8f3b9483Schristos                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
3324e179ddaSchristos            then
3334e179ddaSchristos              if test -z "$dir_arg" || {
3344e179ddaSchristos                   # Check for POSIX incompatibilities with -m.
3354e179ddaSchristos                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
3364e179ddaSchristos                   # other-writable bit of parent directory when it shouldn't.
3374e179ddaSchristos                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
338*8f3b9483Schristos                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
3394e179ddaSchristos                   case $ls_ld_tmpdir in
3404e179ddaSchristos                     d????-?r-*) different_mode=700;;
3414e179ddaSchristos                     d????-?--*) different_mode=755;;
3424e179ddaSchristos                     *) false;;
3434e179ddaSchristos                   esac &&
344*8f3b9483Schristos                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
345*8f3b9483Schristos                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
3464e179ddaSchristos                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
3474e179ddaSchristos                   }
3484e179ddaSchristos                 }
3494e179ddaSchristos              then posix_mkdir=:
3504e179ddaSchristos              fi
351*8f3b9483Schristos              rmdir "$tmpdir/d" "$tmpdir"
3524e179ddaSchristos            else
3534e179ddaSchristos              # Remove any dirs left behind by ancient mkdir implementations.
354*8f3b9483Schristos              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
3554e179ddaSchristos            fi
3564e179ddaSchristos            trap '' 0;;
3574e179ddaSchristos        esac;;
3584e179ddaSchristos    esac
3594e179ddaSchristos
3604e179ddaSchristos    if
3614e179ddaSchristos      $posix_mkdir && (
3624e179ddaSchristos        umask $mkdir_umask &&
3634e179ddaSchristos        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
3644e179ddaSchristos      )
3654e179ddaSchristos    then :
3664e179ddaSchristos    else
3674e179ddaSchristos
3684e179ddaSchristos      # The umask is ridiculous, or mkdir does not conform to POSIX,
3694e179ddaSchristos      # or it failed possibly due to a race condition.  Create the
3704e179ddaSchristos      # directory the slow way, step by step, checking for races as we go.
3714e179ddaSchristos
3724e179ddaSchristos      case $dstdir in
3734e179ddaSchristos        /*) prefix='/';;
3744e179ddaSchristos        [-=\(\)!]*) prefix='./';;
3754e179ddaSchristos        *)  prefix='';;
3764e179ddaSchristos      esac
3774e179ddaSchristos
3784e179ddaSchristos      oIFS=$IFS
3794e179ddaSchristos      IFS=/
3804e179ddaSchristos      set -f
3814e179ddaSchristos      set fnord $dstdir
3824e179ddaSchristos      shift
3834e179ddaSchristos      set +f
3844e179ddaSchristos      IFS=$oIFS
3854e179ddaSchristos
3864e179ddaSchristos      prefixes=
3874e179ddaSchristos
3884e179ddaSchristos      for d
3894e179ddaSchristos      do
3904e179ddaSchristos        test X"$d" = X && continue
3914e179ddaSchristos
3924e179ddaSchristos        prefix=$prefix$d
3934e179ddaSchristos        if test -d "$prefix"; then
3944e179ddaSchristos          prefixes=
3954e179ddaSchristos        else
3964e179ddaSchristos          if $posix_mkdir; then
3974e179ddaSchristos            (umask=$mkdir_umask &&
3984e179ddaSchristos             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
3994e179ddaSchristos            # Don't fail if two instances are running concurrently.
4004e179ddaSchristos            test -d "$prefix" || exit 1
4014e179ddaSchristos          else
4024e179ddaSchristos            case $prefix in
4034e179ddaSchristos              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
4044e179ddaSchristos              *) qprefix=$prefix;;
4054e179ddaSchristos            esac
4064e179ddaSchristos            prefixes="$prefixes '$qprefix'"
4074e179ddaSchristos          fi
4084e179ddaSchristos        fi
4094e179ddaSchristos        prefix=$prefix/
4104e179ddaSchristos      done
4114e179ddaSchristos
4124e179ddaSchristos      if test -n "$prefixes"; then
4134e179ddaSchristos        # Don't fail if two instances are running concurrently.
4144e179ddaSchristos        (umask $mkdir_umask &&
4154e179ddaSchristos         eval "\$doit_exec \$mkdirprog $prefixes") ||
4164e179ddaSchristos          test -d "$dstdir" || exit 1
4174e179ddaSchristos        obsolete_mkdir_used=true
4184e179ddaSchristos      fi
4194e179ddaSchristos    fi
4204e179ddaSchristos  fi
4214e179ddaSchristos
4224e179ddaSchristos  if test -n "$dir_arg"; then
4234e179ddaSchristos    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
4244e179ddaSchristos    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
4254e179ddaSchristos    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
4264e179ddaSchristos      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
4274e179ddaSchristos  else
4284e179ddaSchristos
4294e179ddaSchristos    # Make a couple of temp file names in the proper directory.
4304e179ddaSchristos    dsttmp=$dstdir/_inst.$$_
4314e179ddaSchristos    rmtmp=$dstdir/_rm.$$_
4324e179ddaSchristos
4334e179ddaSchristos    # Trap to clean up those temp files at exit.
4344e179ddaSchristos    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
4354e179ddaSchristos
4364e179ddaSchristos    # Copy the file name to the temp name.
4374e179ddaSchristos    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
4384e179ddaSchristos
4394e179ddaSchristos    # and set any options; do chmod last to preserve setuid bits.
4404e179ddaSchristos    #
4414e179ddaSchristos    # If any of these fail, we abort the whole thing.  If we want to
4424e179ddaSchristos    # ignore errors from any of these, just make sure not to ignore
4434e179ddaSchristos    # errors from the above "$doit $cpprog $src $dsttmp" command.
4444e179ddaSchristos    #
4454e179ddaSchristos    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
4464e179ddaSchristos    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
4474e179ddaSchristos    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
4484e179ddaSchristos    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
4494e179ddaSchristos
4504e179ddaSchristos    # If -C, don't bother to copy if it wouldn't change the file.
4514e179ddaSchristos    if $copy_on_change &&
4524e179ddaSchristos       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
4534e179ddaSchristos       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
4544e179ddaSchristos       set -f &&
4554e179ddaSchristos       set X $old && old=:$2:$4:$5:$6 &&
4564e179ddaSchristos       set X $new && new=:$2:$4:$5:$6 &&
4574e179ddaSchristos       set +f &&
4584e179ddaSchristos       test "$old" = "$new" &&
4594e179ddaSchristos       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
4604e179ddaSchristos    then
4614e179ddaSchristos      rm -f "$dsttmp"
4624e179ddaSchristos    else
4634e179ddaSchristos      # Rename the file to the real destination.
4644e179ddaSchristos      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
4654e179ddaSchristos
4664e179ddaSchristos      # The rename failed, perhaps because mv can't rename something else
4674e179ddaSchristos      # to itself, or perhaps because mv is so ancient that it does not
4684e179ddaSchristos      # support -f.
4694e179ddaSchristos      {
4704e179ddaSchristos        # Now remove or move aside any old file at destination location.
4714e179ddaSchristos        # We try this two ways since rm can't unlink itself on some
4724e179ddaSchristos        # systems and the destination file might be busy for other
4734e179ddaSchristos        # reasons.  In this case, the final cleanup might fail but the new
4744e179ddaSchristos        # file should still install successfully.
4754e179ddaSchristos        {
4764e179ddaSchristos          test ! -f "$dst" ||
4774e179ddaSchristos          $doit $rmcmd -f "$dst" 2>/dev/null ||
4784e179ddaSchristos          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
4794e179ddaSchristos            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
4804e179ddaSchristos          } ||
4814e179ddaSchristos          { echo "$0: cannot unlink or rename $dst" >&2
4824e179ddaSchristos            (exit 1); exit 1
4834e179ddaSchristos          }
4844e179ddaSchristos        } &&
4854e179ddaSchristos
4864e179ddaSchristos        # Now rename the file to the real destination.
4874e179ddaSchristos        $doit $mvcmd "$dsttmp" "$dst"
4884e179ddaSchristos      }
4894e179ddaSchristos    fi || exit 1
4904e179ddaSchristos
4914e179ddaSchristos    trap '' 0
4924e179ddaSchristos  fi
4934e179ddaSchristosdone
4944e179ddaSchristos
4954e179ddaSchristos# Local variables:
4964e179ddaSchristos# eval: (add-hook 'write-file-hooks 'time-stamp)
4974e179ddaSchristos# time-stamp-start: "scriptversion="
4984e179ddaSchristos# time-stamp-format: "%:y-%02m-%02d.%02H"
499*8f3b9483Schristos# time-stamp-time-zone: "UTC0"
5004e179ddaSchristos# time-stamp-end: "; # UTC"
5014e179ddaSchristos# End:
502