165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#!/bin/sh
265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# install - install a program, script, or datafile
365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichscriptversion=2011-11-20.07; # UTC
565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# This originates from X11R5 (mit/util/scripts/install.sh), which was
765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# later released in X11R6 (xc/config/util/install.sh) with the
865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# following copyright and license.
965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
1065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Copyright (C) 1994 X Consortium
1165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
1265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Permission is hereby granted, free of charge, to any person obtaining a copy
1365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# of this software and associated documentation files (the "Software"), to
1465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# deal in the Software without restriction, including without limitation the
1565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# sell copies of the Software, and to permit persons to whom the Software is
1765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# furnished to do so, subject to the following conditions:
1865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
1965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# The above copyright notice and this permission notice shall be included in
2065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# all copies or substantial portions of the Software.
2165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
2265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
2565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
2765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
2965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Except as contained in this notice, the name of the X Consortium shall not
3065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# be used in advertising or otherwise to promote the sale, use or other deal-
3165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# ings in this Software without prior written authorization from the X Consor-
3265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# tium.
3365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
3465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
3565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# FSF changes to this file are in the public domain.
3665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
3765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Calling this script install-sh is preferred over install.sh, to prevent
3865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 'make' implicit rules from creating a file called install from it
3965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# when there is no Makefile.
4065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#
4165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# This script is compatible with the BSD install script, but was written
4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# from scratch.
4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnl='
4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich'
4665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIFS=" ""	$nl"
4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# set DOITPROG to echo to test this script
4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Don't use :- since 4.3BSD and earlier shells don't like it.
5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdoit=${DOITPROG-}
5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test -z "$doit"; then
5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  doit_exec=exec
5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse
5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  doit_exec=$doit
5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi
5765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Put in absolute file names if you don't have them in your path;
5965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# or use environment vars.
6065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchgrpprog=${CHGRPPROG-chgrp}
6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchmodprog=${CHMODPROG-chmod}
6365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchownprog=${CHOWNPROG-chown}
6465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcmpprog=${CMPPROG-cmp}
6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcpprog=${CPPROG-cp}
6665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmkdirprog=${MKDIRPROG-mkdir}
6765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmvprog=${MVPROG-mv}
6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichrmprog=${RMPROG-rm}
6965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstripprog=${STRIPPROG-strip}
7065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichposix_glob='?'
7265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinitialize_posix_glob='
7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  test "$posix_glob" != "?" || {
7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (set -f) 2>/dev/null; then
7565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      posix_glob=
7665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else
7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      posix_glob=:
7865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fi
7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich'
8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichposix_mkdir=
8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Desired mode of installed file.
8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmode=0755
8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchgrpcmd=
8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchmodcmd=$chmodprog
8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchowncmd=
9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmvcmd=$mvprog
9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichrmcmd="$rmprog -f"
9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstripcmd=
9365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsrc=
9565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdst=
9665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdir_arg=
9765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdst_arg=
9865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcopy_on_change=false
10065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichno_target_directory=
10165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichusage="\
10365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
10465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   or: $0 [OPTION]... SRCFILES... DIRECTORY
10565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
10665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   or: $0 [OPTION]... -d DIRECTORIES...
10765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn the 1st form, copy SRCFILE to DSTFILE.
10965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
11065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn the 4th, create DIRECTORIES.
11165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichOptions:
11365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     --help     display this help and exit.
11465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     --version  display version info and exit.
11565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -c            (ignored)
11765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -C            install only if different (preserve the last data modification time)
11865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -d            create directories instead of installing files.
11965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -g GROUP      $chgrpprog installed files to GROUP.
12065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -m MODE       $chmodprog installed files to MODE.
12165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -o USER       $chownprog installed files to USER.
12265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -s            $stripprog installed files.
12365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -t DIRECTORY  install into DIRECTORY.
12465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  -T            report an error if DSTFILE is a directory.
12565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
12665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichEnvironment variables override the default commands:
12765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
12865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RMPROG STRIPPROG
12965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich"
13065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhile test $# -ne 0; do
13265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case $1 in
13365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -c) ;;
13465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -C) copy_on_change=true;;
13665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -d) dir_arg=true;;
13865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -g) chgrpcmd="$chgrpprog $2"
14065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	shift;;
14165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
14265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    --help) echo "$usage"; exit $?;;
14365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
14465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -m) mode=$2
14565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	case $mode in
14665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  *' '* | *'	'* | *'
14765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich'*	  | *'*'* | *'?'* | *'['*)
14865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    echo "$0: invalid mode: $mode" >&2
14965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    exit 1;;
15065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	esac
15165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	shift;;
15265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
15365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -o) chowncmd="$chownprog $2"
15465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	shift;;
15565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
15665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -s) stripcmd=$stripprog;;
15765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
15865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -t) dst_arg=$2
15965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# Protect names problematic for 'test' and other utilities.
16065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	case $dst_arg in
16165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
16265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	esac
16365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	shift;;
16465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
16565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -T) no_target_directory=true;;
16665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
16765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    --version) echo "$0 $scriptversion"; exit $?;;
16865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
16965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    --)	shift
17065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	break;;
17165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
17265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -*)	echo "$0: invalid option: $1" >&2
17365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	exit 1;;
17465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
17565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *)  break;;
17665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  esac
17765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  shift
17865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdone
17965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
18065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
18165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # When -d is used, all remaining arguments are directories to create.
18265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # When -t is used, the destination is already specified.
18365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # Otherwise, the last argument is the destination.  Remove it from $@.
18465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  for arg
18565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  do
18665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if test -n "$dst_arg"; then
18765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # $@ is not empty: it contains at least $arg.
18865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      set fnord "$@" "$dst_arg"
18965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      shift # fnord
19065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fi
19165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    shift # arg
19265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    dst_arg=$arg
19365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # Protect names problematic for 'test' and other utilities.
19465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case $dst_arg in
19565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      -* | [=\(\)!]) dst_arg=./$dst_arg;;
19665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    esac
19765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  done
19865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi
19965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
20065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test $# -eq 0; then
20165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if test -z "$dir_arg"; then
20265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    echo "$0: no input file specified." >&2
20365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    exit 1
20465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fi
20565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # It's OK to call 'install-sh -d' without argument.
20665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # This can happen when creating conditional directories.
20765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  exit 0
20865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi
20965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
21065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test -z "$dir_arg"; then
21165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  do_exit='(exit $ret); exit $ret'
21265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  trap "ret=129; $do_exit" 1
21365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  trap "ret=130; $do_exit" 2
21465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  trap "ret=141; $do_exit" 13
21565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  trap "ret=143; $do_exit" 15
21665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
21765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # Set umask so as not to create temps with too-generous modes.
21865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # However, 'strip' requires both read and write access to temps.
21965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case $mode in
22065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # Optimize common cases.
22165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *644) cp_umask=133;;
22265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *755) cp_umask=22;;
22365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
22465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *[0-7])
22565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if test -z "$stripcmd"; then
22665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	u_plus_rw=
22765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else
22865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	u_plus_rw='% 200'
22965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fi
23065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
23165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *)
23265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if test -z "$stripcmd"; then
23365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	u_plus_rw=
23465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else
23565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	u_plus_rw=,u+rw
23665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fi
23765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      cp_umask=$mode$u_plus_rw;;
23865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  esac
23965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi
24065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor src
24265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdo
24365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  # Protect names problematic for 'test' and other utilities.
24465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case $src in
24565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    -* | [=\(\)!]) src=./$src;;
24665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  esac
24765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if test -n "$dir_arg"; then
24965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    dst=$src
25065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    dstdir=$dst
25165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    test -d "$dstdir"
25265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    dstdir_status=$?
25365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else
25465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
25665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # might cause directories to be created, which would be especially bad
25765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # if $src (and thus $dsttmp) contains '*'.
25865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if test ! -f "$src" && test ! -d "$src"; then
25965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      echo "$0: $src does not exist." >&2
26065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      exit 1
26165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fi
26265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if test -z "$dst_arg"; then
26465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      echo "$0: no destination specified." >&2
26565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      exit 1
26665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fi
26765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    dst=$dst_arg
26865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # If destination is a directory, append the input filename; won't work
27065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # if double slashes aren't ignored.
27165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if test -d "$dst"; then
27265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if test -n "$no_target_directory"; then
27365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	echo "$0: $dst_arg: Is a directory" >&2
27465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	exit 1
27565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fi
27665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      dstdir=$dst
27765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      dst=$dstdir/`basename "$src"`
27865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      dstdir_status=0
27965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else
28065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # Prefer dirname, but fall back on a substitute if dirname fails.
28165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      dstdir=`
28265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	(dirname "$dst") 2>/dev/null ||
28365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
28465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	     X"$dst" : 'X\(//\)[^/]' \| \
28565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	     X"$dst" : 'X\(//\)$' \| \
28665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
28765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	echo X"$dst" |
28865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
28965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   s//\1/
29065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   q
29165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 }
29265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 /^X\(\/\/\)[^/].*/{
29365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   s//\1/
29465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   q
29565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 }
29665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 /^X\(\/\/\)$/{
29765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   s//\1/
29865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   q
29965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 }
30065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 /^X\(\/\).*/{
30165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   s//\1/
30265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   q
30365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 }
30465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 s/.*/./; q'
30565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      `
30665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      test -d "$dstdir"
30865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      dstdir_status=$?
30965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fi
31065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fi
31165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  obsolete_mkdir_used=false
31365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if test $dstdir_status != 0; then
31565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case $posix_mkdir in
31665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      '')
31765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# Create intermediate dirs using mode 755 as modified by the umask.
31865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# This is like FreeBSD 'install' as of 1997-10-28.
31965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	umask=`umask`
32065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	case $stripcmd.$umask in
32165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  # Optimize common cases.
32265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  *[2367][2367]) mkdir_umask=$umask;;
32365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
32465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
32565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  *[0-7])
32665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    mkdir_umask=`expr $umask + 22 \
32765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      - $umask % 100 % 40 + $umask % 20 \
32865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      - $umask % 10 % 4 + $umask % 2
32965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    `;;
33065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  *) mkdir_umask=$umask,go-w;;
33165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	esac
33265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# With -d, create the new directory with the user-specified mode.
33465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# Otherwise, rely on $mkdir_umask.
33565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	if test -n "$dir_arg"; then
33665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  mkdir_mode=-m$mode
33765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	else
33865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  mkdir_mode=
33965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	fi
34065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
34165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	posix_mkdir=false
34265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	case $umask in
34365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  *[123567][0-7][0-7])
34465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
34565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
34665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    ;;
34765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  *)
34865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
34965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
35065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
35165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    if (umask $mkdir_umask &&
35265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
35365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    then
35465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      if test -z "$dir_arg" || {
35565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   # Check for POSIX incompatibilities with -m.
35665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
35765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   # other-writable bit of parent directory when it shouldn't.
35865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
35965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
36065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   case $ls_ld_tmpdir in
36165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     d????-?r-*) different_mode=700;;
36265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     d????-?--*) different_mode=755;;
36365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     *) false;;
36465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   esac &&
36565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
36665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
36765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
36865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		   }
36965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 }
37065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      then posix_mkdir=:
37165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      fi
37265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      rmdir "$tmpdir/d" "$tmpdir"
37365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    else
37465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      # Remove any dirs left behind by ancient mkdir implementations.
37565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
37665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    fi
37765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    trap '' 0;;
37865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	esac;;
37965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    esac
38065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
38165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if
38265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      $posix_mkdir && (
38365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	umask $mkdir_umask &&
38465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
38565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      )
38665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    then :
38765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else
38865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
38965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # The umask is ridiculous, or mkdir does not conform to POSIX,
39065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # or it failed possibly due to a race condition.  Create the
39165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # directory the slow way, step by step, checking for races as we go.
39265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
39365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      case $dstdir in
39465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	/*) prefix='/';;
39565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	[-=\(\)!]*) prefix='./';;
39665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	*)  prefix='';;
39765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      esac
39865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
39965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      eval "$initialize_posix_glob"
40065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
40165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      oIFS=$IFS
40265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      IFS=/
40365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      $posix_glob set -f
40465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      set fnord $dstdir
40565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      shift
40665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      $posix_glob set +f
40765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      IFS=$oIFS
40865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
40965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      prefixes=
41065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
41165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      for d
41265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      do
41365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	test X"$d" = X && continue
41465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
41565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	prefix=$prefix$d
41665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	if test -d "$prefix"; then
41765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  prefixes=
41865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	else
41965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  if $posix_mkdir; then
42065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    (umask=$mkdir_umask &&
42165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
42265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    # Don't fail if two instances are running concurrently.
42365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    test -d "$prefix" || exit 1
42465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  else
42565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    case $prefix in
42665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
42765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	      *) qprefix=$prefix;;
42865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    esac
42965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    prefixes="$prefixes '$qprefix'"
43065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  fi
43165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	fi
43265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	prefix=$prefix/
43365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      done
43465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if test -n "$prefixes"; then
43665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# Don't fail if two instances are running concurrently.
43765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	(umask $mkdir_umask &&
43865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 eval "\$doit_exec \$mkdirprog $prefixes") ||
43965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  test -d "$dstdir" || exit 1
44065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	obsolete_mkdir_used=true
44165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fi
44265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fi
44365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fi
44465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if test -n "$dir_arg"; then
44665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
44765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
44865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
44965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
45065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else
45165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # Make a couple of temp file names in the proper directory.
45365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    dsttmp=$dstdir/_inst.$$_
45465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    rmtmp=$dstdir/_rm.$$_
45565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # Trap to clean up those temp files at exit.
45765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
45865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # Copy the file name to the temp name.
46065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
46165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # and set any options; do chmod last to preserve setuid bits.
46365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    #
46465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # If any of these fail, we abort the whole thing.  If we want to
46565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # ignore errors from any of these, just make sure not to ignore
46665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # errors from the above "$doit $cpprog $src $dsttmp" command.
46765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    #
46865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
46965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
47065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
47165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
47265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
47365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    # If -C, don't bother to copy if it wouldn't change the file.
47465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if $copy_on_change &&
47565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
47665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
47765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
47865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       eval "$initialize_posix_glob" &&
47965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       $posix_glob set -f &&
48065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       set X $old && old=:$2:$4:$5:$6 &&
48165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       set X $new && new=:$2:$4:$5:$6 &&
48265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       $posix_glob set +f &&
48365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       test "$old" = "$new" &&
48565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
48665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    then
48765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      rm -f "$dsttmp"
48865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else
48965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # Rename the file to the real destination.
49065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
49165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
49265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # The rename failed, perhaps because mv can't rename something else
49365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # to itself, or perhaps because mv is so ancient that it does not
49465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      # support -f.
49565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
49665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# Now remove or move aside any old file at destination location.
49765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# We try this two ways since rm can't unlink itself on some
49865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# systems and the destination file might be busy for other
49965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# reasons.  In this case, the final cleanup might fail but the new
50065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# file should still install successfully.
50165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	{
50265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  test ! -f "$dst" ||
50365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  $doit $rmcmd -f "$dst" 2>/dev/null ||
50465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
50565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
50665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  } ||
50765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  { echo "$0: cannot unlink or rename $dst" >&2
50865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	    (exit 1); exit 1
50965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  }
51065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	} &&
51165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	# Now rename the file to the real destination.
51365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	$doit $mvcmd "$dsttmp" "$dst"
51465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
51565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fi || exit 1
51665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    trap '' 0
51865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fi
51965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdone
52065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
52165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Local variables:
52265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# eval: (add-hook 'write-file-hooks 'time-stamp)
52365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-start: "scriptversion="
52465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-format: "%:y-%02m-%02d.%02H"
52565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-time-zone: "UTC"
52665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-end: "; # UTC"
52765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# End:
528