install-sh revision ecb85c42
153354cdbSmrg#!/bin/sh 253354cdbSmrg# install - install a program, script, or datafile 353354cdbSmrg 4ecb85c42Smrgscriptversion=2011-11-20.07; # UTC 553354cdbSmrg 653354cdbSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 753354cdbSmrg# later released in X11R6 (xc/config/util/install.sh) with the 853354cdbSmrg# following copyright and license. 953354cdbSmrg# 1053354cdbSmrg# Copyright (C) 1994 X Consortium 1153354cdbSmrg# 1253354cdbSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 1353354cdbSmrg# of this software and associated documentation files (the "Software"), to 1453354cdbSmrg# deal in the Software without restriction, including without limitation the 1553354cdbSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1653354cdbSmrg# sell copies of the Software, and to permit persons to whom the Software is 1753354cdbSmrg# furnished to do so, subject to the following conditions: 1853354cdbSmrg# 1953354cdbSmrg# The above copyright notice and this permission notice shall be included in 2053354cdbSmrg# all copies or substantial portions of the Software. 2153354cdbSmrg# 2253354cdbSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2353354cdbSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2453354cdbSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2553354cdbSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2653354cdbSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2753354cdbSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2853354cdbSmrg# 2953354cdbSmrg# Except as contained in this notice, the name of the X Consortium shall not 3053354cdbSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 3153354cdbSmrg# ings in this Software without prior written authorization from the X Consor- 3253354cdbSmrg# tium. 3353354cdbSmrg# 3453354cdbSmrg# 3553354cdbSmrg# FSF changes to this file are in the public domain. 3653354cdbSmrg# 3753354cdbSmrg# Calling this script install-sh is preferred over install.sh, to prevent 38ecb85c42Smrg# 'make' implicit rules from creating a file called install from it 3953354cdbSmrg# when there is no Makefile. 4053354cdbSmrg# 4153354cdbSmrg# This script is compatible with the BSD install script, but was written 4253354cdbSmrg# from scratch. 4353354cdbSmrg 4453354cdbSmrgnl=' 4553354cdbSmrg' 4653354cdbSmrgIFS=" "" $nl" 4753354cdbSmrg 4853354cdbSmrg# set DOITPROG to echo to test this script 4953354cdbSmrg 5053354cdbSmrg# Don't use :- since 4.3BSD and earlier shells don't like it. 5186bbecbeSmrgdoit=${DOITPROG-} 5253354cdbSmrgif test -z "$doit"; then 5353354cdbSmrg doit_exec=exec 5453354cdbSmrgelse 5553354cdbSmrg doit_exec=$doit 5653354cdbSmrgfi 5753354cdbSmrg 5853354cdbSmrg# Put in absolute file names if you don't have them in your path; 5953354cdbSmrg# or use environment vars. 6053354cdbSmrg 6186bbecbeSmrgchgrpprog=${CHGRPPROG-chgrp} 6286bbecbeSmrgchmodprog=${CHMODPROG-chmod} 6386bbecbeSmrgchownprog=${CHOWNPROG-chown} 6486bbecbeSmrgcmpprog=${CMPPROG-cmp} 6586bbecbeSmrgcpprog=${CPPROG-cp} 6686bbecbeSmrgmkdirprog=${MKDIRPROG-mkdir} 6786bbecbeSmrgmvprog=${MVPROG-mv} 6886bbecbeSmrgrmprog=${RMPROG-rm} 6986bbecbeSmrgstripprog=${STRIPPROG-strip} 7086bbecbeSmrg 7186bbecbeSmrgposix_glob='?' 7286bbecbeSmrginitialize_posix_glob=' 7386bbecbeSmrg test "$posix_glob" != "?" || { 7486bbecbeSmrg if (set -f) 2>/dev/null; then 7586bbecbeSmrg posix_glob= 7686bbecbeSmrg else 7786bbecbeSmrg posix_glob=: 7886bbecbeSmrg fi 7986bbecbeSmrg } 8086bbecbeSmrg' 8153354cdbSmrg 8253354cdbSmrgposix_mkdir= 8353354cdbSmrg 8453354cdbSmrg# Desired mode of installed file. 8553354cdbSmrgmode=0755 8653354cdbSmrg 8786bbecbeSmrgchgrpcmd= 8853354cdbSmrgchmodcmd=$chmodprog 8953354cdbSmrgchowncmd= 9086bbecbeSmrgmvcmd=$mvprog 9153354cdbSmrgrmcmd="$rmprog -f" 9286bbecbeSmrgstripcmd= 9386bbecbeSmrg 9453354cdbSmrgsrc= 9553354cdbSmrgdst= 9653354cdbSmrgdir_arg= 9786bbecbeSmrgdst_arg= 9886bbecbeSmrg 9986bbecbeSmrgcopy_on_change=false 10053354cdbSmrgno_target_directory= 10153354cdbSmrg 10286bbecbeSmrgusage="\ 10386bbecbeSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 10453354cdbSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 10553354cdbSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 10653354cdbSmrg or: $0 [OPTION]... -d DIRECTORIES... 10753354cdbSmrg 10853354cdbSmrgIn the 1st form, copy SRCFILE to DSTFILE. 10953354cdbSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 11053354cdbSmrgIn the 4th, create DIRECTORIES. 11153354cdbSmrg 11253354cdbSmrgOptions: 11386bbecbeSmrg --help display this help and exit. 11486bbecbeSmrg --version display version info and exit. 11586bbecbeSmrg 11686bbecbeSmrg -c (ignored) 11786bbecbeSmrg -C install only if different (preserve the last data modification time) 11886bbecbeSmrg -d create directories instead of installing files. 11986bbecbeSmrg -g GROUP $chgrpprog installed files to GROUP. 12086bbecbeSmrg -m MODE $chmodprog installed files to MODE. 12186bbecbeSmrg -o USER $chownprog installed files to USER. 12286bbecbeSmrg -s $stripprog installed files. 12386bbecbeSmrg -t DIRECTORY install into DIRECTORY. 12486bbecbeSmrg -T report an error if DSTFILE is a directory. 12553354cdbSmrg 12653354cdbSmrgEnvironment variables override the default commands: 12786bbecbeSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12886bbecbeSmrg RMPROG STRIPPROG 12953354cdbSmrg" 13053354cdbSmrg 13153354cdbSmrgwhile test $# -ne 0; do 13253354cdbSmrg case $1 in 13386bbecbeSmrg -c) ;; 13486bbecbeSmrg 13586bbecbeSmrg -C) copy_on_change=true;; 13653354cdbSmrg 13786bbecbeSmrg -d) dir_arg=true;; 13853354cdbSmrg 13953354cdbSmrg -g) chgrpcmd="$chgrpprog $2" 14086bbecbeSmrg shift;; 14153354cdbSmrg 14253354cdbSmrg --help) echo "$usage"; exit $?;; 14353354cdbSmrg 14453354cdbSmrg -m) mode=$2 14553354cdbSmrg case $mode in 14653354cdbSmrg *' '* | *' '* | *' 14753354cdbSmrg'* | *'*'* | *'?'* | *'['*) 14853354cdbSmrg echo "$0: invalid mode: $mode" >&2 14953354cdbSmrg exit 1;; 15053354cdbSmrg esac 15186bbecbeSmrg shift;; 15253354cdbSmrg 15353354cdbSmrg -o) chowncmd="$chownprog $2" 15486bbecbeSmrg shift;; 15553354cdbSmrg 15686bbecbeSmrg -s) stripcmd=$stripprog;; 15753354cdbSmrg 15886bbecbeSmrg -t) dst_arg=$2 159ecb85c42Smrg # Protect names problematic for 'test' and other utilities. 16061c899d4Smrg case $dst_arg in 16161c899d4Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 16261c899d4Smrg esac 16386bbecbeSmrg shift;; 16453354cdbSmrg 16586bbecbeSmrg -T) no_target_directory=true;; 16653354cdbSmrg 16753354cdbSmrg --version) echo "$0 $scriptversion"; exit $?;; 16853354cdbSmrg 16953354cdbSmrg --) shift 17053354cdbSmrg break;; 17153354cdbSmrg 17253354cdbSmrg -*) echo "$0: invalid option: $1" >&2 17353354cdbSmrg exit 1;; 17453354cdbSmrg 17553354cdbSmrg *) break;; 17653354cdbSmrg esac 17786bbecbeSmrg shift 17853354cdbSmrgdone 17953354cdbSmrg 18086bbecbeSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 18153354cdbSmrg # When -d is used, all remaining arguments are directories to create. 18253354cdbSmrg # When -t is used, the destination is already specified. 18353354cdbSmrg # Otherwise, the last argument is the destination. Remove it from $@. 18453354cdbSmrg for arg 18553354cdbSmrg do 18686bbecbeSmrg if test -n "$dst_arg"; then 18753354cdbSmrg # $@ is not empty: it contains at least $arg. 18886bbecbeSmrg set fnord "$@" "$dst_arg" 18953354cdbSmrg shift # fnord 19053354cdbSmrg fi 19153354cdbSmrg shift # arg 19286bbecbeSmrg dst_arg=$arg 193ecb85c42Smrg # Protect names problematic for 'test' and other utilities. 19461c899d4Smrg case $dst_arg in 19561c899d4Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 19661c899d4Smrg esac 19753354cdbSmrg done 19853354cdbSmrgfi 19953354cdbSmrg 20053354cdbSmrgif test $# -eq 0; then 20153354cdbSmrg if test -z "$dir_arg"; then 20253354cdbSmrg echo "$0: no input file specified." >&2 20353354cdbSmrg exit 1 20453354cdbSmrg fi 205ecb85c42Smrg # It's OK to call 'install-sh -d' without argument. 20653354cdbSmrg # This can happen when creating conditional directories. 20753354cdbSmrg exit 0 20853354cdbSmrgfi 20953354cdbSmrg 21053354cdbSmrgif test -z "$dir_arg"; then 21161c899d4Smrg do_exit='(exit $ret); exit $ret' 21261c899d4Smrg trap "ret=129; $do_exit" 1 21361c899d4Smrg trap "ret=130; $do_exit" 2 21461c899d4Smrg trap "ret=141; $do_exit" 13 21561c899d4Smrg trap "ret=143; $do_exit" 15 21653354cdbSmrg 21753354cdbSmrg # Set umask so as not to create temps with too-generous modes. 21853354cdbSmrg # However, 'strip' requires both read and write access to temps. 21953354cdbSmrg case $mode in 22053354cdbSmrg # Optimize common cases. 22153354cdbSmrg *644) cp_umask=133;; 22253354cdbSmrg *755) cp_umask=22;; 22353354cdbSmrg 22453354cdbSmrg *[0-7]) 22553354cdbSmrg if test -z "$stripcmd"; then 22653354cdbSmrg u_plus_rw= 22753354cdbSmrg else 22853354cdbSmrg u_plus_rw='% 200' 22953354cdbSmrg fi 23053354cdbSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 23153354cdbSmrg *) 23253354cdbSmrg if test -z "$stripcmd"; then 23353354cdbSmrg u_plus_rw= 23453354cdbSmrg else 23553354cdbSmrg u_plus_rw=,u+rw 23653354cdbSmrg fi 23753354cdbSmrg cp_umask=$mode$u_plus_rw;; 23853354cdbSmrg esac 23953354cdbSmrgfi 24053354cdbSmrg 24153354cdbSmrgfor src 24253354cdbSmrgdo 243ecb85c42Smrg # Protect names problematic for 'test' and other utilities. 24453354cdbSmrg case $src in 24561c899d4Smrg -* | [=\(\)!]) src=./$src;; 24653354cdbSmrg esac 24753354cdbSmrg 24853354cdbSmrg if test -n "$dir_arg"; then 24953354cdbSmrg dst=$src 25053354cdbSmrg dstdir=$dst 25153354cdbSmrg test -d "$dstdir" 25253354cdbSmrg dstdir_status=$? 25353354cdbSmrg else 25453354cdbSmrg 25553354cdbSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 25653354cdbSmrg # might cause directories to be created, which would be especially bad 25753354cdbSmrg # if $src (and thus $dsttmp) contains '*'. 25853354cdbSmrg if test ! -f "$src" && test ! -d "$src"; then 25953354cdbSmrg echo "$0: $src does not exist." >&2 26053354cdbSmrg exit 1 26153354cdbSmrg fi 26253354cdbSmrg 26386bbecbeSmrg if test -z "$dst_arg"; then 26453354cdbSmrg echo "$0: no destination specified." >&2 26553354cdbSmrg exit 1 26653354cdbSmrg fi 26786bbecbeSmrg dst=$dst_arg 26853354cdbSmrg 26953354cdbSmrg # If destination is a directory, append the input filename; won't work 27053354cdbSmrg # if double slashes aren't ignored. 27153354cdbSmrg if test -d "$dst"; then 27253354cdbSmrg if test -n "$no_target_directory"; then 27386bbecbeSmrg echo "$0: $dst_arg: Is a directory" >&2 27453354cdbSmrg exit 1 27553354cdbSmrg fi 27653354cdbSmrg dstdir=$dst 27753354cdbSmrg dst=$dstdir/`basename "$src"` 27853354cdbSmrg dstdir_status=0 27953354cdbSmrg else 28053354cdbSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 28153354cdbSmrg dstdir=` 28253354cdbSmrg (dirname "$dst") 2>/dev/null || 28353354cdbSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 28453354cdbSmrg X"$dst" : 'X\(//\)[^/]' \| \ 28553354cdbSmrg X"$dst" : 'X\(//\)$' \| \ 28653354cdbSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28753354cdbSmrg echo X"$dst" | 28853354cdbSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28953354cdbSmrg s//\1/ 29053354cdbSmrg q 29153354cdbSmrg } 29253354cdbSmrg /^X\(\/\/\)[^/].*/{ 29353354cdbSmrg s//\1/ 29453354cdbSmrg q 29553354cdbSmrg } 29653354cdbSmrg /^X\(\/\/\)$/{ 29753354cdbSmrg s//\1/ 29853354cdbSmrg q 29953354cdbSmrg } 30053354cdbSmrg /^X\(\/\).*/{ 30153354cdbSmrg s//\1/ 30253354cdbSmrg q 30353354cdbSmrg } 30453354cdbSmrg s/.*/./; q' 30553354cdbSmrg ` 30653354cdbSmrg 30753354cdbSmrg test -d "$dstdir" 30853354cdbSmrg dstdir_status=$? 30953354cdbSmrg fi 31053354cdbSmrg fi 31153354cdbSmrg 31253354cdbSmrg obsolete_mkdir_used=false 31353354cdbSmrg 31453354cdbSmrg if test $dstdir_status != 0; then 31553354cdbSmrg case $posix_mkdir in 31653354cdbSmrg '') 31753354cdbSmrg # Create intermediate dirs using mode 755 as modified by the umask. 31853354cdbSmrg # This is like FreeBSD 'install' as of 1997-10-28. 31953354cdbSmrg umask=`umask` 32053354cdbSmrg case $stripcmd.$umask in 32153354cdbSmrg # Optimize common cases. 32253354cdbSmrg *[2367][2367]) mkdir_umask=$umask;; 32353354cdbSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 32453354cdbSmrg 32553354cdbSmrg *[0-7]) 32653354cdbSmrg mkdir_umask=`expr $umask + 22 \ 32753354cdbSmrg - $umask % 100 % 40 + $umask % 20 \ 32853354cdbSmrg - $umask % 10 % 4 + $umask % 2 32953354cdbSmrg `;; 33053354cdbSmrg *) mkdir_umask=$umask,go-w;; 33153354cdbSmrg esac 33253354cdbSmrg 33353354cdbSmrg # With -d, create the new directory with the user-specified mode. 33453354cdbSmrg # Otherwise, rely on $mkdir_umask. 33553354cdbSmrg if test -n "$dir_arg"; then 33653354cdbSmrg mkdir_mode=-m$mode 33753354cdbSmrg else 33853354cdbSmrg mkdir_mode= 33953354cdbSmrg fi 34053354cdbSmrg 34153354cdbSmrg posix_mkdir=false 34253354cdbSmrg case $umask in 34353354cdbSmrg *[123567][0-7][0-7]) 34453354cdbSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 34553354cdbSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 34653354cdbSmrg ;; 34753354cdbSmrg *) 34853354cdbSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34953354cdbSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 35053354cdbSmrg 35153354cdbSmrg if (umask $mkdir_umask && 35253354cdbSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 35353354cdbSmrg then 35453354cdbSmrg if test -z "$dir_arg" || { 35553354cdbSmrg # Check for POSIX incompatibilities with -m. 35653354cdbSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 357ecb85c42Smrg # other-writable bit of parent directory when it shouldn't. 35853354cdbSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35953354cdbSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 36053354cdbSmrg case $ls_ld_tmpdir in 36153354cdbSmrg d????-?r-*) different_mode=700;; 36253354cdbSmrg d????-?--*) different_mode=755;; 36353354cdbSmrg *) false;; 36453354cdbSmrg esac && 36553354cdbSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 36653354cdbSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36753354cdbSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36853354cdbSmrg } 36953354cdbSmrg } 37053354cdbSmrg then posix_mkdir=: 37153354cdbSmrg fi 37253354cdbSmrg rmdir "$tmpdir/d" "$tmpdir" 37353354cdbSmrg else 37453354cdbSmrg # Remove any dirs left behind by ancient mkdir implementations. 37553354cdbSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 37653354cdbSmrg fi 37753354cdbSmrg trap '' 0;; 37853354cdbSmrg esac;; 37953354cdbSmrg esac 38053354cdbSmrg 38153354cdbSmrg if 38253354cdbSmrg $posix_mkdir && ( 38353354cdbSmrg umask $mkdir_umask && 38453354cdbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38553354cdbSmrg ) 38653354cdbSmrg then : 38753354cdbSmrg else 38853354cdbSmrg 38953354cdbSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 39053354cdbSmrg # or it failed possibly due to a race condition. Create the 39153354cdbSmrg # directory the slow way, step by step, checking for races as we go. 39253354cdbSmrg 39353354cdbSmrg case $dstdir in 39486bbecbeSmrg /*) prefix='/';; 39561c899d4Smrg [-=\(\)!]*) prefix='./';; 39686bbecbeSmrg *) prefix='';; 39753354cdbSmrg esac 39853354cdbSmrg 39986bbecbeSmrg eval "$initialize_posix_glob" 40053354cdbSmrg 40153354cdbSmrg oIFS=$IFS 40253354cdbSmrg IFS=/ 40386bbecbeSmrg $posix_glob set -f 40453354cdbSmrg set fnord $dstdir 40553354cdbSmrg shift 40686bbecbeSmrg $posix_glob set +f 40753354cdbSmrg IFS=$oIFS 40853354cdbSmrg 40953354cdbSmrg prefixes= 41053354cdbSmrg 41153354cdbSmrg for d 41253354cdbSmrg do 41361c899d4Smrg test X"$d" = X && continue 41453354cdbSmrg 41553354cdbSmrg prefix=$prefix$d 41653354cdbSmrg if test -d "$prefix"; then 41753354cdbSmrg prefixes= 41853354cdbSmrg else 41953354cdbSmrg if $posix_mkdir; then 42053354cdbSmrg (umask=$mkdir_umask && 42153354cdbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 42253354cdbSmrg # Don't fail if two instances are running concurrently. 42353354cdbSmrg test -d "$prefix" || exit 1 42453354cdbSmrg else 42553354cdbSmrg case $prefix in 42653354cdbSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42753354cdbSmrg *) qprefix=$prefix;; 42853354cdbSmrg esac 42953354cdbSmrg prefixes="$prefixes '$qprefix'" 43053354cdbSmrg fi 43153354cdbSmrg fi 43253354cdbSmrg prefix=$prefix/ 43353354cdbSmrg done 43453354cdbSmrg 43553354cdbSmrg if test -n "$prefixes"; then 43653354cdbSmrg # Don't fail if two instances are running concurrently. 43753354cdbSmrg (umask $mkdir_umask && 43853354cdbSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 43953354cdbSmrg test -d "$dstdir" || exit 1 44053354cdbSmrg obsolete_mkdir_used=true 44153354cdbSmrg fi 44253354cdbSmrg fi 44353354cdbSmrg fi 44453354cdbSmrg 44553354cdbSmrg if test -n "$dir_arg"; then 44653354cdbSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44753354cdbSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44853354cdbSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44953354cdbSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 45053354cdbSmrg else 45153354cdbSmrg 45253354cdbSmrg # Make a couple of temp file names in the proper directory. 45353354cdbSmrg dsttmp=$dstdir/_inst.$$_ 45453354cdbSmrg rmtmp=$dstdir/_rm.$$_ 45553354cdbSmrg 45653354cdbSmrg # Trap to clean up those temp files at exit. 45753354cdbSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45853354cdbSmrg 45953354cdbSmrg # Copy the file name to the temp name. 46053354cdbSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 46153354cdbSmrg 46253354cdbSmrg # and set any options; do chmod last to preserve setuid bits. 46353354cdbSmrg # 46453354cdbSmrg # If any of these fail, we abort the whole thing. If we want to 46553354cdbSmrg # ignore errors from any of these, just make sure not to ignore 46653354cdbSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 46753354cdbSmrg # 46886bbecbeSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46986bbecbeSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 47086bbecbeSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 47186bbecbeSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 47286bbecbeSmrg 47386bbecbeSmrg # If -C, don't bother to copy if it wouldn't change the file. 47486bbecbeSmrg if $copy_on_change && 47586bbecbeSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 47686bbecbeSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47786bbecbeSmrg 47886bbecbeSmrg eval "$initialize_posix_glob" && 47986bbecbeSmrg $posix_glob set -f && 48086bbecbeSmrg set X $old && old=:$2:$4:$5:$6 && 48186bbecbeSmrg set X $new && new=:$2:$4:$5:$6 && 48286bbecbeSmrg $posix_glob set +f && 48386bbecbeSmrg 48486bbecbeSmrg test "$old" = "$new" && 48586bbecbeSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 48686bbecbeSmrg then 48786bbecbeSmrg rm -f "$dsttmp" 48886bbecbeSmrg else 48986bbecbeSmrg # Rename the file to the real destination. 49086bbecbeSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 49186bbecbeSmrg 49286bbecbeSmrg # The rename failed, perhaps because mv can't rename something else 49386bbecbeSmrg # to itself, or perhaps because mv is so ancient that it does not 49486bbecbeSmrg # support -f. 49586bbecbeSmrg { 49686bbecbeSmrg # Now remove or move aside any old file at destination location. 49786bbecbeSmrg # We try this two ways since rm can't unlink itself on some 49886bbecbeSmrg # systems and the destination file might be busy for other 49986bbecbeSmrg # reasons. In this case, the final cleanup might fail but the new 50086bbecbeSmrg # file should still install successfully. 50186bbecbeSmrg { 50286bbecbeSmrg test ! -f "$dst" || 50386bbecbeSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 50486bbecbeSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 50586bbecbeSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 50686bbecbeSmrg } || 50786bbecbeSmrg { echo "$0: cannot unlink or rename $dst" >&2 50886bbecbeSmrg (exit 1); exit 1 50986bbecbeSmrg } 51086bbecbeSmrg } && 51186bbecbeSmrg 51286bbecbeSmrg # Now rename the file to the real destination. 51386bbecbeSmrg $doit $mvcmd "$dsttmp" "$dst" 51486bbecbeSmrg } 51586bbecbeSmrg fi || exit 1 51653354cdbSmrg 51753354cdbSmrg trap '' 0 51853354cdbSmrg fi 51953354cdbSmrgdone 52053354cdbSmrg 52153354cdbSmrg# Local variables: 52253354cdbSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 52353354cdbSmrg# time-stamp-start: "scriptversion=" 52453354cdbSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 52586bbecbeSmrg# time-stamp-time-zone: "UTC" 52686bbecbeSmrg# time-stamp-end: "; # UTC" 52753354cdbSmrg# End: 528