1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#!/bin/sh 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# install - install a program, script, or datafile 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillescriptversion=2006-12-25.00 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# This originates from X11R5 (mit/util/scripts/install.sh), which was 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# later released in X11R6 (xc/config/util/install.sh) with the 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# following copyright and license. 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright (C) 1994 X Consortium 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Permission is hereby granted, free of charge, to any person obtaining a copy 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# of this software and associated documentation files (the "Software"), to 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# deal in the Software without restriction, including without limitation the 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# sell copies of the Software, and to permit persons to whom the Software is 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# furnished to do so, subject to the following conditions: 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The above copyright notice and this permission notice shall be included in 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# all copies or substantial portions of the Software. 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Except as contained in this notice, the name of the X Consortium shall not 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# be used in advertising or otherwise to promote the sale, use or other deal- 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# ings in this Software without prior written authorization from the X Consor- 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# tium. 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# FSF changes to this file are in the public domain. 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Calling this script install-sh is preferred over install.sh, to prevent 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# `make' implicit rules from creating a file called install from it 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# when there is no Makefile. 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# This script is compatible with the BSD install script, but was written 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# from scratch. 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenl=' 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville' 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIFS=" "" $nl" 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# set DOITPROG to echo to test this script 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Don't use :- since 4.3BSD and earlier shells don't like it. 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledoit=${DOITPROG-} 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif test -z "$doit"; then 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville doit_exec=exec 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleelse 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville doit_exec=$doit 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefi 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Put in absolute file names if you don't have them in your path; 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# or use environment vars. 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillechgrpprog=${CHGRPPROG-chgrp} 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillechmodprog=${CHMODPROG-chmod} 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillechownprog=${CHOWNPROG-chown} 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillecmpprog=${CMPPROG-cmp} 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillecpprog=${CPPROG-cp} 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemkdirprog=${MKDIRPROG-mkdir} 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemvprog=${MVPROG-mv} 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillermprog=${RMPROG-rm} 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestripprog=${STRIPPROG-strip} 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleposix_glob='?' 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinitialize_posix_glob=' 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test "$posix_glob" != "?" || { 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (set -f) 2>/dev/null; then 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville posix_glob= 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville posix_glob=: 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville' 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleposix_mkdir= 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Desired mode of installed file. 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemode=0755 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillechgrpcmd= 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillechmodcmd=$chmodprog 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillechowncmd= 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemvcmd=$mvprog 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillermcmd="$rmprog -f" 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestripcmd= 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillesrc= 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledst= 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledir_arg= 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledst_arg= 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillecopy_on_change=false 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleno_target_directory= 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusage="\ 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville or: $0 [OPTION]... SRCFILES... DIRECTORY 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville or: $0 [OPTION]... -d DIRECTORIES... 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIn the 1st form, copy SRCFILE to DSTFILE. 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIn the 4th, create DIRECTORIES. 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleOptions: 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville --help display this help and exit. 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville --version display version info and exit. 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -c (ignored) 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -C install only if different (preserve the last data modification time) 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -d create directories instead of installing files. 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -g GROUP $chgrpprog installed files to GROUP. 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -m MODE $chmodprog installed files to MODE. 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -o USER $chownprog installed files to USER. 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -s $stripprog installed files. 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -t DIRECTORY install into DIRECTORY. 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -T report an error if DSTFILE is a directory. 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEnvironment variables override the default commands: 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RMPROG STRIPPROG 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville" 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillewhile test $# -ne 0; do 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $1 in 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -c) ;; 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -C) copy_on_change=true;; 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -d) dir_arg=true;; 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -g) chgrpcmd="$chgrpprog $2" 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift;; 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville --help) echo "$usage"; exit $?;; 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -m) mode=$2 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $mode in 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *' '* | *' '* | *' 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville'* | *'*'* | *'?'* | *'['*) 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville echo "$0: invalid mode: $mode" >&2 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exit 1;; 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift;; 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -o) chowncmd="$chownprog $2" 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift;; 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -s) stripcmd=$stripprog;; 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -t) dst_arg=$2 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift;; 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -T) no_target_directory=true;; 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville --version) echo "$0 $scriptversion"; exit $?;; 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville --) shift 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville break;; 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -*) echo "$0: invalid option: $1" >&2 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exit 1;; 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *) break;; 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledone 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # When -d is used, all remaining arguments are directories to create. 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # When -t is used, the destination is already specified. 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Otherwise, the last argument is the destination. Remove it from $@. 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for arg 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville do 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -n "$dst_arg"; then 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # $@ is not empty: it contains at least $arg. 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set fnord "$@" "$dst_arg" 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift # fnord 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift # arg 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dst_arg=$arg 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville done 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefi 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif test $# -eq 0; then 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -z "$dir_arg"; then 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville echo "$0: no input file specified." >&2 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exit 1 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # It's OK to call `install-sh -d' without argument. 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # This can happen when creating conditional directories. 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exit 0 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefi 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif test -z "$dir_arg"; then 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville trap '(exit $?); exit' 1 2 13 15 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Set umask so as not to create temps with too-generous modes. 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # However, 'strip' requires both read and write access to temps. 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $mode in 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Optimize common cases. 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *644) cp_umask=133;; 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *755) cp_umask=22;; 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *[0-7]) 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -z "$stripcmd"; then 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville u_plus_rw= 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville u_plus_rw='% 200' 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *) 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -z "$stripcmd"; then 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville u_plus_rw= 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville u_plus_rw=,u+rw 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville cp_umask=$mode$u_plus_rw;; 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefi 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefor src 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledo 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Protect names starting with `-'. 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $src in 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -*) src=./$src;; 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -n "$dir_arg"; then 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dst=$src 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dstdir=$dst 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test -d "$dstdir" 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dstdir_status=$? 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # might cause directories to be created, which would be especially bad 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # if $src (and thus $dsttmp) contains '*'. 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test ! -f "$src" && test ! -d "$src"; then 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville echo "$0: $src does not exist." >&2 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exit 1 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -z "$dst_arg"; then 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville echo "$0: no destination specified." >&2 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exit 1 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dst=$dst_arg 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Protect names starting with `-'. 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $dst in 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -*) dst=./$dst;; 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # If destination is a directory, append the input filename; won't work 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # if double slashes aren't ignored. 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -d "$dst"; then 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -n "$no_target_directory"; then 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville echo "$0: $dst_arg: Is a directory" >&2 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exit 1 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dstdir=$dst 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dst=$dstdir/`basename "$src"` 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dstdir_status=0 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Prefer dirname, but fall back on a substitute if dirname fails. 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dstdir=` 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (dirname "$dst") 2>/dev/null || 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville X"$dst" : 'X\(//\)[^/]' \| \ 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville X"$dst" : 'X\(//\)$' \| \ 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville X"$dst" : 'X\(/\)' \| . 2>/dev/null || 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville echo X"$dst" | 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville s//\1/ 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /^X\(\/\/\)[^/].*/{ 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville s//\1/ 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /^X\(\/\/\)$/{ 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville s//\1/ 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /^X\(\/\).*/{ 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville s//\1/ 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville s/.*/./; q' 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ` 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test -d "$dstdir" 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dstdir_status=$? 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville obsolete_mkdir_used=false 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test $dstdir_status != 0; then 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $posix_mkdir in 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '') 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Create intermediate dirs using mode 755 as modified by the umask. 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # This is like FreeBSD 'install' as of 1997-10-28. 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville umask=`umask` 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $stripcmd.$umask in 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Optimize common cases. 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *[2367][2367]) mkdir_umask=$umask;; 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *[0-7]) 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mkdir_umask=`expr $umask + 22 \ 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville - $umask % 100 % 40 + $umask % 20 \ 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville - $umask % 10 % 4 + $umask % 2 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville `;; 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *) mkdir_umask=$umask,go-w;; 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # With -d, create the new directory with the user-specified mode. 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Otherwise, rely on $mkdir_umask. 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -n "$dir_arg"; then 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mkdir_mode=-m$mode 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mkdir_mode= 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville posix_mkdir=false 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $umask in 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *[123567][0-7][0-7]) 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # POSIX mkdir -p sets u+wx bits regardless of umask, which 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ;; 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *) 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (umask $mkdir_umask && 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville then 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -z "$dir_arg" || { 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check for POSIX incompatibilities with -m. 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # other-writeable bit of parent directory when it shouldn't. 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ls_ld_tmpdir=`ls -ld "$tmpdir"` 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $ls_ld_tmpdir in 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville d????-?r-*) different_mode=700;; 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville d????-?--*) different_mode=755;; 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *) false;; 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac && 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $mkdirprog -m$different_mode -p -- "$tmpdir" && { 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville then posix_mkdir=: 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville rmdir "$tmpdir/d" "$tmpdir" 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Remove any dirs left behind by ancient mkdir implementations. 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville trap '' 0;; 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac;; 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $posix_mkdir && ( 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville umask $mkdir_umask && 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ) 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville then : 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # The umask is ridiculous, or mkdir does not conform to POSIX, 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # or it failed possibly due to a race condition. Create the 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # directory the slow way, step by step, checking for races as we go. 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $dstdir in 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /*) prefix='/';; 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -*) prefix='./';; 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *) prefix='';; 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville eval "$initialize_posix_glob" 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville oIFS=$IFS 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville IFS=/ 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $posix_glob set -f 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set fnord $dstdir 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shift 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $posix_glob set +f 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville IFS=$oIFS 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville prefixes= 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for d 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville do 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test -z "$d" && continue 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville prefix=$prefix$d 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -d "$prefix"; then 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville prefixes= 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if $posix_mkdir; then 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (umask=$mkdir_umask && 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Don't fail if two instances are running concurrently. 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test -d "$prefix" || exit 1 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case $prefix in 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *) qprefix=$prefix;; 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville esac 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville prefixes="$prefixes '$qprefix'" 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville prefix=$prefix/ 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville done 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -n "$prefixes"; then 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Don't fail if two instances are running concurrently. 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (umask $mkdir_umask && 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville eval "\$doit_exec \$mkdirprog $prefixes") || 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test -d "$dstdir" || exit 1 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville obsolete_mkdir_used=true 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if test -n "$dir_arg"; then 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Make a couple of temp file names in the proper directory. 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dsttmp=$dstdir/_inst.$$_ 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville rmtmp=$dstdir/_rm.$$_ 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Trap to clean up those temp files at exit. 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Copy the file name to the temp name. 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # and set any options; do chmod last to preserve setuid bits. 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # If any of these fail, we abort the whole thing. If we want to 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # ignore errors from any of these, just make sure not to ignore 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # errors from the above "$doit $cpprog $src $dsttmp" command. 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # If -C, don't bother to copy if it wouldn't change the file. 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if $copy_on_change && 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville eval "$initialize_posix_glob" && 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $posix_glob set -f && 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set X $old && old=:$2:$4:$5:$6 && 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set X $new && new=:$2:$4:$5:$6 && 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $posix_glob set +f && 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test "$old" = "$new" && 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville then 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville rm -f "$dsttmp" 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Rename the file to the real destination. 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # The rename failed, perhaps because mv can't rename something else 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # to itself, or perhaps because mv is so ancient that it does not 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # support -f. 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Now remove or move aside any old file at destination location. 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # We try this two ways since rm can't unlink itself on some 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # systems and the destination file might be busy for other 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # reasons. In this case, the final cleanup might fail but the new 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # file should still install successfully. 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test ! -f "$dst" || 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $doit $rmcmd -f "$dst" 2>/dev/null || 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } || 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { echo "$0: cannot unlink or rename $dst" >&2 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (exit 1); exit 1 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } && 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Now rename the file to the real destination. 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville $doit $mvcmd "$dsttmp" "$dst" 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi || exit 1 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville trap '' 0 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fi 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledone 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Local variables: 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# eval: (add-hook 'write-file-hooks 'time-stamp) 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# time-stamp-start: "scriptversion=" 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# time-stamp-format: "%:y-%02m-%02d.%02H" 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# time-stamp-end: "$" 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# End: 520