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