install-sh revision 0fa2845d
10fa2845dSmrg#!/bin/sh
20fa2845dSmrg# install - install a program, script, or datafile
30fa2845dSmrg
40fa2845dSmrgscriptversion=2006-10-14.15
50fa2845dSmrg
60fa2845dSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was
70fa2845dSmrg# later released in X11R6 (xc/config/util/install.sh) with the
80fa2845dSmrg# following copyright and license.
90fa2845dSmrg#
100fa2845dSmrg# Copyright (C) 1994 X Consortium
110fa2845dSmrg#
120fa2845dSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy
130fa2845dSmrg# of this software and associated documentation files (the "Software"), to
140fa2845dSmrg# deal in the Software without restriction, including without limitation the
150fa2845dSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
160fa2845dSmrg# sell copies of the Software, and to permit persons to whom the Software is
170fa2845dSmrg# furnished to do so, subject to the following conditions:
180fa2845dSmrg#
190fa2845dSmrg# The above copyright notice and this permission notice shall be included in
200fa2845dSmrg# all copies or substantial portions of the Software.
210fa2845dSmrg#
220fa2845dSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
230fa2845dSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
240fa2845dSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
250fa2845dSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
260fa2845dSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
270fa2845dSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
280fa2845dSmrg#
290fa2845dSmrg# Except as contained in this notice, the name of the X Consortium shall not
300fa2845dSmrg# be used in advertising or otherwise to promote the sale, use or other deal-
310fa2845dSmrg# ings in this Software without prior written authorization from the X Consor-
320fa2845dSmrg# tium.
330fa2845dSmrg#
340fa2845dSmrg#
350fa2845dSmrg# FSF changes to this file are in the public domain.
360fa2845dSmrg#
370fa2845dSmrg# Calling this script install-sh is preferred over install.sh, to prevent
380fa2845dSmrg# `make' implicit rules from creating a file called install from it
390fa2845dSmrg# when there is no Makefile.
400fa2845dSmrg#
410fa2845dSmrg# This script is compatible with the BSD install script, but was written
420fa2845dSmrg# from scratch.
430fa2845dSmrg
440fa2845dSmrgnl='
450fa2845dSmrg'
460fa2845dSmrgIFS=" ""	$nl"
470fa2845dSmrg
480fa2845dSmrg# set DOITPROG to echo to test this script
490fa2845dSmrg
500fa2845dSmrg# Don't use :- since 4.3BSD and earlier shells don't like it.
510fa2845dSmrgdoit="${DOITPROG-}"
520fa2845dSmrgif test -z "$doit"; then
530fa2845dSmrg  doit_exec=exec
540fa2845dSmrgelse
550fa2845dSmrg  doit_exec=$doit
560fa2845dSmrgfi
570fa2845dSmrg
580fa2845dSmrg# Put in absolute file names if you don't have them in your path;
590fa2845dSmrg# or use environment vars.
600fa2845dSmrg
610fa2845dSmrgmvprog="${MVPROG-mv}"
620fa2845dSmrgcpprog="${CPPROG-cp}"
630fa2845dSmrgchmodprog="${CHMODPROG-chmod}"
640fa2845dSmrgchownprog="${CHOWNPROG-chown}"
650fa2845dSmrgchgrpprog="${CHGRPPROG-chgrp}"
660fa2845dSmrgstripprog="${STRIPPROG-strip}"
670fa2845dSmrgrmprog="${RMPROG-rm}"
680fa2845dSmrgmkdirprog="${MKDIRPROG-mkdir}"
690fa2845dSmrg
700fa2845dSmrgposix_glob=
710fa2845dSmrgposix_mkdir=
720fa2845dSmrg
730fa2845dSmrg# Desired mode of installed file.
740fa2845dSmrgmode=0755
750fa2845dSmrg
760fa2845dSmrgchmodcmd=$chmodprog
770fa2845dSmrgchowncmd=
780fa2845dSmrgchgrpcmd=
790fa2845dSmrgstripcmd=
800fa2845dSmrgrmcmd="$rmprog -f"
810fa2845dSmrgmvcmd="$mvprog"
820fa2845dSmrgsrc=
830fa2845dSmrgdst=
840fa2845dSmrgdir_arg=
850fa2845dSmrgdstarg=
860fa2845dSmrgno_target_directory=
870fa2845dSmrg
880fa2845dSmrgusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
890fa2845dSmrg   or: $0 [OPTION]... SRCFILES... DIRECTORY
900fa2845dSmrg   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
910fa2845dSmrg   or: $0 [OPTION]... -d DIRECTORIES...
920fa2845dSmrg
930fa2845dSmrgIn the 1st form, copy SRCFILE to DSTFILE.
940fa2845dSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
950fa2845dSmrgIn the 4th, create DIRECTORIES.
960fa2845dSmrg
970fa2845dSmrgOptions:
980fa2845dSmrg-c         (ignored)
990fa2845dSmrg-d         create directories instead of installing files.
1000fa2845dSmrg-g GROUP   $chgrpprog installed files to GROUP.
1010fa2845dSmrg-m MODE    $chmodprog installed files to MODE.
1020fa2845dSmrg-o USER    $chownprog installed files to USER.
1030fa2845dSmrg-s         $stripprog installed files.
1040fa2845dSmrg-t DIRECTORY  install into DIRECTORY.
1050fa2845dSmrg-T         report an error if DSTFILE is a directory.
1060fa2845dSmrg--help     display this help and exit.
1070fa2845dSmrg--version  display version info and exit.
1080fa2845dSmrg
1090fa2845dSmrgEnvironment variables override the default commands:
1100fa2845dSmrg  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
1110fa2845dSmrg"
1120fa2845dSmrg
1130fa2845dSmrgwhile test $# -ne 0; do
1140fa2845dSmrg  case $1 in
1150fa2845dSmrg    -c) shift
1160fa2845dSmrg        continue;;
1170fa2845dSmrg
1180fa2845dSmrg    -d) dir_arg=true
1190fa2845dSmrg        shift
1200fa2845dSmrg        continue;;
1210fa2845dSmrg
1220fa2845dSmrg    -g) chgrpcmd="$chgrpprog $2"
1230fa2845dSmrg        shift
1240fa2845dSmrg        shift
1250fa2845dSmrg        continue;;
1260fa2845dSmrg
1270fa2845dSmrg    --help) echo "$usage"; exit $?;;
1280fa2845dSmrg
1290fa2845dSmrg    -m) mode=$2
1300fa2845dSmrg        shift
1310fa2845dSmrg        shift
1320fa2845dSmrg	case $mode in
1330fa2845dSmrg	  *' '* | *'	'* | *'
1340fa2845dSmrg'*	  | *'*'* | *'?'* | *'['*)
1350fa2845dSmrg	    echo "$0: invalid mode: $mode" >&2
1360fa2845dSmrg	    exit 1;;
1370fa2845dSmrg	esac
1380fa2845dSmrg        continue;;
1390fa2845dSmrg
1400fa2845dSmrg    -o) chowncmd="$chownprog $2"
1410fa2845dSmrg        shift
1420fa2845dSmrg        shift
1430fa2845dSmrg        continue;;
1440fa2845dSmrg
1450fa2845dSmrg    -s) stripcmd=$stripprog
1460fa2845dSmrg        shift
1470fa2845dSmrg        continue;;
1480fa2845dSmrg
1490fa2845dSmrg    -t) dstarg=$2
1500fa2845dSmrg	shift
1510fa2845dSmrg	shift
1520fa2845dSmrg	continue;;
1530fa2845dSmrg
1540fa2845dSmrg    -T) no_target_directory=true
1550fa2845dSmrg	shift
1560fa2845dSmrg	continue;;
1570fa2845dSmrg
1580fa2845dSmrg    --version) echo "$0 $scriptversion"; exit $?;;
1590fa2845dSmrg
1600fa2845dSmrg    --)	shift
1610fa2845dSmrg	break;;
1620fa2845dSmrg
1630fa2845dSmrg    -*)	echo "$0: invalid option: $1" >&2
1640fa2845dSmrg	exit 1;;
1650fa2845dSmrg
1660fa2845dSmrg    *)  break;;
1670fa2845dSmrg  esac
1680fa2845dSmrgdone
1690fa2845dSmrg
1700fa2845dSmrgif test $# -ne 0 && test -z "$dir_arg$dstarg"; then
1710fa2845dSmrg  # When -d is used, all remaining arguments are directories to create.
1720fa2845dSmrg  # When -t is used, the destination is already specified.
1730fa2845dSmrg  # Otherwise, the last argument is the destination.  Remove it from $@.
1740fa2845dSmrg  for arg
1750fa2845dSmrg  do
1760fa2845dSmrg    if test -n "$dstarg"; then
1770fa2845dSmrg      # $@ is not empty: it contains at least $arg.
1780fa2845dSmrg      set fnord "$@" "$dstarg"
1790fa2845dSmrg      shift # fnord
1800fa2845dSmrg    fi
1810fa2845dSmrg    shift # arg
1820fa2845dSmrg    dstarg=$arg
1830fa2845dSmrg  done
1840fa2845dSmrgfi
1850fa2845dSmrg
1860fa2845dSmrgif test $# -eq 0; then
1870fa2845dSmrg  if test -z "$dir_arg"; then
1880fa2845dSmrg    echo "$0: no input file specified." >&2
1890fa2845dSmrg    exit 1
1900fa2845dSmrg  fi
1910fa2845dSmrg  # It's OK to call `install-sh -d' without argument.
1920fa2845dSmrg  # This can happen when creating conditional directories.
1930fa2845dSmrg  exit 0
1940fa2845dSmrgfi
1950fa2845dSmrg
1960fa2845dSmrgif test -z "$dir_arg"; then
1970fa2845dSmrg  trap '(exit $?); exit' 1 2 13 15
1980fa2845dSmrg
1990fa2845dSmrg  # Set umask so as not to create temps with too-generous modes.
2000fa2845dSmrg  # However, 'strip' requires both read and write access to temps.
2010fa2845dSmrg  case $mode in
2020fa2845dSmrg    # Optimize common cases.
2030fa2845dSmrg    *644) cp_umask=133;;
2040fa2845dSmrg    *755) cp_umask=22;;
2050fa2845dSmrg
2060fa2845dSmrg    *[0-7])
2070fa2845dSmrg      if test -z "$stripcmd"; then
2080fa2845dSmrg	u_plus_rw=
2090fa2845dSmrg      else
2100fa2845dSmrg	u_plus_rw='% 200'
2110fa2845dSmrg      fi
2120fa2845dSmrg      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
2130fa2845dSmrg    *)
2140fa2845dSmrg      if test -z "$stripcmd"; then
2150fa2845dSmrg	u_plus_rw=
2160fa2845dSmrg      else
2170fa2845dSmrg	u_plus_rw=,u+rw
2180fa2845dSmrg      fi
2190fa2845dSmrg      cp_umask=$mode$u_plus_rw;;
2200fa2845dSmrg  esac
2210fa2845dSmrgfi
2220fa2845dSmrg
2230fa2845dSmrgfor src
2240fa2845dSmrgdo
2250fa2845dSmrg  # Protect names starting with `-'.
2260fa2845dSmrg  case $src in
2270fa2845dSmrg    -*) src=./$src ;;
2280fa2845dSmrg  esac
2290fa2845dSmrg
2300fa2845dSmrg  if test -n "$dir_arg"; then
2310fa2845dSmrg    dst=$src
2320fa2845dSmrg    dstdir=$dst
2330fa2845dSmrg    test -d "$dstdir"
2340fa2845dSmrg    dstdir_status=$?
2350fa2845dSmrg  else
2360fa2845dSmrg
2370fa2845dSmrg    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
2380fa2845dSmrg    # might cause directories to be created, which would be especially bad
2390fa2845dSmrg    # if $src (and thus $dsttmp) contains '*'.
2400fa2845dSmrg    if test ! -f "$src" && test ! -d "$src"; then
2410fa2845dSmrg      echo "$0: $src does not exist." >&2
2420fa2845dSmrg      exit 1
2430fa2845dSmrg    fi
2440fa2845dSmrg
2450fa2845dSmrg    if test -z "$dstarg"; then
2460fa2845dSmrg      echo "$0: no destination specified." >&2
2470fa2845dSmrg      exit 1
2480fa2845dSmrg    fi
2490fa2845dSmrg
2500fa2845dSmrg    dst=$dstarg
2510fa2845dSmrg    # Protect names starting with `-'.
2520fa2845dSmrg    case $dst in
2530fa2845dSmrg      -*) dst=./$dst ;;
2540fa2845dSmrg    esac
2550fa2845dSmrg
2560fa2845dSmrg    # If destination is a directory, append the input filename; won't work
2570fa2845dSmrg    # if double slashes aren't ignored.
2580fa2845dSmrg    if test -d "$dst"; then
2590fa2845dSmrg      if test -n "$no_target_directory"; then
2600fa2845dSmrg	echo "$0: $dstarg: Is a directory" >&2
2610fa2845dSmrg	exit 1
2620fa2845dSmrg      fi
2630fa2845dSmrg      dstdir=$dst
2640fa2845dSmrg      dst=$dstdir/`basename "$src"`
2650fa2845dSmrg      dstdir_status=0
2660fa2845dSmrg    else
2670fa2845dSmrg      # Prefer dirname, but fall back on a substitute if dirname fails.
2680fa2845dSmrg      dstdir=`
2690fa2845dSmrg	(dirname "$dst") 2>/dev/null ||
2700fa2845dSmrg	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
2710fa2845dSmrg	     X"$dst" : 'X\(//\)[^/]' \| \
2720fa2845dSmrg	     X"$dst" : 'X\(//\)$' \| \
2730fa2845dSmrg	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
2740fa2845dSmrg	echo X"$dst" |
2750fa2845dSmrg	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
2760fa2845dSmrg		   s//\1/
2770fa2845dSmrg		   q
2780fa2845dSmrg		 }
2790fa2845dSmrg		 /^X\(\/\/\)[^/].*/{
2800fa2845dSmrg		   s//\1/
2810fa2845dSmrg		   q
2820fa2845dSmrg		 }
2830fa2845dSmrg		 /^X\(\/\/\)$/{
2840fa2845dSmrg		   s//\1/
2850fa2845dSmrg		   q
2860fa2845dSmrg		 }
2870fa2845dSmrg		 /^X\(\/\).*/{
2880fa2845dSmrg		   s//\1/
2890fa2845dSmrg		   q
2900fa2845dSmrg		 }
2910fa2845dSmrg		 s/.*/./; q'
2920fa2845dSmrg      `
2930fa2845dSmrg
2940fa2845dSmrg      test -d "$dstdir"
2950fa2845dSmrg      dstdir_status=$?
2960fa2845dSmrg    fi
2970fa2845dSmrg  fi
2980fa2845dSmrg
2990fa2845dSmrg  obsolete_mkdir_used=false
3000fa2845dSmrg
3010fa2845dSmrg  if test $dstdir_status != 0; then
3020fa2845dSmrg    case $posix_mkdir in
3030fa2845dSmrg      '')
3040fa2845dSmrg	# Create intermediate dirs using mode 755 as modified by the umask.
3050fa2845dSmrg	# This is like FreeBSD 'install' as of 1997-10-28.
3060fa2845dSmrg	umask=`umask`
3070fa2845dSmrg	case $stripcmd.$umask in
3080fa2845dSmrg	  # Optimize common cases.
3090fa2845dSmrg	  *[2367][2367]) mkdir_umask=$umask;;
3100fa2845dSmrg	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
3110fa2845dSmrg
3120fa2845dSmrg	  *[0-7])
3130fa2845dSmrg	    mkdir_umask=`expr $umask + 22 \
3140fa2845dSmrg	      - $umask % 100 % 40 + $umask % 20 \
3150fa2845dSmrg	      - $umask % 10 % 4 + $umask % 2
3160fa2845dSmrg	    `;;
3170fa2845dSmrg	  *) mkdir_umask=$umask,go-w;;
3180fa2845dSmrg	esac
3190fa2845dSmrg
3200fa2845dSmrg	# With -d, create the new directory with the user-specified mode.
3210fa2845dSmrg	# Otherwise, rely on $mkdir_umask.
3220fa2845dSmrg	if test -n "$dir_arg"; then
3230fa2845dSmrg	  mkdir_mode=-m$mode
3240fa2845dSmrg	else
3250fa2845dSmrg	  mkdir_mode=
3260fa2845dSmrg	fi
3270fa2845dSmrg
3280fa2845dSmrg	posix_mkdir=false
3290fa2845dSmrg	case $umask in
3300fa2845dSmrg	  *[123567][0-7][0-7])
3310fa2845dSmrg	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
3320fa2845dSmrg	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
3330fa2845dSmrg	    ;;
3340fa2845dSmrg	  *)
3350fa2845dSmrg	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
3360fa2845dSmrg	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
3370fa2845dSmrg
3380fa2845dSmrg	    if (umask $mkdir_umask &&
3390fa2845dSmrg		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
3400fa2845dSmrg	    then
3410fa2845dSmrg	      if test -z "$dir_arg" || {
3420fa2845dSmrg		   # Check for POSIX incompatibilities with -m.
3430fa2845dSmrg		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
3440fa2845dSmrg		   # other-writeable bit of parent directory when it shouldn't.
3450fa2845dSmrg		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
3460fa2845dSmrg		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
3470fa2845dSmrg		   case $ls_ld_tmpdir in
3480fa2845dSmrg		     d????-?r-*) different_mode=700;;
3490fa2845dSmrg		     d????-?--*) different_mode=755;;
3500fa2845dSmrg		     *) false;;
3510fa2845dSmrg		   esac &&
3520fa2845dSmrg		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
3530fa2845dSmrg		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
3540fa2845dSmrg		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
3550fa2845dSmrg		   }
3560fa2845dSmrg		 }
3570fa2845dSmrg	      then posix_mkdir=:
3580fa2845dSmrg	      fi
3590fa2845dSmrg	      rmdir "$tmpdir/d" "$tmpdir"
3600fa2845dSmrg	    else
3610fa2845dSmrg	      # Remove any dirs left behind by ancient mkdir implementations.
3620fa2845dSmrg	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
3630fa2845dSmrg	    fi
3640fa2845dSmrg	    trap '' 0;;
3650fa2845dSmrg	esac;;
3660fa2845dSmrg    esac
3670fa2845dSmrg
3680fa2845dSmrg    if
3690fa2845dSmrg      $posix_mkdir && (
3700fa2845dSmrg	umask $mkdir_umask &&
3710fa2845dSmrg	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
3720fa2845dSmrg      )
3730fa2845dSmrg    then :
3740fa2845dSmrg    else
3750fa2845dSmrg
3760fa2845dSmrg      # The umask is ridiculous, or mkdir does not conform to POSIX,
3770fa2845dSmrg      # or it failed possibly due to a race condition.  Create the
3780fa2845dSmrg      # directory the slow way, step by step, checking for races as we go.
3790fa2845dSmrg
3800fa2845dSmrg      case $dstdir in
3810fa2845dSmrg	/*) prefix=/ ;;
3820fa2845dSmrg	-*) prefix=./ ;;
3830fa2845dSmrg	*)  prefix= ;;
3840fa2845dSmrg      esac
3850fa2845dSmrg
3860fa2845dSmrg      case $posix_glob in
3870fa2845dSmrg        '')
3880fa2845dSmrg	  if (set -f) 2>/dev/null; then
3890fa2845dSmrg	    posix_glob=true
3900fa2845dSmrg	  else
3910fa2845dSmrg	    posix_glob=false
3920fa2845dSmrg	  fi ;;
3930fa2845dSmrg      esac
3940fa2845dSmrg
3950fa2845dSmrg      oIFS=$IFS
3960fa2845dSmrg      IFS=/
3970fa2845dSmrg      $posix_glob && set -f
3980fa2845dSmrg      set fnord $dstdir
3990fa2845dSmrg      shift
4000fa2845dSmrg      $posix_glob && set +f
4010fa2845dSmrg      IFS=$oIFS
4020fa2845dSmrg
4030fa2845dSmrg      prefixes=
4040fa2845dSmrg
4050fa2845dSmrg      for d
4060fa2845dSmrg      do
4070fa2845dSmrg	test -z "$d" && continue
4080fa2845dSmrg
4090fa2845dSmrg	prefix=$prefix$d
4100fa2845dSmrg	if test -d "$prefix"; then
4110fa2845dSmrg	  prefixes=
4120fa2845dSmrg	else
4130fa2845dSmrg	  if $posix_mkdir; then
4140fa2845dSmrg	    (umask=$mkdir_umask &&
4150fa2845dSmrg	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
4160fa2845dSmrg	    # Don't fail if two instances are running concurrently.
4170fa2845dSmrg	    test -d "$prefix" || exit 1
4180fa2845dSmrg	  else
4190fa2845dSmrg	    case $prefix in
4200fa2845dSmrg	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
4210fa2845dSmrg	      *) qprefix=$prefix;;
4220fa2845dSmrg	    esac
4230fa2845dSmrg	    prefixes="$prefixes '$qprefix'"
4240fa2845dSmrg	  fi
4250fa2845dSmrg	fi
4260fa2845dSmrg	prefix=$prefix/
4270fa2845dSmrg      done
4280fa2845dSmrg
4290fa2845dSmrg      if test -n "$prefixes"; then
4300fa2845dSmrg	# Don't fail if two instances are running concurrently.
4310fa2845dSmrg	(umask $mkdir_umask &&
4320fa2845dSmrg	 eval "\$doit_exec \$mkdirprog $prefixes") ||
4330fa2845dSmrg	  test -d "$dstdir" || exit 1
4340fa2845dSmrg	obsolete_mkdir_used=true
4350fa2845dSmrg      fi
4360fa2845dSmrg    fi
4370fa2845dSmrg  fi
4380fa2845dSmrg
4390fa2845dSmrg  if test -n "$dir_arg"; then
4400fa2845dSmrg    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
4410fa2845dSmrg    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
4420fa2845dSmrg    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
4430fa2845dSmrg      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
4440fa2845dSmrg  else
4450fa2845dSmrg
4460fa2845dSmrg    # Make a couple of temp file names in the proper directory.
4470fa2845dSmrg    dsttmp=$dstdir/_inst.$$_
4480fa2845dSmrg    rmtmp=$dstdir/_rm.$$_
4490fa2845dSmrg
4500fa2845dSmrg    # Trap to clean up those temp files at exit.
4510fa2845dSmrg    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
4520fa2845dSmrg
4530fa2845dSmrg    # Copy the file name to the temp name.
4540fa2845dSmrg    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
4550fa2845dSmrg
4560fa2845dSmrg    # and set any options; do chmod last to preserve setuid bits.
4570fa2845dSmrg    #
4580fa2845dSmrg    # If any of these fail, we abort the whole thing.  If we want to
4590fa2845dSmrg    # ignore errors from any of these, just make sure not to ignore
4600fa2845dSmrg    # errors from the above "$doit $cpprog $src $dsttmp" command.
4610fa2845dSmrg    #
4620fa2845dSmrg    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
4630fa2845dSmrg      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
4640fa2845dSmrg      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
4650fa2845dSmrg      && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
4660fa2845dSmrg
4670fa2845dSmrg    # Now rename the file to the real destination.
4680fa2845dSmrg    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
4690fa2845dSmrg      || {
4700fa2845dSmrg	   # The rename failed, perhaps because mv can't rename something else
4710fa2845dSmrg	   # to itself, or perhaps because mv is so ancient that it does not
4720fa2845dSmrg	   # support -f.
4730fa2845dSmrg
4740fa2845dSmrg	   # Now remove or move aside any old file at destination location.
4750fa2845dSmrg	   # We try this two ways since rm can't unlink itself on some
4760fa2845dSmrg	   # systems and the destination file might be busy for other
4770fa2845dSmrg	   # reasons.  In this case, the final cleanup might fail but the new
4780fa2845dSmrg	   # file should still install successfully.
4790fa2845dSmrg	   {
4800fa2845dSmrg	     if test -f "$dst"; then
4810fa2845dSmrg	       $doit $rmcmd -f "$dst" 2>/dev/null \
4820fa2845dSmrg	       || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
4830fa2845dSmrg		     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
4840fa2845dSmrg	       || {
4850fa2845dSmrg		 echo "$0: cannot unlink or rename $dst" >&2
4860fa2845dSmrg		 (exit 1); exit 1
4870fa2845dSmrg	       }
4880fa2845dSmrg	     else
4890fa2845dSmrg	       :
4900fa2845dSmrg	     fi
4910fa2845dSmrg	   } &&
4920fa2845dSmrg
4930fa2845dSmrg	   # Now rename the file to the real destination.
4940fa2845dSmrg	   $doit $mvcmd "$dsttmp" "$dst"
4950fa2845dSmrg	 }
4960fa2845dSmrg    } || exit 1
4970fa2845dSmrg
4980fa2845dSmrg    trap '' 0
4990fa2845dSmrg  fi
5000fa2845dSmrgdone
5010fa2845dSmrg
5020fa2845dSmrg# Local variables:
5030fa2845dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
5040fa2845dSmrg# time-stamp-start: "scriptversion="
5050fa2845dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
5060fa2845dSmrg# time-stamp-end: "$"
5070fa2845dSmrg# End:
508