11d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#!/bin/sh
21d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# install - install a program, script, or datafile
31d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
41d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichscriptversion=2011-01-19.21; # UTC
51d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
61d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# This originates from X11R5 (mit/util/scripts/install.sh), which was
71d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# later released in X11R6 (xc/config/util/install.sh) with the
81d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# following copyright and license.
91d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Copyright (C) 1994 X Consortium
111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Permission is hereby granted, free of charge, to any person obtaining a copy
131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# of this software and associated documentation files (the "Software"), to
141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# deal in the Software without restriction, including without limitation the
151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# sell copies of the Software, and to permit persons to whom the Software is
171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# furnished to do so, subject to the following conditions:
181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# The above copyright notice and this permission notice shall be included in
201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# all copies or substantial portions of the Software.
211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Except as contained in this notice, the name of the X Consortium shall not
301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# be used in advertising or otherwise to promote the sale, use or other deal-
311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# ings in this Software without prior written authorization from the X Consor-
321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# tium.
331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# FSF changes to this file are in the public domain.
361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Calling this script install-sh is preferred over install.sh, to prevent
381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# `make' implicit rules from creating a file called install from it
391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# when there is no Makefile.
401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#
411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# This script is compatible with the BSD install script, but was written
421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# from scratch.
431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichnl='
451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich'
461d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichIFS=" ""	$nl"
471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# set DOITPROG to echo to test this script
491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Don't use :- since 4.3BSD and earlier shells don't like it.
511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdoit=${DOITPROG-}
521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif test -z "$doit"; then
531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  doit_exec=exec
541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichelse
551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  doit_exec=$doit
561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Put in absolute file names if you don't have them in your path;
591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# or use environment vars.
601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichchgrpprog=${CHGRPPROG-chgrp}
621d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichchmodprog=${CHMODPROG-chmod}
631d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichchownprog=${CHOWNPROG-chown}
641d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichcmpprog=${CMPPROG-cmp}
651d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichcpprog=${CPPROG-cp}
661d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichmkdirprog=${MKDIRPROG-mkdir}
671d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichmvprog=${MVPROG-mv}
681d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichrmprog=${RMPROG-rm}
691d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichstripprog=${STRIPPROG-strip}
701d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
711d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichposix_glob='?'
721d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichinitialize_posix_glob='
731d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  test "$posix_glob" != "?" || {
741d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if (set -f) 2>/dev/null; then
751d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      posix_glob=
761d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    else
771d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      posix_glob=:
781d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    fi
791d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  }
801d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich'
811d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
821d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichposix_mkdir=
831d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
841d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Desired mode of installed file.
851d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichmode=0755
861d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
871d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichchgrpcmd=
881d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichchmodcmd=$chmodprog
891d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichchowncmd=
901d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichmvcmd=$mvprog
911d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichrmcmd="$rmprog -f"
921d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichstripcmd=
931d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
941d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichsrc=
951d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdst=
961d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdir_arg=
971d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdst_arg=
981d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
991d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichcopy_on_change=false
1001d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichno_target_directory=
1011d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1021d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichusage="\
1031d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
1041d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich   or: $0 [OPTION]... SRCFILES... DIRECTORY
1051d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
1061d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich   or: $0 [OPTION]... -d DIRECTORIES...
1071d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1081d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichIn the 1st form, copy SRCFILE to DSTFILE.
1091d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
1101d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichIn the 4th, create DIRECTORIES.
1111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1121d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichOptions:
1131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich     --help     display this help and exit.
1141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich     --version  display version info and exit.
1151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -c            (ignored)
1171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -C            install only if different (preserve the last data modification time)
1181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -d            create directories instead of installing files.
1191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -g GROUP      $chgrpprog installed files to GROUP.
1201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -m MODE       $chmodprog installed files to MODE.
1211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -o USER       $chownprog installed files to USER.
1221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -s            $stripprog installed files.
1231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -t DIRECTORY  install into DIRECTORY.
1241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  -T            report an error if DSTFILE is a directory.
1251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1261d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichEnvironment variables override the default commands:
1271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
1281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  RMPROG STRIPPROG
1291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich"
1301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichwhile test $# -ne 0; do
1321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  case $1 in
1331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -c) ;;
1341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -C) copy_on_change=true;;
1361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -d) dir_arg=true;;
1381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -g) chgrpcmd="$chgrpprog $2"
1401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	shift;;
1411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    --help) echo "$usage"; exit $?;;
1431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -m) mode=$2
1451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	case $mode in
1461d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  *' '* | *'	'* | *'
1471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich'*	  | *'*'* | *'?'* | *'['*)
1481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    echo "$0: invalid mode: $mode" >&2
1491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    exit 1;;
1501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	esac
1511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	shift;;
1521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -o) chowncmd="$chownprog $2"
1541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	shift;;
1551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -s) stripcmd=$stripprog;;
1571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -t) dst_arg=$2
1591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# Protect names problematic for `test' and other utilities.
1601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	case $dst_arg in
1611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
1621d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	esac
1631d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	shift;;
1641d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1651d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -T) no_target_directory=true;;
1661d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1671d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    --version) echo "$0 $scriptversion"; exit $?;;
1681d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1691d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    --)	shift
1701d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	break;;
1711d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1721d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -*)	echo "$0: invalid option: $1" >&2
1731d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	exit 1;;
1741d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1751d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    *)  break;;
1761d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  esac
1771d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  shift
1781d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdone
1791d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1801d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
1811d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # When -d is used, all remaining arguments are directories to create.
1821d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # When -t is used, the destination is already specified.
1831d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # Otherwise, the last argument is the destination.  Remove it from $@.
1841d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  for arg
1851d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  do
1861d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if test -n "$dst_arg"; then
1871d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # $@ is not empty: it contains at least $arg.
1881d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      set fnord "$@" "$dst_arg"
1891d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      shift # fnord
1901d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    fi
1911d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    shift # arg
1921d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    dst_arg=$arg
1931d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # Protect names problematic for `test' and other utilities.
1941d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    case $dst_arg in
1951d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      -* | [=\(\)!]) dst_arg=./$dst_arg;;
1961d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    esac
1971d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  done
1981d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
1991d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2001d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif test $# -eq 0; then
2011d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  if test -z "$dir_arg"; then
2021d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    echo "$0: no input file specified." >&2
2031d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    exit 1
2041d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  fi
2051d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # It's OK to call `install-sh -d' without argument.
2061d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # This can happen when creating conditional directories.
2071d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  exit 0
2081d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
2091d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif test -z "$dir_arg"; then
2111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  do_exit='(exit $ret); exit $ret'
2121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  trap "ret=129; $do_exit" 1
2131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  trap "ret=130; $do_exit" 2
2141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  trap "ret=141; $do_exit" 13
2151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  trap "ret=143; $do_exit" 15
2161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # Set umask so as not to create temps with too-generous modes.
2181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # However, 'strip' requires both read and write access to temps.
2191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  case $mode in
2201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # Optimize common cases.
2211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    *644) cp_umask=133;;
2221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    *755) cp_umask=22;;
2231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    *[0-7])
2251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      if test -z "$stripcmd"; then
2261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	u_plus_rw=
2271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      else
2281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	u_plus_rw='% 200'
2291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      fi
2301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
2311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    *)
2321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      if test -z "$stripcmd"; then
2331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	u_plus_rw=
2341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      else
2351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	u_plus_rw=,u+rw
2361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      fi
2371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      cp_umask=$mode$u_plus_rw;;
2381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  esac
2391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
2401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfor src
2421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdo
2431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  # Protect names problematic for `test' and other utilities.
2441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  case $src in
2451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -* | [=\(\)!]) src=./$src;;
2461d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  esac
2471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  if test -n "$dir_arg"; then
2491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    dst=$src
2501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    dstdir=$dst
2511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    test -d "$dstdir"
2521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    dstdir_status=$?
2531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  else
2541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
2561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # might cause directories to be created, which would be especially bad
2571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # if $src (and thus $dsttmp) contains '*'.
2581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if test ! -f "$src" && test ! -d "$src"; then
2591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      echo "$0: $src does not exist." >&2
2601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      exit 1
2611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    fi
2621d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2631d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if test -z "$dst_arg"; then
2641d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      echo "$0: no destination specified." >&2
2651d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      exit 1
2661d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    fi
2671d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    dst=$dst_arg
2681d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
2691d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # If destination is a directory, append the input filename; won't work
2701d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # if double slashes aren't ignored.
2711d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if test -d "$dst"; then
2721d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      if test -n "$no_target_directory"; then
2731d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	echo "$0: $dst_arg: Is a directory" >&2
2741d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	exit 1
2751d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      fi
2761d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      dstdir=$dst
2771d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      dst=$dstdir/`basename "$src"`
2781d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      dstdir_status=0
2791d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    else
2801d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # Prefer dirname, but fall back on a substitute if dirname fails.
2811d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      dstdir=`
2821d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	(dirname "$dst") 2>/dev/null ||
2831d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
2841d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	     X"$dst" : 'X\(//\)[^/]' \| \
2851d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	     X"$dst" : 'X\(//\)$' \| \
2861d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
2871d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	echo X"$dst" |
2881d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
2891d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   s//\1/
2901d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   q
2911d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 }
2921d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 /^X\(\/\/\)[^/].*/{
2931d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   s//\1/
2941d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   q
2951d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 }
2961d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 /^X\(\/\/\)$/{
2971d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   s//\1/
2981d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   q
2991d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 }
3001d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 /^X\(\/\).*/{
3011d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   s//\1/
3021d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   q
3031d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 }
3041d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 s/.*/./; q'
3051d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      `
3061d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3071d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      test -d "$dstdir"
3081d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      dstdir_status=$?
3091d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    fi
3101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  fi
3111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  obsolete_mkdir_used=false
3131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  if test $dstdir_status != 0; then
3151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    case $posix_mkdir in
3161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      '')
3171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# Create intermediate dirs using mode 755 as modified by the umask.
3181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# This is like FreeBSD 'install' as of 1997-10-28.
3191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	umask=`umask`
3201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	case $stripcmd.$umask in
3211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  # Optimize common cases.
3221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  *[2367][2367]) mkdir_umask=$umask;;
3231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
3241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  *[0-7])
3261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    mkdir_umask=`expr $umask + 22 \
3271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      - $umask % 100 % 40 + $umask % 20 \
3281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      - $umask % 10 % 4 + $umask % 2
3291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    `;;
3301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  *) mkdir_umask=$umask,go-w;;
3311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	esac
3321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# With -d, create the new directory with the user-specified mode.
3341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# Otherwise, rely on $mkdir_umask.
3351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	if test -n "$dir_arg"; then
3361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  mkdir_mode=-m$mode
3371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	else
3381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  mkdir_mode=
3391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	fi
3401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	posix_mkdir=false
3421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	case $umask in
3431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  *[123567][0-7][0-7])
3441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
3451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
3461d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    ;;
3471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  *)
3481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
3491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
3501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    if (umask $mkdir_umask &&
3521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
3531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    then
3541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      if test -z "$dir_arg" || {
3551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   # Check for POSIX incompatibilities with -m.
3561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
3571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   # other-writeable bit of parent directory when it shouldn't.
3581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
3591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
3601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   case $ls_ld_tmpdir in
3611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		     d????-?r-*) different_mode=700;;
3621d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		     d????-?--*) different_mode=755;;
3631d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		     *) false;;
3641d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   esac &&
3651d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
3661d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
3671d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
3681d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		   }
3691d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich		 }
3701d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      then posix_mkdir=:
3711d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      fi
3721d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      rmdir "$tmpdir/d" "$tmpdir"
3731d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    else
3741d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      # Remove any dirs left behind by ancient mkdir implementations.
3751d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
3761d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    fi
3771d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    trap '' 0;;
3781d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	esac;;
3791d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    esac
3801d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3811d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if
3821d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      $posix_mkdir && (
3831d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	umask $mkdir_umask &&
3841d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
3851d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      )
3861d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    then :
3871d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    else
3881d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3891d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # The umask is ridiculous, or mkdir does not conform to POSIX,
3901d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # or it failed possibly due to a race condition.  Create the
3911d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # directory the slow way, step by step, checking for races as we go.
3921d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3931d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      case $dstdir in
3941d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	/*) prefix='/';;
3951d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	[-=\(\)!]*) prefix='./';;
3961d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	*)  prefix='';;
3971d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      esac
3981d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
3991d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      eval "$initialize_posix_glob"
4001d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4011d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      oIFS=$IFS
4021d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      IFS=/
4031d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      $posix_glob set -f
4041d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      set fnord $dstdir
4051d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      shift
4061d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      $posix_glob set +f
4071d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      IFS=$oIFS
4081d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4091d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      prefixes=
4101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      for d
4121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      do
4131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	test X"$d" = X && continue
4141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	prefix=$prefix$d
4161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	if test -d "$prefix"; then
4171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  prefixes=
4181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	else
4191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  if $posix_mkdir; then
4201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    (umask=$mkdir_umask &&
4211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
4221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    # Don't fail if two instances are running concurrently.
4231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    test -d "$prefix" || exit 1
4241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  else
4251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    case $prefix in
4261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
4271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	      *) qprefix=$prefix;;
4281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    esac
4291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    prefixes="$prefixes '$qprefix'"
4301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  fi
4311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	fi
4321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	prefix=$prefix/
4331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      done
4341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      if test -n "$prefixes"; then
4361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# Don't fail if two instances are running concurrently.
4371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	(umask $mkdir_umask &&
4381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	 eval "\$doit_exec \$mkdirprog $prefixes") ||
4391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  test -d "$dstdir" || exit 1
4401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	obsolete_mkdir_used=true
4411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      fi
4421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    fi
4431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  fi
4441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  if test -n "$dir_arg"; then
4461d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
4471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
4481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
4491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
4501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  else
4511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # Make a couple of temp file names in the proper directory.
4531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    dsttmp=$dstdir/_inst.$$_
4541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    rmtmp=$dstdir/_rm.$$_
4551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # Trap to clean up those temp files at exit.
4571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
4581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # Copy the file name to the temp name.
4601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
4611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4621d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # and set any options; do chmod last to preserve setuid bits.
4631d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    #
4641d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # If any of these fail, we abort the whole thing.  If we want to
4651d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # ignore errors from any of these, just make sure not to ignore
4661d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # errors from the above "$doit $cpprog $src $dsttmp" command.
4671d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    #
4681d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
4691d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
4701d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
4711d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
4721d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4731d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    # If -C, don't bother to copy if it wouldn't change the file.
4741d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if $copy_on_change &&
4751d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
4761d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
4771d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4781d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       eval "$initialize_posix_glob" &&
4791d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       $posix_glob set -f &&
4801d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       set X $old && old=:$2:$4:$5:$6 &&
4811d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       set X $new && new=:$2:$4:$5:$6 &&
4821d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       $posix_glob set +f &&
4831d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4841d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       test "$old" = "$new" &&
4851d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
4861d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    then
4871d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      rm -f "$dsttmp"
4881d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    else
4891d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # Rename the file to the real destination.
4901d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
4911d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
4921d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # The rename failed, perhaps because mv can't rename something else
4931d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # to itself, or perhaps because mv is so ancient that it does not
4941d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      # support -f.
4951d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      {
4961d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# Now remove or move aside any old file at destination location.
4971d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# We try this two ways since rm can't unlink itself on some
4981d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# systems and the destination file might be busy for other
4991d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# reasons.  In this case, the final cleanup might fail but the new
5001d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# file should still install successfully.
5011d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	{
5021d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  test ! -f "$dst" ||
5031d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  $doit $rmcmd -f "$dst" 2>/dev/null ||
5041d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
5051d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
5061d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  } ||
5071d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  { echo "$0: cannot unlink or rename $dst" >&2
5081d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    (exit 1); exit 1
5091d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	  }
5101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	} &&
5111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
5121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	# Now rename the file to the real destination.
5131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	$doit $mvcmd "$dsttmp" "$dst"
5141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      }
5151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    fi || exit 1
5161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
5171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    trap '' 0
5181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  fi
5191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdone
5201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
5211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Local variables:
5221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# eval: (add-hook 'write-file-hooks 'time-stamp)
5231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-start: "scriptversion="
5241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-format: "%:y-%02m-%02d.%02H"
5251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-time-zone: "UTC"
5261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-end: "; # UTC"
5271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# End:
528