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