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