1548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#!/bin/sh 2548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# install - install a program, script, or datafile 3548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 4548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenscriptversion=2009-04-28.21; # UTC 5548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 6548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# This originates from X11R5 (mit/util/scripts/install.sh), which was 7548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# later released in X11R6 (xc/config/util/install.sh) with the 8548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# following copyright and license. 9548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 10548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Copyright (C) 1994 X Consortium 11548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 12548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Permission is hereby granted, free of charge, to any person obtaining a copy 13548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# of this software and associated documentation files (the "Software"), to 14548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# deal in the Software without restriction, including without limitation the 15548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# sell copies of the Software, and to permit persons to whom the Software is 17548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# furnished to do so, subject to the following conditions: 18548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 19548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# The above copyright notice and this permission notice shall be included in 20548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# all copies or substantial portions of the Software. 21548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 22548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 29548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Except as contained in this notice, the name of the X Consortium shall not 30548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# be used in advertising or otherwise to promote the sale, use or other deal- 31548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# ings in this Software without prior written authorization from the X Consor- 32548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# tium. 33548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 34548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 35548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# FSF changes to this file are in the public domain. 36548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 37548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Calling this script install-sh is preferred over install.sh, to prevent 38548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# `make' implicit rules from creating a file called install from it 39548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# when there is no Makefile. 40548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# 41548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# This script is compatible with the BSD install script, but was written 42548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# from scratch. 43548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 44548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissennl=' 45548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen' 46548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIFS=" "" $nl" 47548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 48548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# set DOITPROG to echo to test this script 49548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 50548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Don't use :- since 4.3BSD and earlier shells don't like it. 51548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendoit=${DOITPROG-} 52548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test -z "$doit"; then 53548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen doit_exec=exec 54548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenelse 55548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen doit_exec=$doit 56548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi 57548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 58548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Put in absolute file names if you don't have them in your path; 59548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# or use environment vars. 60548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 61548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchgrpprog=${CHGRPPROG-chgrp} 62548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchmodprog=${CHMODPROG-chmod} 63548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchownprog=${CHOWNPROG-chown} 64548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissencmpprog=${CMPPROG-cmp} 65548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissencpprog=${CPPROG-cp} 66548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmkdirprog=${MKDIRPROG-mkdir} 67548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmvprog=${MVPROG-mv} 68548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenrmprog=${RMPROG-rm} 69548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstripprog=${STRIPPROG-strip} 70548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 71548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenposix_glob='?' 72548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelisseninitialize_posix_glob=' 73548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test "$posix_glob" != "?" || { 74548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (set -f) 2>/dev/null; then 75548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen posix_glob= 76548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 77548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen posix_glob=: 78548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 79548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 80548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen' 81548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 82548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenposix_mkdir= 83548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 84548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Desired mode of installed file. 85548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmode=0755 86548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 87548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchgrpcmd= 88548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchmodcmd=$chmodprog 89548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchowncmd= 90548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmvcmd=$mvprog 91548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenrmcmd="$rmprog -f" 92548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstripcmd= 93548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 94548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissensrc= 95548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendst= 96548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendir_arg= 97548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendst_arg= 98548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 99548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissencopy_on_change=false 100548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenno_target_directory= 101548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 102548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenusage="\ 103548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen or: $0 [OPTION]... SRCFILES... DIRECTORY 105548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen or: $0 [OPTION]... -d DIRECTORIES... 107548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 108548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIn the 1st form, copy SRCFILE to DSTFILE. 109548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIn the 4th, create DIRECTORIES. 111548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 112548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenOptions: 113548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen --help display this help and exit. 114548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen --version display version info and exit. 115548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 116548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -c (ignored) 117548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -C install only if different (preserve the last data modification time) 118548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -d create directories instead of installing files. 119548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -g GROUP $chgrpprog installed files to GROUP. 120548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -m MODE $chmodprog installed files to MODE. 121548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -o USER $chownprog installed files to USER. 122548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -s $stripprog installed files. 123548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -t DIRECTORY install into DIRECTORY. 124548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -T report an error if DSTFILE is a directory. 125548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 126548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenEnvironment variables override the default commands: 127548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen RMPROG STRIPPROG 129548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen" 130548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 131548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenwhile test $# -ne 0; do 132548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $1 in 133548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -c) ;; 134548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 135548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -C) copy_on_change=true;; 136548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 137548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -d) dir_arg=true;; 138548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 139548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -g) chgrpcmd="$chgrpprog $2" 140548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift;; 141548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 142548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen --help) echo "$usage"; exit $?;; 143548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 144548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -m) mode=$2 145548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $mode in 146548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *' '* | *' '* | *' 147548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen'* | *'*'* | *'?'* | *'['*) 148548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen echo "$0: invalid mode: $mode" >&2 149548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit 1;; 150548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 151548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift;; 152548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 153548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -o) chowncmd="$chownprog $2" 154548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift;; 155548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 156548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -s) stripcmd=$stripprog;; 157548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 158548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -t) dst_arg=$2 159548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift;; 160548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 161548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -T) no_target_directory=true;; 162548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 163548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen --version) echo "$0 $scriptversion"; exit $?;; 164548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 165548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen --) shift 166548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen break;; 167548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 168548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -*) echo "$0: invalid option: $1" >&2 169548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit 1;; 170548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 171548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *) break;; 172548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 173548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift 174548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendone 175548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 176548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 177548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # When -d is used, all remaining arguments are directories to create. 178548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # When -t is used, the destination is already specified. 179548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Otherwise, the last argument is the destination. Remove it from $@. 180548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen for arg 181548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen do 182548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -n "$dst_arg"; then 183548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # $@ is not empty: it contains at least $arg. 184548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen set fnord "$@" "$dst_arg" 185548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift # fnord 186548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 187548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift # arg 188548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dst_arg=$arg 189548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen done 190548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi 191548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 192548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test $# -eq 0; then 193548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -z "$dir_arg"; then 194548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen echo "$0: no input file specified." >&2 195548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit 1 196548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 197548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # It's OK to call `install-sh -d' without argument. 198548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # This can happen when creating conditional directories. 199548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit 0 200548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi 201548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 202548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test -z "$dir_arg"; then 203548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen trap '(exit $?); exit' 1 2 13 15 204548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 205548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Set umask so as not to create temps with too-generous modes. 206548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # However, 'strip' requires both read and write access to temps. 207548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $mode in 208548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Optimize common cases. 209548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *644) cp_umask=133;; 210548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *755) cp_umask=22;; 211548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 212548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *[0-7]) 213548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -z "$stripcmd"; then 214548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen u_plus_rw= 215548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 216548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen u_plus_rw='% 200' 217548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 218548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 219548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *) 220548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -z "$stripcmd"; then 221548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen u_plus_rw= 222548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 223548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen u_plus_rw=,u+rw 224548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 225548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen cp_umask=$mode$u_plus_rw;; 226548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 227548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi 228548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 229548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfor src 230548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendo 231548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Protect names starting with `-'. 232548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $src in 233548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -*) src=./$src;; 234548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 235548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 236548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -n "$dir_arg"; then 237548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dst=$src 238548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dstdir=$dst 239548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test -d "$dstdir" 240548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dstdir_status=$? 241548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 242548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 243548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 244548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # might cause directories to be created, which would be especially bad 245548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # if $src (and thus $dsttmp) contains '*'. 246548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test ! -f "$src" && test ! -d "$src"; then 247548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen echo "$0: $src does not exist." >&2 248548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit 1 249548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 250548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 251548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -z "$dst_arg"; then 252548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen echo "$0: no destination specified." >&2 253548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit 1 254548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 255548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 256548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dst=$dst_arg 257548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Protect names starting with `-'. 258548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $dst in 259548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -*) dst=./$dst;; 260548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 261548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 262548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # If destination is a directory, append the input filename; won't work 263548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # if double slashes aren't ignored. 264548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -d "$dst"; then 265548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -n "$no_target_directory"; then 266548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen echo "$0: $dst_arg: Is a directory" >&2 267548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit 1 268548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 269548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dstdir=$dst 270548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dst=$dstdir/`basename "$src"` 271548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dstdir_status=0 272548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 273548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Prefer dirname, but fall back on a substitute if dirname fails. 274548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dstdir=` 275548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen (dirname "$dst") 2>/dev/null || 276548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 277548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen X"$dst" : 'X\(//\)[^/]' \| \ 278548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen X"$dst" : 'X\(//\)$' \| \ 279548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen X"$dst" : 'X\(/\)' \| . 2>/dev/null || 280548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen echo X"$dst" | 281548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 282548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen s//\1/ 283548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen q 284548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 285548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /^X\(\/\/\)[^/].*/{ 286548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen s//\1/ 287548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen q 288548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 289548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /^X\(\/\/\)$/{ 290548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen s//\1/ 291548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen q 292548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 293548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /^X\(\/\).*/{ 294548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen s//\1/ 295548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen q 296548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 297548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen s/.*/./; q' 298548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ` 299548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 300548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test -d "$dstdir" 301548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dstdir_status=$? 302548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 303548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 304548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 305548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen obsolete_mkdir_used=false 306548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 307548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test $dstdir_status != 0; then 308548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $posix_mkdir in 309548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen '') 310548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Create intermediate dirs using mode 755 as modified by the umask. 311548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # This is like FreeBSD 'install' as of 1997-10-28. 312548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen umask=`umask` 313548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $stripcmd.$umask in 314548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Optimize common cases. 315548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *[2367][2367]) mkdir_umask=$umask;; 316548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 317548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 318548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *[0-7]) 319548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen mkdir_umask=`expr $umask + 22 \ 320548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen - $umask % 100 % 40 + $umask % 20 \ 321548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen - $umask % 10 % 4 + $umask % 2 322548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen `;; 323548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *) mkdir_umask=$umask,go-w;; 324548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 325548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 326548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # With -d, create the new directory with the user-specified mode. 327548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Otherwise, rely on $mkdir_umask. 328548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -n "$dir_arg"; then 329548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen mkdir_mode=-m$mode 330548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 331548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen mkdir_mode= 332548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 333548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 334548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen posix_mkdir=false 335548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $umask in 336548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *[123567][0-7][0-7]) 337548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # POSIX mkdir -p sets u+wx bits regardless of umask, which 338548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 339548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ;; 340548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *) 341548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 342548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 343548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 344548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (umask $mkdir_umask && 345548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 346548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen then 347548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -z "$dir_arg" || { 348548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Check for POSIX incompatibilities with -m. 349548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 350548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # other-writeable bit of parent directory when it shouldn't. 351548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 352548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ls_ld_tmpdir=`ls -ld "$tmpdir"` 353548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $ls_ld_tmpdir in 354548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen d????-?r-*) different_mode=700;; 355548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen d????-?--*) different_mode=755;; 356548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *) false;; 357548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac && 358548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $mkdirprog -m$different_mode -p -- "$tmpdir" && { 359548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 360548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 361548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 362548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 363548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen then posix_mkdir=: 364548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 365548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen rmdir "$tmpdir/d" "$tmpdir" 366548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 367548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Remove any dirs left behind by ancient mkdir implementations. 368548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 369548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 370548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen trap '' 0;; 371548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac;; 372548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 373548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 374548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if 375548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $posix_mkdir && ( 376548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen umask $mkdir_umask && 377548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 378548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ) 379548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen then : 380548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 381548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 382548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # The umask is ridiculous, or mkdir does not conform to POSIX, 383548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # or it failed possibly due to a race condition. Create the 384548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # directory the slow way, step by step, checking for races as we go. 385548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 386548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $dstdir in 387548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*) prefix='/';; 388548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen -*) prefix='./';; 389548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *) prefix='';; 390548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 391548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 392548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen eval "$initialize_posix_glob" 393548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 394548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen oIFS=$IFS 395548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen IFS=/ 396548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $posix_glob set -f 397548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen set fnord $dstdir 398548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen shift 399548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $posix_glob set +f 400548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen IFS=$oIFS 401548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 402548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen prefixes= 403548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 404548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen for d 405548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen do 406548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test -z "$d" && continue 407548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 408548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen prefix=$prefix$d 409548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -d "$prefix"; then 410548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen prefixes= 411548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 412548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if $posix_mkdir; then 413548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen (umask=$mkdir_umask && 414548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 415548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Don't fail if two instances are running concurrently. 416548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test -d "$prefix" || exit 1 417548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 418548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen case $prefix in 419548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 420548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *) qprefix=$prefix;; 421548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen esac 422548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen prefixes="$prefixes '$qprefix'" 423548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 424548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 425548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen prefix=$prefix/ 426548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen done 427548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 428548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -n "$prefixes"; then 429548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Don't fail if two instances are running concurrently. 430548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen (umask $mkdir_umask && 431548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen eval "\$doit_exec \$mkdirprog $prefixes") || 432548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test -d "$dstdir" || exit 1 433548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen obsolete_mkdir_used=true 434548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 435548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 436548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 437548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 438548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if test -n "$dir_arg"; then 439548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 440548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 441548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 442548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 443548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 444548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 445548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Make a couple of temp file names in the proper directory. 446548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dsttmp=$dstdir/_inst.$$_ 447548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen rmtmp=$dstdir/_rm.$$_ 448548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 449548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Trap to clean up those temp files at exit. 450548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 451548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 452548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Copy the file name to the temp name. 453548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 454548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 455548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # and set any options; do chmod last to preserve setuid bits. 456548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # 457548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # If any of these fail, we abort the whole thing. If we want to 458548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # ignore errors from any of these, just make sure not to ignore 459548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # errors from the above "$doit $cpprog $src $dsttmp" command. 460548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # 461548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 462548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 463548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 464548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 465548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 466548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # If -C, don't bother to copy if it wouldn't change the file. 467548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if $copy_on_change && 468548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 469548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 470548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 471548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen eval "$initialize_posix_glob" && 472548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $posix_glob set -f && 473548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen set X $old && old=:$2:$4:$5:$6 && 474548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen set X $new && new=:$2:$4:$5:$6 && 475548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $posix_glob set +f && 476548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 477548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test "$old" = "$new" && 478548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 479548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen then 480548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen rm -f "$dsttmp" 481548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 482548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Rename the file to the real destination. 483548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 484548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 485548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # The rename failed, perhaps because mv can't rename something else 486548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # to itself, or perhaps because mv is so ancient that it does not 487548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # support -f. 488548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { 489548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Now remove or move aside any old file at destination location. 490548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # We try this two ways since rm can't unlink itself on some 491548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # systems and the destination file might be busy for other 492548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # reasons. In this case, the final cleanup might fail but the new 493548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # file should still install successfully. 494548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { 495548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen test ! -f "$dst" || 496548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $doit $rmcmd -f "$dst" 2>/dev/null || 497548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 498548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 499548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } || 500548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen { echo "$0: cannot unlink or rename $dst" >&2 501548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen (exit 1); exit 1 502548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 503548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } && 504548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 505548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen # Now rename the file to the real destination. 506548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen $doit $mvcmd "$dsttmp" "$dst" 507548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 508548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi || exit 1 509548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 510548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen trap '' 0 511548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fi 512548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendone 513548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 514548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Local variables: 515548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# eval: (add-hook 'write-file-hooks 'time-stamp) 516548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-start: "scriptversion=" 517548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-format: "%:y-%02m-%02d.%02H" 518548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-time-zone: "UTC" 519548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-end: "; # UTC" 520548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# End: 521