112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#!/bin/sh
212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# install - install a program, script, or datafile
312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialascriptversion=2011-11-20.07; # UTC
512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# This originates from X11R5 (mit/util/scripts/install.sh), which was
712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# later released in X11R6 (xc/config/util/install.sh) with the
812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# following copyright and license.
912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
1012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Copyright (C) 1994 X Consortium
1112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
1212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Permission is hereby granted, free of charge, to any person obtaining a copy
1312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# of this software and associated documentation files (the "Software"), to
1412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# deal in the Software without restriction, including without limitation the
1512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# sell copies of the Software, and to permit persons to whom the Software is
1712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# furnished to do so, subject to the following conditions:
1812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
1912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# The above copyright notice and this permission notice shall be included in
2012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# all copies or substantial portions of the Software.
2112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
2212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
2512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
2712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
2912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Except as contained in this notice, the name of the X Consortium shall not
3012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# be used in advertising or otherwise to promote the sale, use or other deal-
3112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# ings in this Software without prior written authorization from the X Consor-
3212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# tium.
3312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
3412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
3512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# FSF changes to this file are in the public domain.
3612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Calling this script install-sh is preferred over install.sh, to prevent
3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# 'make' implicit rules from creating a file called install from it
3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# when there is no Makefile.
4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#
4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# This script is compatible with the BSD install script, but was written
4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# from scratch.
4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialanl='
4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala'
4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaIFS=" ""	$nl"
4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# set DOITPROG to echo to test this script
4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Don't use :- since 4.3BSD and earlier shells don't like it.
5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadoit=${DOITPROG-}
5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaif test -z "$doit"; then
5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  doit_exec=exec
5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaelse
5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  doit_exec=$doit
5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialafi
5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Put in absolute file names if you don't have them in your path;
5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# or use environment vars.
6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachgrpprog=${CHGRPPROG-chgrp}
6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachmodprog=${CHMODPROG-chmod}
6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachownprog=${CHOWNPROG-chown}
6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacmpprog=${CMPPROG-cmp}
6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacpprog=${CPPROG-cp}
6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialamkdirprog=${MKDIRPROG-mkdir}
6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialamvprog=${MVPROG-mv}
6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarmprog=${RMPROG-rm}
6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastripprog=${STRIPPROG-strip}
7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaposix_glob='?'
7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialainitialize_posix_glob='
7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  test "$posix_glob" != "?" || {
7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if (set -f) 2>/dev/null; then
7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      posix_glob=
7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    else
7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      posix_glob=:
7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    fi
7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  }
8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala'
8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaposix_mkdir=
8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Desired mode of installed file.
8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialamode=0755
8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachgrpcmd=
8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachmodcmd=$chmodprog
8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachowncmd=
9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialamvcmd=$mvprog
9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarmcmd="$rmprog -f"
9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastripcmd=
9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialasrc=
9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadst=
9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadir_arg=
9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadst_arg=
9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacopy_on_change=false
10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialano_target_directory=
10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialausage="\
10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala   or: $0 [OPTION]... SRCFILES... DIRECTORY
10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala   or: $0 [OPTION]... -d DIRECTORIES...
10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaIn the 1st form, copy SRCFILE to DSTFILE.
10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaIn the 4th, create DIRECTORIES.
11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaOptions:
11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala     --help     display this help and exit.
11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala     --version  display version info and exit.
11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -c            (ignored)
11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -C            install only if different (preserve the last data modification time)
11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -d            create directories instead of installing files.
11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -g GROUP      $chgrpprog installed files to GROUP.
12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -m MODE       $chmodprog installed files to MODE.
12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -o USER       $chownprog installed files to USER.
12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -s            $stripprog installed files.
12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -t DIRECTORY  install into DIRECTORY.
12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  -T            report an error if DSTFILE is a directory.
12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaEnvironment variables override the default commands:
12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  RMPROG STRIPPROG
12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala"
13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialawhile test $# -ne 0; do
13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  case $1 in
13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -c) ;;
13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -C) copy_on_change=true;;
13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -d) dir_arg=true;;
13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -g) chgrpcmd="$chgrpprog $2"
14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	shift;;
14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    --help) echo "$usage"; exit $?;;
14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -m) mode=$2
14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case $mode in
14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  *' '* | *'	'* | *'
14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala'*	  | *'*'* | *'?'* | *'['*)
14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    echo "$0: invalid mode: $mode" >&2
14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    exit 1;;
15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	esac
15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	shift;;
15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -o) chowncmd="$chownprog $2"
15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	shift;;
15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -s) stripcmd=$stripprog;;
15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -t) dst_arg=$2
15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# Protect names problematic for 'test' and other utilities.
16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case $dst_arg in
16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	esac
16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	shift;;
16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -T) no_target_directory=true;;
16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    --version) echo "$0 $scriptversion"; exit $?;;
16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    --)	shift
17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	break;;
17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -*)	echo "$0: invalid option: $1" >&2
17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	exit 1;;
17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    *)  break;;
17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  esac
17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  shift
17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadone
17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # When -d is used, all remaining arguments are directories to create.
18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # When -t is used, the destination is already specified.
18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # Otherwise, the last argument is the destination.  Remove it from $@.
18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  for arg
18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  do
18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if test -n "$dst_arg"; then
18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # $@ is not empty: it contains at least $arg.
18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      set fnord "$@" "$dst_arg"
18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      shift # fnord
19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    fi
19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    shift # arg
19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    dst_arg=$arg
19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # Protect names problematic for 'test' and other utilities.
19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    case $dst_arg in
19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      -* | [=\(\)!]) dst_arg=./$dst_arg;;
19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    esac
19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  done
19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialafi
19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaif test $# -eq 0; then
20112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  if test -z "$dir_arg"; then
20212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    echo "$0: no input file specified." >&2
20312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    exit 1
20412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  fi
20512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # It's OK to call 'install-sh -d' without argument.
20612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # This can happen when creating conditional directories.
20712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  exit 0
20812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialafi
20912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaif test -z "$dir_arg"; then
21112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  do_exit='(exit $ret); exit $ret'
21212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  trap "ret=129; $do_exit" 1
21312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  trap "ret=130; $do_exit" 2
21412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  trap "ret=141; $do_exit" 13
21512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  trap "ret=143; $do_exit" 15
21612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # Set umask so as not to create temps with too-generous modes.
21812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # However, 'strip' requires both read and write access to temps.
21912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  case $mode in
22012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # Optimize common cases.
22112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    *644) cp_umask=133;;
22212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    *755) cp_umask=22;;
22312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
22412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    *[0-7])
22512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      if test -z "$stripcmd"; then
22612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	u_plus_rw=
22712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      else
22812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	u_plus_rw='% 200'
22912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      fi
23012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
23112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    *)
23212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      if test -z "$stripcmd"; then
23312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	u_plus_rw=
23412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      else
23512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	u_plus_rw=,u+rw
23612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      fi
23712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      cp_umask=$mode$u_plus_rw;;
23812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  esac
23912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialafi
24012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialafor src
24212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialado
24312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  # Protect names problematic for 'test' and other utilities.
24412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  case $src in
24512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    -* | [=\(\)!]) src=./$src;;
24612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  esac
24712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  if test -n "$dir_arg"; then
24912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    dst=$src
25012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    dstdir=$dst
25112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    test -d "$dstdir"
25212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    dstdir_status=$?
25312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  else
25412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
25612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # might cause directories to be created, which would be especially bad
25712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # if $src (and thus $dsttmp) contains '*'.
25812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if test ! -f "$src" && test ! -d "$src"; then
25912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      echo "$0: $src does not exist." >&2
26012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      exit 1
26112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    fi
26212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
26312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if test -z "$dst_arg"; then
26412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      echo "$0: no destination specified." >&2
26512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      exit 1
26612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    fi
26712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    dst=$dst_arg
26812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
26912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # If destination is a directory, append the input filename; won't work
27012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # if double slashes aren't ignored.
27112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if test -d "$dst"; then
27212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      if test -n "$no_target_directory"; then
27312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	echo "$0: $dst_arg: Is a directory" >&2
27412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	exit 1
27512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      fi
27612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      dstdir=$dst
27712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      dst=$dstdir/`basename "$src"`
27812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      dstdir_status=0
27912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    else
28012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # Prefer dirname, but fall back on a substitute if dirname fails.
28112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      dstdir=`
28212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(dirname "$dst") 2>/dev/null ||
28312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
28412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	     X"$dst" : 'X\(//\)[^/]' \| \
28512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	     X"$dst" : 'X\(//\)$' \| \
28612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
28712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	echo X"$dst" |
28812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
28912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   s//\1/
29012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   q
29112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 }
29212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 /^X\(\/\/\)[^/].*/{
29312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   s//\1/
29412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   q
29512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 }
29612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 /^X\(\/\/\)$/{
29712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   s//\1/
29812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   q
29912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 }
30012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 /^X\(\/\).*/{
30112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   s//\1/
30212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   q
30312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 }
30412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 s/.*/./; q'
30512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      `
30612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      test -d "$dstdir"
30812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      dstdir_status=$?
30912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    fi
31012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  fi
31112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  obsolete_mkdir_used=false
31312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  if test $dstdir_status != 0; then
31512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    case $posix_mkdir in
31612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      '')
31712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# Create intermediate dirs using mode 755 as modified by the umask.
31812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# This is like FreeBSD 'install' as of 1997-10-28.
31912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	umask=`umask`
32012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case $stripcmd.$umask in
32112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  # Optimize common cases.
32212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  *[2367][2367]) mkdir_umask=$umask;;
32312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
32412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  *[0-7])
32612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    mkdir_umask=`expr $umask + 22 \
32712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      - $umask % 100 % 40 + $umask % 20 \
32812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      - $umask % 10 % 4 + $umask % 2
32912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    `;;
33012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  *) mkdir_umask=$umask,go-w;;
33112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	esac
33212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
33312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# With -d, create the new directory with the user-specified mode.
33412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# Otherwise, rely on $mkdir_umask.
33512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if test -n "$dir_arg"; then
33612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  mkdir_mode=-m$mode
33712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
33812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  mkdir_mode=
33912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	fi
34012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	posix_mkdir=false
34212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case $umask in
34312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  *[123567][0-7][0-7])
34412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
34512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
34612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    ;;
34712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  *)
34812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
34912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
35012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    if (umask $mkdir_umask &&
35212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
35312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    then
35412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      if test -z "$dir_arg" || {
35512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   # Check for POSIX incompatibilities with -m.
35612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
35712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   # other-writable bit of parent directory when it shouldn't.
35812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
35912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
36012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   case $ls_ld_tmpdir in
36112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		     d????-?r-*) different_mode=700;;
36212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		     d????-?--*) different_mode=755;;
36312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		     *) false;;
36412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   esac &&
36512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
36612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
36712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
36812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   }
36912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 }
37012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      then posix_mkdir=:
37112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      fi
37212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      rmdir "$tmpdir/d" "$tmpdir"
37312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    else
37412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      # Remove any dirs left behind by ancient mkdir implementations.
37512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
37612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    fi
37712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    trap '' 0;;
37812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	esac;;
37912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    esac
38012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
38112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if
38212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      $posix_mkdir && (
38312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	umask $mkdir_umask &&
38412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
38512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      )
38612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    then :
38712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    else
38812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
38912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # The umask is ridiculous, or mkdir does not conform to POSIX,
39012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # or it failed possibly due to a race condition.  Create the
39112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # directory the slow way, step by step, checking for races as we go.
39212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      case $dstdir in
39412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*) prefix='/';;
39512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	[-=\(\)!]*) prefix='./';;
39612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*)  prefix='';;
39712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      esac
39812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      eval "$initialize_posix_glob"
40012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      oIFS=$IFS
40212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      IFS=/
40312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      $posix_glob set -f
40412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      set fnord $dstdir
40512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      shift
40612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      $posix_glob set +f
40712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      IFS=$oIFS
40812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      prefixes=
41012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      for d
41212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      do
41312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	test X"$d" = X && continue
41412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	prefix=$prefix$d
41612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if test -d "$prefix"; then
41712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  prefixes=
41812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
41912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  if $posix_mkdir; then
42012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (umask=$mkdir_umask &&
42112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
42212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    # Don't fail if two instances are running concurrently.
42312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    test -d "$prefix" || exit 1
42412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  else
42512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    case $prefix in
42612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
42712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	      *) qprefix=$prefix;;
42812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    esac
42912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    prefixes="$prefixes '$qprefix'"
43012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  fi
43112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	fi
43212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	prefix=$prefix/
43312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      done
43412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      if test -n "$prefixes"; then
43612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# Don't fail if two instances are running concurrently.
43712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(umask $mkdir_umask &&
43812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 eval "\$doit_exec \$mkdirprog $prefixes") ||
43912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  test -d "$dstdir" || exit 1
44012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	obsolete_mkdir_used=true
44112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      fi
44212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    fi
44312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  fi
44412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  if test -n "$dir_arg"; then
44612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
44712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
44812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
44912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
45012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  else
45112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # Make a couple of temp file names in the proper directory.
45312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    dsttmp=$dstdir/_inst.$$_
45412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    rmtmp=$dstdir/_rm.$$_
45512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # Trap to clean up those temp files at exit.
45712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
45812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # Copy the file name to the temp name.
46012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
46112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # and set any options; do chmod last to preserve setuid bits.
46312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    #
46412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # If any of these fail, we abort the whole thing.  If we want to
46512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # ignore errors from any of these, just make sure not to ignore
46612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # errors from the above "$doit $cpprog $src $dsttmp" command.
46712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    #
46812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
46912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
47012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
47112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
47212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    # If -C, don't bother to copy if it wouldn't change the file.
47412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if $copy_on_change &&
47512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
47612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
47712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       eval "$initialize_posix_glob" &&
47912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       $posix_glob set -f &&
48012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       set X $old && old=:$2:$4:$5:$6 &&
48112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       set X $new && new=:$2:$4:$5:$6 &&
48212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       $posix_glob set +f &&
48312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
48412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       test "$old" = "$new" &&
48512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
48612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    then
48712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      rm -f "$dsttmp"
48812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    else
48912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # Rename the file to the real destination.
49012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
49112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
49212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # The rename failed, perhaps because mv can't rename something else
49312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # to itself, or perhaps because mv is so ancient that it does not
49412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      # support -f.
49512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      {
49612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# Now remove or move aside any old file at destination location.
49712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# We try this two ways since rm can't unlink itself on some
49812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# systems and the destination file might be busy for other
49912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# reasons.  In this case, the final cleanup might fail but the new
50012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# file should still install successfully.
50112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	{
50212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  test ! -f "$dst" ||
50312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  $doit $rmcmd -f "$dst" 2>/dev/null ||
50412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
50512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
50612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  } ||
50712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  { echo "$0: cannot unlink or rename $dst" >&2
50812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (exit 1); exit 1
50912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	  }
51012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} &&
51112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
51212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	# Now rename the file to the real destination.
51312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	$doit $mvcmd "$dsttmp" "$dst"
51412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala      }
51512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    fi || exit 1
51612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
51712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    trap '' 0
51812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala  fi
51912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadone
52012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
52112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# Local variables:
52212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# eval: (add-hook 'write-file-hooks 'time-stamp)
52312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# time-stamp-start: "scriptversion="
52412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# time-stamp-format: "%:y-%02m-%02d.%02H"
52512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# time-stamp-time-zone: "UTC"
52612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# time-stamp-end: "; # UTC"
52712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# End:
528