install-sh revision 04007eba
104007ebaSmrg#!/bin/sh
204007ebaSmrg# install - install a program, script, or datafile
304007ebaSmrg
404007ebaSmrgscriptversion=2011-11-20.07; # UTC
504007ebaSmrg
604007ebaSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was
704007ebaSmrg# later released in X11R6 (xc/config/util/install.sh) with the
804007ebaSmrg# following copyright and license.
904007ebaSmrg#
1004007ebaSmrg# Copyright (C) 1994 X Consortium
1104007ebaSmrg#
1204007ebaSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy
1304007ebaSmrg# of this software and associated documentation files (the "Software"), to
1404007ebaSmrg# deal in the Software without restriction, including without limitation the
1504007ebaSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1604007ebaSmrg# sell copies of the Software, and to permit persons to whom the Software is
1704007ebaSmrg# furnished to do so, subject to the following conditions:
1804007ebaSmrg#
1904007ebaSmrg# The above copyright notice and this permission notice shall be included in
2004007ebaSmrg# all copies or substantial portions of the Software.
2104007ebaSmrg#
2204007ebaSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2304007ebaSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2404007ebaSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
2504007ebaSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2604007ebaSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
2704007ebaSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2804007ebaSmrg#
2904007ebaSmrg# Except as contained in this notice, the name of the X Consortium shall not
3004007ebaSmrg# be used in advertising or otherwise to promote the sale, use or other deal-
3104007ebaSmrg# ings in this Software without prior written authorization from the X Consor-
3204007ebaSmrg# tium.
3304007ebaSmrg#
3404007ebaSmrg#
3504007ebaSmrg# FSF changes to this file are in the public domain.
3604007ebaSmrg#
3704007ebaSmrg# Calling this script install-sh is preferred over install.sh, to prevent
3804007ebaSmrg# 'make' implicit rules from creating a file called install from it
3904007ebaSmrg# when there is no Makefile.
4004007ebaSmrg#
4104007ebaSmrg# This script is compatible with the BSD install script, but was written
4204007ebaSmrg# from scratch.
4304007ebaSmrg
4404007ebaSmrgnl='
4504007ebaSmrg'
4604007ebaSmrgIFS=" ""	$nl"
4704007ebaSmrg
4804007ebaSmrg# set DOITPROG to echo to test this script
4904007ebaSmrg
5004007ebaSmrg# Don't use :- since 4.3BSD and earlier shells don't like it.
5104007ebaSmrgdoit=${DOITPROG-}
5204007ebaSmrgif test -z "$doit"; then
5304007ebaSmrg  doit_exec=exec
5404007ebaSmrgelse
5504007ebaSmrg  doit_exec=$doit
5604007ebaSmrgfi
5704007ebaSmrg
5804007ebaSmrg# Put in absolute file names if you don't have them in your path;
5904007ebaSmrg# or use environment vars.
6004007ebaSmrg
6104007ebaSmrgchgrpprog=${CHGRPPROG-chgrp}
6204007ebaSmrgchmodprog=${CHMODPROG-chmod}
6304007ebaSmrgchownprog=${CHOWNPROG-chown}
6404007ebaSmrgcmpprog=${CMPPROG-cmp}
6504007ebaSmrgcpprog=${CPPROG-cp}
6604007ebaSmrgmkdirprog=${MKDIRPROG-mkdir}
6704007ebaSmrgmvprog=${MVPROG-mv}
6804007ebaSmrgrmprog=${RMPROG-rm}
6904007ebaSmrgstripprog=${STRIPPROG-strip}
7004007ebaSmrg
7104007ebaSmrgposix_glob='?'
7204007ebaSmrginitialize_posix_glob='
7304007ebaSmrg  test "$posix_glob" != "?" || {
7404007ebaSmrg    if (set -f) 2>/dev/null; then
7504007ebaSmrg      posix_glob=
7604007ebaSmrg    else
7704007ebaSmrg      posix_glob=:
7804007ebaSmrg    fi
7904007ebaSmrg  }
8004007ebaSmrg'
8104007ebaSmrg
8204007ebaSmrgposix_mkdir=
8304007ebaSmrg
8404007ebaSmrg# Desired mode of installed file.
8504007ebaSmrgmode=0755
8604007ebaSmrg
8704007ebaSmrgchgrpcmd=
8804007ebaSmrgchmodcmd=$chmodprog
8904007ebaSmrgchowncmd=
9004007ebaSmrgmvcmd=$mvprog
9104007ebaSmrgrmcmd="$rmprog -f"
9204007ebaSmrgstripcmd=
9304007ebaSmrg
9404007ebaSmrgsrc=
9504007ebaSmrgdst=
9604007ebaSmrgdir_arg=
9704007ebaSmrgdst_arg=
9804007ebaSmrg
9904007ebaSmrgcopy_on_change=false
10004007ebaSmrgno_target_directory=
10104007ebaSmrg
10204007ebaSmrgusage="\
10304007ebaSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
10404007ebaSmrg   or: $0 [OPTION]... SRCFILES... DIRECTORY
10504007ebaSmrg   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
10604007ebaSmrg   or: $0 [OPTION]... -d DIRECTORIES...
10704007ebaSmrg
10804007ebaSmrgIn the 1st form, copy SRCFILE to DSTFILE.
10904007ebaSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
11004007ebaSmrgIn the 4th, create DIRECTORIES.
11104007ebaSmrg
11204007ebaSmrgOptions:
11304007ebaSmrg     --help     display this help and exit.
11404007ebaSmrg     --version  display version info and exit.
11504007ebaSmrg
11604007ebaSmrg  -c            (ignored)
11704007ebaSmrg  -C            install only if different (preserve the last data modification time)
11804007ebaSmrg  -d            create directories instead of installing files.
11904007ebaSmrg  -g GROUP      $chgrpprog installed files to GROUP.
12004007ebaSmrg  -m MODE       $chmodprog installed files to MODE.
12104007ebaSmrg  -o USER       $chownprog installed files to USER.
12204007ebaSmrg  -s            $stripprog installed files.
12304007ebaSmrg  -t DIRECTORY  install into DIRECTORY.
12404007ebaSmrg  -T            report an error if DSTFILE is a directory.
12504007ebaSmrg
12604007ebaSmrgEnvironment variables override the default commands:
12704007ebaSmrg  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
12804007ebaSmrg  RMPROG STRIPPROG
12904007ebaSmrg"
13004007ebaSmrg
13104007ebaSmrgwhile test $# -ne 0; do
13204007ebaSmrg  case $1 in
13304007ebaSmrg    -c) ;;
13404007ebaSmrg
13504007ebaSmrg    -C) copy_on_change=true;;
13604007ebaSmrg
13704007ebaSmrg    -d) dir_arg=true;;
13804007ebaSmrg
13904007ebaSmrg    -g) chgrpcmd="$chgrpprog $2"
14004007ebaSmrg	shift;;
14104007ebaSmrg
14204007ebaSmrg    --help) echo "$usage"; exit $?;;
14304007ebaSmrg
14404007ebaSmrg    -m) mode=$2
14504007ebaSmrg	case $mode in
14604007ebaSmrg	  *' '* | *'	'* | *'
14704007ebaSmrg'*	  | *'*'* | *'?'* | *'['*)
14804007ebaSmrg	    echo "$0: invalid mode: $mode" >&2
14904007ebaSmrg	    exit 1;;
15004007ebaSmrg	esac
15104007ebaSmrg	shift;;
15204007ebaSmrg
15304007ebaSmrg    -o) chowncmd="$chownprog $2"
15404007ebaSmrg	shift;;
15504007ebaSmrg
15604007ebaSmrg    -s) stripcmd=$stripprog;;
15704007ebaSmrg
15804007ebaSmrg    -t) dst_arg=$2
15904007ebaSmrg	# Protect names problematic for 'test' and other utilities.
16004007ebaSmrg	case $dst_arg in
16104007ebaSmrg	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
16204007ebaSmrg	esac
16304007ebaSmrg	shift;;
16404007ebaSmrg
16504007ebaSmrg    -T) no_target_directory=true;;
16604007ebaSmrg
16704007ebaSmrg    --version) echo "$0 $scriptversion"; exit $?;;
16804007ebaSmrg
16904007ebaSmrg    --)	shift
17004007ebaSmrg	break;;
17104007ebaSmrg
17204007ebaSmrg    -*)	echo "$0: invalid option: $1" >&2
17304007ebaSmrg	exit 1;;
17404007ebaSmrg
17504007ebaSmrg    *)  break;;
17604007ebaSmrg  esac
17704007ebaSmrg  shift
17804007ebaSmrgdone
17904007ebaSmrg
18004007ebaSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
18104007ebaSmrg  # When -d is used, all remaining arguments are directories to create.
18204007ebaSmrg  # When -t is used, the destination is already specified.
18304007ebaSmrg  # Otherwise, the last argument is the destination.  Remove it from $@.
18404007ebaSmrg  for arg
18504007ebaSmrg  do
18604007ebaSmrg    if test -n "$dst_arg"; then
18704007ebaSmrg      # $@ is not empty: it contains at least $arg.
18804007ebaSmrg      set fnord "$@" "$dst_arg"
18904007ebaSmrg      shift # fnord
19004007ebaSmrg    fi
19104007ebaSmrg    shift # arg
19204007ebaSmrg    dst_arg=$arg
19304007ebaSmrg    # Protect names problematic for 'test' and other utilities.
19404007ebaSmrg    case $dst_arg in
19504007ebaSmrg      -* | [=\(\)!]) dst_arg=./$dst_arg;;
19604007ebaSmrg    esac
19704007ebaSmrg  done
19804007ebaSmrgfi
19904007ebaSmrg
20004007ebaSmrgif test $# -eq 0; then
20104007ebaSmrg  if test -z "$dir_arg"; then
20204007ebaSmrg    echo "$0: no input file specified." >&2
20304007ebaSmrg    exit 1
20404007ebaSmrg  fi
20504007ebaSmrg  # It's OK to call 'install-sh -d' without argument.
20604007ebaSmrg  # This can happen when creating conditional directories.
20704007ebaSmrg  exit 0
20804007ebaSmrgfi
20904007ebaSmrg
21004007ebaSmrgif test -z "$dir_arg"; then
21104007ebaSmrg  do_exit='(exit $ret); exit $ret'
21204007ebaSmrg  trap "ret=129; $do_exit" 1
21304007ebaSmrg  trap "ret=130; $do_exit" 2
21404007ebaSmrg  trap "ret=141; $do_exit" 13
21504007ebaSmrg  trap "ret=143; $do_exit" 15
21604007ebaSmrg
21704007ebaSmrg  # Set umask so as not to create temps with too-generous modes.
21804007ebaSmrg  # However, 'strip' requires both read and write access to temps.
21904007ebaSmrg  case $mode in
22004007ebaSmrg    # Optimize common cases.
22104007ebaSmrg    *644) cp_umask=133;;
22204007ebaSmrg    *755) cp_umask=22;;
22304007ebaSmrg
22404007ebaSmrg    *[0-7])
22504007ebaSmrg      if test -z "$stripcmd"; then
22604007ebaSmrg	u_plus_rw=
22704007ebaSmrg      else
22804007ebaSmrg	u_plus_rw='% 200'
22904007ebaSmrg      fi
23004007ebaSmrg      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
23104007ebaSmrg    *)
23204007ebaSmrg      if test -z "$stripcmd"; then
23304007ebaSmrg	u_plus_rw=
23404007ebaSmrg      else
23504007ebaSmrg	u_plus_rw=,u+rw
23604007ebaSmrg      fi
23704007ebaSmrg      cp_umask=$mode$u_plus_rw;;
23804007ebaSmrg  esac
23904007ebaSmrgfi
24004007ebaSmrg
24104007ebaSmrgfor src
24204007ebaSmrgdo
24304007ebaSmrg  # Protect names problematic for 'test' and other utilities.
24404007ebaSmrg  case $src in
24504007ebaSmrg    -* | [=\(\)!]) src=./$src;;
24604007ebaSmrg  esac
24704007ebaSmrg
24804007ebaSmrg  if test -n "$dir_arg"; then
24904007ebaSmrg    dst=$src
25004007ebaSmrg    dstdir=$dst
25104007ebaSmrg    test -d "$dstdir"
25204007ebaSmrg    dstdir_status=$?
25304007ebaSmrg  else
25404007ebaSmrg
25504007ebaSmrg    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
25604007ebaSmrg    # might cause directories to be created, which would be especially bad
25704007ebaSmrg    # if $src (and thus $dsttmp) contains '*'.
25804007ebaSmrg    if test ! -f "$src" && test ! -d "$src"; then
25904007ebaSmrg      echo "$0: $src does not exist." >&2
26004007ebaSmrg      exit 1
26104007ebaSmrg    fi
26204007ebaSmrg
26304007ebaSmrg    if test -z "$dst_arg"; then
26404007ebaSmrg      echo "$0: no destination specified." >&2
26504007ebaSmrg      exit 1
26604007ebaSmrg    fi
26704007ebaSmrg    dst=$dst_arg
26804007ebaSmrg
26904007ebaSmrg    # If destination is a directory, append the input filename; won't work
27004007ebaSmrg    # if double slashes aren't ignored.
27104007ebaSmrg    if test -d "$dst"; then
27204007ebaSmrg      if test -n "$no_target_directory"; then
27304007ebaSmrg	echo "$0: $dst_arg: Is a directory" >&2
27404007ebaSmrg	exit 1
27504007ebaSmrg      fi
27604007ebaSmrg      dstdir=$dst
27704007ebaSmrg      dst=$dstdir/`basename "$src"`
27804007ebaSmrg      dstdir_status=0
27904007ebaSmrg    else
28004007ebaSmrg      # Prefer dirname, but fall back on a substitute if dirname fails.
28104007ebaSmrg      dstdir=`
28204007ebaSmrg	(dirname "$dst") 2>/dev/null ||
28304007ebaSmrg	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
28404007ebaSmrg	     X"$dst" : 'X\(//\)[^/]' \| \
28504007ebaSmrg	     X"$dst" : 'X\(//\)$' \| \
28604007ebaSmrg	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
28704007ebaSmrg	echo X"$dst" |
28804007ebaSmrg	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
28904007ebaSmrg		   s//\1/
29004007ebaSmrg		   q
29104007ebaSmrg		 }
29204007ebaSmrg		 /^X\(\/\/\)[^/].*/{
29304007ebaSmrg		   s//\1/
29404007ebaSmrg		   q
29504007ebaSmrg		 }
29604007ebaSmrg		 /^X\(\/\/\)$/{
29704007ebaSmrg		   s//\1/
29804007ebaSmrg		   q
29904007ebaSmrg		 }
30004007ebaSmrg		 /^X\(\/\).*/{
30104007ebaSmrg		   s//\1/
30204007ebaSmrg		   q
30304007ebaSmrg		 }
30404007ebaSmrg		 s/.*/./; q'
30504007ebaSmrg      `
30604007ebaSmrg
30704007ebaSmrg      test -d "$dstdir"
30804007ebaSmrg      dstdir_status=$?
30904007ebaSmrg    fi
31004007ebaSmrg  fi
31104007ebaSmrg
31204007ebaSmrg  obsolete_mkdir_used=false
31304007ebaSmrg
31404007ebaSmrg  if test $dstdir_status != 0; then
31504007ebaSmrg    case $posix_mkdir in
31604007ebaSmrg      '')
31704007ebaSmrg	# Create intermediate dirs using mode 755 as modified by the umask.
31804007ebaSmrg	# This is like FreeBSD 'install' as of 1997-10-28.
31904007ebaSmrg	umask=`umask`
32004007ebaSmrg	case $stripcmd.$umask in
32104007ebaSmrg	  # Optimize common cases.
32204007ebaSmrg	  *[2367][2367]) mkdir_umask=$umask;;
32304007ebaSmrg	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
32404007ebaSmrg
32504007ebaSmrg	  *[0-7])
32604007ebaSmrg	    mkdir_umask=`expr $umask + 22 \
32704007ebaSmrg	      - $umask % 100 % 40 + $umask % 20 \
32804007ebaSmrg	      - $umask % 10 % 4 + $umask % 2
32904007ebaSmrg	    `;;
33004007ebaSmrg	  *) mkdir_umask=$umask,go-w;;
33104007ebaSmrg	esac
33204007ebaSmrg
33304007ebaSmrg	# With -d, create the new directory with the user-specified mode.
33404007ebaSmrg	# Otherwise, rely on $mkdir_umask.
33504007ebaSmrg	if test -n "$dir_arg"; then
33604007ebaSmrg	  mkdir_mode=-m$mode
33704007ebaSmrg	else
33804007ebaSmrg	  mkdir_mode=
33904007ebaSmrg	fi
34004007ebaSmrg
34104007ebaSmrg	posix_mkdir=false
34204007ebaSmrg	case $umask in
34304007ebaSmrg	  *[123567][0-7][0-7])
34404007ebaSmrg	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
34504007ebaSmrg	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
34604007ebaSmrg	    ;;
34704007ebaSmrg	  *)
34804007ebaSmrg	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
34904007ebaSmrg	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
35004007ebaSmrg
35104007ebaSmrg	    if (umask $mkdir_umask &&
35204007ebaSmrg		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
35304007ebaSmrg	    then
35404007ebaSmrg	      if test -z "$dir_arg" || {
35504007ebaSmrg		   # Check for POSIX incompatibilities with -m.
35604007ebaSmrg		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
35704007ebaSmrg		   # other-writable bit of parent directory when it shouldn't.
35804007ebaSmrg		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
35904007ebaSmrg		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
36004007ebaSmrg		   case $ls_ld_tmpdir in
36104007ebaSmrg		     d????-?r-*) different_mode=700;;
36204007ebaSmrg		     d????-?--*) different_mode=755;;
36304007ebaSmrg		     *) false;;
36404007ebaSmrg		   esac &&
36504007ebaSmrg		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
36604007ebaSmrg		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
36704007ebaSmrg		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
36804007ebaSmrg		   }
36904007ebaSmrg		 }
37004007ebaSmrg	      then posix_mkdir=:
37104007ebaSmrg	      fi
37204007ebaSmrg	      rmdir "$tmpdir/d" "$tmpdir"
37304007ebaSmrg	    else
37404007ebaSmrg	      # Remove any dirs left behind by ancient mkdir implementations.
37504007ebaSmrg	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
37604007ebaSmrg	    fi
37704007ebaSmrg	    trap '' 0;;
37804007ebaSmrg	esac;;
37904007ebaSmrg    esac
38004007ebaSmrg
38104007ebaSmrg    if
38204007ebaSmrg      $posix_mkdir && (
38304007ebaSmrg	umask $mkdir_umask &&
38404007ebaSmrg	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
38504007ebaSmrg      )
38604007ebaSmrg    then :
38704007ebaSmrg    else
38804007ebaSmrg
38904007ebaSmrg      # The umask is ridiculous, or mkdir does not conform to POSIX,
39004007ebaSmrg      # or it failed possibly due to a race condition.  Create the
39104007ebaSmrg      # directory the slow way, step by step, checking for races as we go.
39204007ebaSmrg
39304007ebaSmrg      case $dstdir in
39404007ebaSmrg	/*) prefix='/';;
39504007ebaSmrg	[-=\(\)!]*) prefix='./';;
39604007ebaSmrg	*)  prefix='';;
39704007ebaSmrg      esac
39804007ebaSmrg
39904007ebaSmrg      eval "$initialize_posix_glob"
40004007ebaSmrg
40104007ebaSmrg      oIFS=$IFS
40204007ebaSmrg      IFS=/
40304007ebaSmrg      $posix_glob set -f
40404007ebaSmrg      set fnord $dstdir
40504007ebaSmrg      shift
40604007ebaSmrg      $posix_glob set +f
40704007ebaSmrg      IFS=$oIFS
40804007ebaSmrg
40904007ebaSmrg      prefixes=
41004007ebaSmrg
41104007ebaSmrg      for d
41204007ebaSmrg      do
41304007ebaSmrg	test X"$d" = X && continue
41404007ebaSmrg
41504007ebaSmrg	prefix=$prefix$d
41604007ebaSmrg	if test -d "$prefix"; then
41704007ebaSmrg	  prefixes=
41804007ebaSmrg	else
41904007ebaSmrg	  if $posix_mkdir; then
42004007ebaSmrg	    (umask=$mkdir_umask &&
42104007ebaSmrg	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
42204007ebaSmrg	    # Don't fail if two instances are running concurrently.
42304007ebaSmrg	    test -d "$prefix" || exit 1
42404007ebaSmrg	  else
42504007ebaSmrg	    case $prefix in
42604007ebaSmrg	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
42704007ebaSmrg	      *) qprefix=$prefix;;
42804007ebaSmrg	    esac
42904007ebaSmrg	    prefixes="$prefixes '$qprefix'"
43004007ebaSmrg	  fi
43104007ebaSmrg	fi
43204007ebaSmrg	prefix=$prefix/
43304007ebaSmrg      done
43404007ebaSmrg
43504007ebaSmrg      if test -n "$prefixes"; then
43604007ebaSmrg	# Don't fail if two instances are running concurrently.
43704007ebaSmrg	(umask $mkdir_umask &&
43804007ebaSmrg	 eval "\$doit_exec \$mkdirprog $prefixes") ||
43904007ebaSmrg	  test -d "$dstdir" || exit 1
44004007ebaSmrg	obsolete_mkdir_used=true
44104007ebaSmrg      fi
44204007ebaSmrg    fi
44304007ebaSmrg  fi
44404007ebaSmrg
44504007ebaSmrg  if test -n "$dir_arg"; then
44604007ebaSmrg    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
44704007ebaSmrg    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
44804007ebaSmrg    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
44904007ebaSmrg      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
45004007ebaSmrg  else
45104007ebaSmrg
45204007ebaSmrg    # Make a couple of temp file names in the proper directory.
45304007ebaSmrg    dsttmp=$dstdir/_inst.$$_
45404007ebaSmrg    rmtmp=$dstdir/_rm.$$_
45504007ebaSmrg
45604007ebaSmrg    # Trap to clean up those temp files at exit.
45704007ebaSmrg    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
45804007ebaSmrg
45904007ebaSmrg    # Copy the file name to the temp name.
46004007ebaSmrg    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
46104007ebaSmrg
46204007ebaSmrg    # and set any options; do chmod last to preserve setuid bits.
46304007ebaSmrg    #
46404007ebaSmrg    # If any of these fail, we abort the whole thing.  If we want to
46504007ebaSmrg    # ignore errors from any of these, just make sure not to ignore
46604007ebaSmrg    # errors from the above "$doit $cpprog $src $dsttmp" command.
46704007ebaSmrg    #
46804007ebaSmrg    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
46904007ebaSmrg    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
47004007ebaSmrg    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
47104007ebaSmrg    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
47204007ebaSmrg
47304007ebaSmrg    # If -C, don't bother to copy if it wouldn't change the file.
47404007ebaSmrg    if $copy_on_change &&
47504007ebaSmrg       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
47604007ebaSmrg       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
47704007ebaSmrg
47804007ebaSmrg       eval "$initialize_posix_glob" &&
47904007ebaSmrg       $posix_glob set -f &&
48004007ebaSmrg       set X $old && old=:$2:$4:$5:$6 &&
48104007ebaSmrg       set X $new && new=:$2:$4:$5:$6 &&
48204007ebaSmrg       $posix_glob set +f &&
48304007ebaSmrg
48404007ebaSmrg       test "$old" = "$new" &&
48504007ebaSmrg       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
48604007ebaSmrg    then
48704007ebaSmrg      rm -f "$dsttmp"
48804007ebaSmrg    else
48904007ebaSmrg      # Rename the file to the real destination.
49004007ebaSmrg      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
49104007ebaSmrg
49204007ebaSmrg      # The rename failed, perhaps because mv can't rename something else
49304007ebaSmrg      # to itself, or perhaps because mv is so ancient that it does not
49404007ebaSmrg      # support -f.
49504007ebaSmrg      {
49604007ebaSmrg	# Now remove or move aside any old file at destination location.
49704007ebaSmrg	# We try this two ways since rm can't unlink itself on some
49804007ebaSmrg	# systems and the destination file might be busy for other
49904007ebaSmrg	# reasons.  In this case, the final cleanup might fail but the new
50004007ebaSmrg	# file should still install successfully.
50104007ebaSmrg	{
50204007ebaSmrg	  test ! -f "$dst" ||
50304007ebaSmrg	  $doit $rmcmd -f "$dst" 2>/dev/null ||
50404007ebaSmrg	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
50504007ebaSmrg	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
50604007ebaSmrg	  } ||
50704007ebaSmrg	  { echo "$0: cannot unlink or rename $dst" >&2
50804007ebaSmrg	    (exit 1); exit 1
50904007ebaSmrg	  }
51004007ebaSmrg	} &&
51104007ebaSmrg
51204007ebaSmrg	# Now rename the file to the real destination.
51304007ebaSmrg	$doit $mvcmd "$dsttmp" "$dst"
51404007ebaSmrg      }
51504007ebaSmrg    fi || exit 1
51604007ebaSmrg
51704007ebaSmrg    trap '' 0
51804007ebaSmrg  fi
51904007ebaSmrgdone
52004007ebaSmrg
52104007ebaSmrg# Local variables:
52204007ebaSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
52304007ebaSmrg# time-stamp-start: "scriptversion="
52404007ebaSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
52504007ebaSmrg# time-stamp-time-zone: "UTC"
52604007ebaSmrg# time-stamp-end: "; # UTC"
52704007ebaSmrg# End:
528