1f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#!/bin/sh
2f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# install - install a program, script, or datafile
3f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
48366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughesscriptversion=2013-12-25.23; # UTC
5f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
6f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# This originates from X11R5 (mit/util/scripts/install.sh), which was
7f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# later released in X11R6 (xc/config/util/install.sh) with the
8f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# following copyright and license.
9f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
10f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# Copyright (C) 1994 X Consortium
11f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
12f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# Permission is hereby granted, free of charge, to any person obtaining a copy
13f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# of this software and associated documentation files (the "Software"), to
14f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# deal in the Software without restriction, including without limitation the
15f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# sell copies of the Software, and to permit persons to whom the Software is
17f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# furnished to do so, subject to the following conditions:
18f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
19f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# The above copyright notice and this permission notice shall be included in
20f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# all copies or substantial portions of the Software.
21f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
22f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
29f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# Except as contained in this notice, the name of the X Consortium shall not
30f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# be used in advertising or otherwise to promote the sale, use or other deal-
31f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# ings in this Software without prior written authorization from the X Consor-
32f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# tium.
33f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
34f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
35f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# FSF changes to this file are in the public domain.
36f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
37f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# Calling this script install-sh is preferred over install.sh, to prevent
38f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# 'make' implicit rules from creating a file called install from it
39f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# when there is no Makefile.
40f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#
41f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# This script is compatible with the BSD install script, but was written
42f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# from scratch.
43f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
448366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughestab='	'
45f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichnl='
46f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich'
478366e8beecf85b8e61b5c1a1369666db7a292eaeElliott HughesIFS=" $tab$nl"
48f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
498366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes# Set DOITPROG to "echo" to test this script.
50f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
51f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdoit=${DOITPROG-}
528366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughesdoit_exec=${doit:-exec}
53f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
54f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# Put in absolute file names if you don't have them in your path;
55f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# or use environment vars.
56f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
57f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichchgrpprog=${CHGRPPROG-chgrp}
58f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichchmodprog=${CHMODPROG-chmod}
59f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichchownprog=${CHOWNPROG-chown}
60f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcmpprog=${CMPPROG-cmp}
61f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcpprog=${CPPROG-cp}
62f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmkdirprog=${MKDIRPROG-mkdir}
63f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmvprog=${MVPROG-mv}
64f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichrmprog=${RMPROG-rm}
65f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstripprog=${STRIPPROG-strip}
66f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
67f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichposix_mkdir=
68f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
69f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# Desired mode of installed file.
70f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmode=0755
71f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
72f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichchgrpcmd=
73f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichchmodcmd=$chmodprog
74f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichchowncmd=
75f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmvcmd=$mvprog
76f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichrmcmd="$rmprog -f"
77f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstripcmd=
78f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
79f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsrc=
80f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdst=
81f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdir_arg=
82f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdst_arg=
83f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
84f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcopy_on_change=false
858366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughesis_target_a_directory=possibly
86f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
87f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichusage="\
88f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
89f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich   or: $0 [OPTION]... SRCFILES... DIRECTORY
90f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
91f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich   or: $0 [OPTION]... -d DIRECTORIES...
92f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
93f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIn the 1st form, copy SRCFILE to DSTFILE.
94f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
95f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIn the 4th, create DIRECTORIES.
96f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
97f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichOptions:
98f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich     --help     display this help and exit.
99f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich     --version  display version info and exit.
100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -c            (ignored)
102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -C            install only if different (preserve the last data modification time)
103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -d            create directories instead of installing files.
104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -g GROUP      $chgrpprog installed files to GROUP.
105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -m MODE       $chmodprog installed files to MODE.
106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -o USER       $chownprog installed files to USER.
107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -s            $stripprog installed files.
108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -t DIRECTORY  install into DIRECTORY.
109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  -T            report an error if DSTFILE is a directory.
110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichEnvironment variables override the default commands:
112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  RMPROG STRIPPROG
114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich"
115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile test $# -ne 0; do
117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  case $1 in
118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -c) ;;
119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -C) copy_on_change=true;;
121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -d) dir_arg=true;;
123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -g) chgrpcmd="$chgrpprog $2"
1258366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        shift;;
126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    --help) echo "$usage"; exit $?;;
128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -m) mode=$2
1308366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        case $mode in
1318366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
1328366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            echo "$0: invalid mode: $mode" >&2
1338366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            exit 1;;
1348366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        esac
1358366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        shift;;
136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -o) chowncmd="$chownprog $2"
1388366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        shift;;
139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -s) stripcmd=$stripprog;;
141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
1428366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    -t)
1438366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        is_target_a_directory=always
1448366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        dst_arg=$2
1458366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # Protect names problematic for 'test' and other utilities.
1468366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        case $dst_arg in
1478366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          -* | [=\(\)!]) dst_arg=./$dst_arg;;
1488366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        esac
1498366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        shift;;
150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
1518366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    -T) is_target_a_directory=never;;
152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    --version) echo "$0 $scriptversion"; exit $?;;
154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
1558366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    --) shift
1568366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        break;;
157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
1588366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    -*) echo "$0: invalid option: $1" >&2
1598366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        exit 1;;
160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    *)  break;;
162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  esac
163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  shift
164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdone
165f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
1668366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes# We allow the use of options -d and -T together, by making -d
1678366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes# take the precedence; this is for compatibility with GNU install.
1688366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
1698366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughesif test -n "$dir_arg"; then
1708366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes  if test -n "$dst_arg"; then
1718366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    echo "$0: target directory not allowed when installing a directory." >&2
1728366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    exit 1
1738366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes  fi
1748366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughesfi
1758366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
176f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # When -d is used, all remaining arguments are directories to create.
178f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # When -t is used, the destination is already specified.
179f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # Otherwise, the last argument is the destination.  Remove it from $@.
180f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  for arg
181f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  do
182f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    if test -n "$dst_arg"; then
183f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # $@ is not empty: it contains at least $arg.
184f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      set fnord "$@" "$dst_arg"
185f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      shift # fnord
186f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    fi
187f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    shift # arg
188f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    dst_arg=$arg
189f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # Protect names problematic for 'test' and other utilities.
190f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    case $dst_arg in
191f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      -* | [=\(\)!]) dst_arg=./$dst_arg;;
192f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    esac
193f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  done
194f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfi
195f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
196f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif test $# -eq 0; then
197f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  if test -z "$dir_arg"; then
198f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    echo "$0: no input file specified." >&2
199f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    exit 1
200f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  fi
201f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # It's OK to call 'install-sh -d' without argument.
202f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # This can happen when creating conditional directories.
203f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  exit 0
204f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfi
205f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
206f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif test -z "$dir_arg"; then
2078366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes  if test $# -gt 1 || test "$is_target_a_directory" = always; then
2088366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    if test ! -d "$dst_arg"; then
2098366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes      echo "$0: $dst_arg: Is not a directory." >&2
2108366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes      exit 1
2118366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes    fi
2128366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes  fi
2138366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughesfi
2148366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
2158366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughesif test -z "$dir_arg"; then
216f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  do_exit='(exit $ret); exit $ret'
217f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  trap "ret=129; $do_exit" 1
218f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  trap "ret=130; $do_exit" 2
219f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  trap "ret=141; $do_exit" 13
220f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  trap "ret=143; $do_exit" 15
221f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
222f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # Set umask so as not to create temps with too-generous modes.
223f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # However, 'strip' requires both read and write access to temps.
224f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  case $mode in
225f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # Optimize common cases.
226f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    *644) cp_umask=133;;
227f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    *755) cp_umask=22;;
228f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
229f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    *[0-7])
230f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      if test -z "$stripcmd"; then
2318366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        u_plus_rw=
232f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      else
2338366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        u_plus_rw='% 200'
234f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      fi
235f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
236f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    *)
237f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      if test -z "$stripcmd"; then
2388366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        u_plus_rw=
239f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      else
2408366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        u_plus_rw=,u+rw
241f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      fi
242f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      cp_umask=$mode$u_plus_rw;;
243f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  esac
244f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfi
245f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
246f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor src
247f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdo
248f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  # Protect names problematic for 'test' and other utilities.
249f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  case $src in
250f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    -* | [=\(\)!]) src=./$src;;
251f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  esac
252f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
253f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  if test -n "$dir_arg"; then
254f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    dst=$src
255f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    dstdir=$dst
256f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    test -d "$dstdir"
257f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    dstdir_status=$?
258f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  else
259f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
260f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
261f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # might cause directories to be created, which would be especially bad
262f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # if $src (and thus $dsttmp) contains '*'.
263f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    if test ! -f "$src" && test ! -d "$src"; then
264f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      echo "$0: $src does not exist." >&2
265f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      exit 1
266f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    fi
267f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
268f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    if test -z "$dst_arg"; then
269f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      echo "$0: no destination specified." >&2
270f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      exit 1
271f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    fi
272f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    dst=$dst_arg
273f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
274f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # If destination is a directory, append the input filename; won't work
275f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # if double slashes aren't ignored.
276f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    if test -d "$dst"; then
2778366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes      if test "$is_target_a_directory" = never; then
2788366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        echo "$0: $dst_arg: Is a directory" >&2
2798366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        exit 1
280f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      fi
281f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      dstdir=$dst
282f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      dst=$dstdir/`basename "$src"`
283f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      dstdir_status=0
284f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    else
2858366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes      dstdir=`dirname "$dst"`
286f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      test -d "$dstdir"
287f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      dstdir_status=$?
288f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    fi
289f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  fi
290f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
291f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  obsolete_mkdir_used=false
292f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
293f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  if test $dstdir_status != 0; then
294f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    case $posix_mkdir in
295f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      '')
2968366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # Create intermediate dirs using mode 755 as modified by the umask.
2978366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # This is like FreeBSD 'install' as of 1997-10-28.
2988366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        umask=`umask`
2998366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        case $stripcmd.$umask in
3008366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          # Optimize common cases.
3018366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          *[2367][2367]) mkdir_umask=$umask;;
3028366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
3038366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
3048366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          *[0-7])
3058366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            mkdir_umask=`expr $umask + 22 \
3068366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              - $umask % 100 % 40 + $umask % 20 \
3078366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              - $umask % 10 % 4 + $umask % 2
3088366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            `;;
3098366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          *) mkdir_umask=$umask,go-w;;
3108366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        esac
3118366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
3128366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # With -d, create the new directory with the user-specified mode.
3138366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # Otherwise, rely on $mkdir_umask.
3148366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        if test -n "$dir_arg"; then
3158366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          mkdir_mode=-m$mode
3168366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        else
3178366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          mkdir_mode=
3188366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        fi
3198366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
3208366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        posix_mkdir=false
3218366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        case $umask in
3228366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          *[123567][0-7][0-7])
3238366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            # POSIX mkdir -p sets u+wx bits regardless of umask, which
3248366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
3258366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            ;;
3268366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          *)
3278366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
3288366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
3298366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
3308366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            if (umask $mkdir_umask &&
3318366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
3328366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            then
3338366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              if test -z "$dir_arg" || {
3348366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   # Check for POSIX incompatibilities with -m.
3358366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
3368366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   # other-writable bit of parent directory when it shouldn't.
3378366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
3388366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
3398366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   case $ls_ld_tmpdir in
3408366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                     d????-?r-*) different_mode=700;;
3418366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                     d????-?--*) different_mode=755;;
3428366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                     *) false;;
3438366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   esac &&
3448366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
3458366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
3468366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
3478366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                   }
3488366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes                 }
3498366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              then posix_mkdir=:
3508366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              fi
3518366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              rmdir "$tmpdir/d" "$tmpdir"
3528366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            else
3538366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              # Remove any dirs left behind by ancient mkdir implementations.
3548366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
3558366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            fi
3568366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            trap '' 0;;
3578366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        esac;;
358f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    esac
359f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
360f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    if
361f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      $posix_mkdir && (
3628366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        umask $mkdir_umask &&
3638366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
364f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      )
365f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    then :
366f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    else
367f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
368f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # The umask is ridiculous, or mkdir does not conform to POSIX,
369f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # or it failed possibly due to a race condition.  Create the
370f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # directory the slow way, step by step, checking for races as we go.
371f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
372f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      case $dstdir in
3738366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        /*) prefix='/';;
3748366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        [-=\(\)!]*) prefix='./';;
3758366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        *)  prefix='';;
376f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      esac
377f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
378f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      oIFS=$IFS
379f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      IFS=/
3808366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes      set -f
381f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      set fnord $dstdir
382f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      shift
3838366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes      set +f
384f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      IFS=$oIFS
385f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
386f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      prefixes=
387f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
388f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      for d
389f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      do
3908366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        test X"$d" = X && continue
3918366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
3928366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        prefix=$prefix$d
3938366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        if test -d "$prefix"; then
3948366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          prefixes=
3958366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        else
3968366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          if $posix_mkdir; then
3978366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            (umask=$mkdir_umask &&
3988366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
3998366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            # Don't fail if two instances are running concurrently.
4008366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            test -d "$prefix" || exit 1
4018366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          else
4028366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            case $prefix in
4038366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
4048366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes              *) qprefix=$prefix;;
4058366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            esac
4068366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            prefixes="$prefixes '$qprefix'"
4078366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          fi
4088366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        fi
4098366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        prefix=$prefix/
410f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      done
411f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
412f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      if test -n "$prefixes"; then
4138366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # Don't fail if two instances are running concurrently.
4148366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        (umask $mkdir_umask &&
4158366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes         eval "\$doit_exec \$mkdirprog $prefixes") ||
4168366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          test -d "$dstdir" || exit 1
4178366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        obsolete_mkdir_used=true
418f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      fi
419f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    fi
420f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  fi
421f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
422f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  if test -n "$dir_arg"; then
423f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
424f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
425f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
426f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
427f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  else
428f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
429f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # Make a couple of temp file names in the proper directory.
430f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    dsttmp=$dstdir/_inst.$$_
431f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    rmtmp=$dstdir/_rm.$$_
432f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
433f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # Trap to clean up those temp files at exit.
434f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
435f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
436f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # Copy the file name to the temp name.
437f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
438f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
439f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # and set any options; do chmod last to preserve setuid bits.
440f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    #
441f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # If any of these fail, we abort the whole thing.  If we want to
442f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # ignore errors from any of these, just make sure not to ignore
443f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # errors from the above "$doit $cpprog $src $dsttmp" command.
444f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    #
445f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
446f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
447f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
448f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
449f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
450f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    # If -C, don't bother to copy if it wouldn't change the file.
451f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    if $copy_on_change &&
4528366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
4538366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
4548366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes       set -f &&
455f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich       set X $old && old=:$2:$4:$5:$6 &&
456f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich       set X $new && new=:$2:$4:$5:$6 &&
4578366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes       set +f &&
458f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich       test "$old" = "$new" &&
459f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
460f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    then
461f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      rm -f "$dsttmp"
462f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    else
463f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # Rename the file to the real destination.
464f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
465f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
466f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # The rename failed, perhaps because mv can't rename something else
467f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # to itself, or perhaps because mv is so ancient that it does not
468f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      # support -f.
469f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      {
4708366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # Now remove or move aside any old file at destination location.
4718366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # We try this two ways since rm can't unlink itself on some
4728366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # systems and the destination file might be busy for other
4738366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # reasons.  In this case, the final cleanup might fail but the new
4748366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # file should still install successfully.
4758366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        {
4768366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          test ! -f "$dst" ||
4778366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          $doit $rmcmd -f "$dst" 2>/dev/null ||
4788366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
4798366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
4808366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          } ||
4818366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          { echo "$0: cannot unlink or rename $dst" >&2
4828366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes            (exit 1); exit 1
4838366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes          }
4848366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        } &&
4858366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes
4868366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        # Now rename the file to the real destination.
4878366e8beecf85b8e61b5c1a1369666db7a292eaeElliott Hughes        $doit $mvcmd "$dsttmp" "$dst"
488f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich      }
489f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    fi || exit 1
490f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
491f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich    trap '' 0
492f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich  fi
493f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdone
494f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich
495f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# Local variables:
496f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# eval: (add-hook 'write-file-hooks 'time-stamp)
497f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# time-stamp-start: "scriptversion="
498f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# time-stamp-format: "%:y-%02m-%02d.%02H"
499f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# time-stamp-time-zone: "UTC"
500f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# time-stamp-end: "; # UTC"
501f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich# End:
502