install-sh revision 86bbecbe
153354cdbSmrg#!/bin/sh 253354cdbSmrg# install - install a program, script, or datafile 353354cdbSmrg 486bbecbeSmrgscriptversion=2009-04-28.21; # 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 3853354cdbSmrg# `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 15986bbecbeSmrg shift;; 16053354cdbSmrg 16186bbecbeSmrg -T) no_target_directory=true;; 16253354cdbSmrg 16353354cdbSmrg --version) echo "$0 $scriptversion"; exit $?;; 16453354cdbSmrg 16553354cdbSmrg --) shift 16653354cdbSmrg break;; 16753354cdbSmrg 16853354cdbSmrg -*) echo "$0: invalid option: $1" >&2 16953354cdbSmrg exit 1;; 17053354cdbSmrg 17153354cdbSmrg *) break;; 17253354cdbSmrg esac 17386bbecbeSmrg shift 17453354cdbSmrgdone 17553354cdbSmrg 17686bbecbeSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 17753354cdbSmrg # When -d is used, all remaining arguments are directories to create. 17853354cdbSmrg # When -t is used, the destination is already specified. 17953354cdbSmrg # Otherwise, the last argument is the destination. Remove it from $@. 18053354cdbSmrg for arg 18153354cdbSmrg do 18286bbecbeSmrg if test -n "$dst_arg"; then 18353354cdbSmrg # $@ is not empty: it contains at least $arg. 18486bbecbeSmrg set fnord "$@" "$dst_arg" 18553354cdbSmrg shift # fnord 18653354cdbSmrg fi 18753354cdbSmrg shift # arg 18886bbecbeSmrg dst_arg=$arg 18953354cdbSmrg done 19053354cdbSmrgfi 19153354cdbSmrg 19253354cdbSmrgif test $# -eq 0; then 19353354cdbSmrg if test -z "$dir_arg"; then 19453354cdbSmrg echo "$0: no input file specified." >&2 19553354cdbSmrg exit 1 19653354cdbSmrg fi 19753354cdbSmrg # It's OK to call `install-sh -d' without argument. 19853354cdbSmrg # This can happen when creating conditional directories. 19953354cdbSmrg exit 0 20053354cdbSmrgfi 20153354cdbSmrg 20253354cdbSmrgif test -z "$dir_arg"; then 20353354cdbSmrg trap '(exit $?); exit' 1 2 13 15 20453354cdbSmrg 20553354cdbSmrg # Set umask so as not to create temps with too-generous modes. 20653354cdbSmrg # However, 'strip' requires both read and write access to temps. 20753354cdbSmrg case $mode in 20853354cdbSmrg # Optimize common cases. 20953354cdbSmrg *644) cp_umask=133;; 21053354cdbSmrg *755) cp_umask=22;; 21153354cdbSmrg 21253354cdbSmrg *[0-7]) 21353354cdbSmrg if test -z "$stripcmd"; then 21453354cdbSmrg u_plus_rw= 21553354cdbSmrg else 21653354cdbSmrg u_plus_rw='% 200' 21753354cdbSmrg fi 21853354cdbSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 21953354cdbSmrg *) 22053354cdbSmrg if test -z "$stripcmd"; then 22153354cdbSmrg u_plus_rw= 22253354cdbSmrg else 22353354cdbSmrg u_plus_rw=,u+rw 22453354cdbSmrg fi 22553354cdbSmrg cp_umask=$mode$u_plus_rw;; 22653354cdbSmrg esac 22753354cdbSmrgfi 22853354cdbSmrg 22953354cdbSmrgfor src 23053354cdbSmrgdo 23153354cdbSmrg # Protect names starting with `-'. 23253354cdbSmrg case $src in 23386bbecbeSmrg -*) src=./$src;; 23453354cdbSmrg esac 23553354cdbSmrg 23653354cdbSmrg if test -n "$dir_arg"; then 23753354cdbSmrg dst=$src 23853354cdbSmrg dstdir=$dst 23953354cdbSmrg test -d "$dstdir" 24053354cdbSmrg dstdir_status=$? 24153354cdbSmrg else 24253354cdbSmrg 24353354cdbSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 24453354cdbSmrg # might cause directories to be created, which would be especially bad 24553354cdbSmrg # if $src (and thus $dsttmp) contains '*'. 24653354cdbSmrg if test ! -f "$src" && test ! -d "$src"; then 24753354cdbSmrg echo "$0: $src does not exist." >&2 24853354cdbSmrg exit 1 24953354cdbSmrg fi 25053354cdbSmrg 25186bbecbeSmrg if test -z "$dst_arg"; then 25253354cdbSmrg echo "$0: no destination specified." >&2 25353354cdbSmrg exit 1 25453354cdbSmrg fi 25553354cdbSmrg 25686bbecbeSmrg dst=$dst_arg 25753354cdbSmrg # Protect names starting with `-'. 25853354cdbSmrg case $dst in 25986bbecbeSmrg -*) dst=./$dst;; 26053354cdbSmrg esac 26153354cdbSmrg 26253354cdbSmrg # If destination is a directory, append the input filename; won't work 26353354cdbSmrg # if double slashes aren't ignored. 26453354cdbSmrg if test -d "$dst"; then 26553354cdbSmrg if test -n "$no_target_directory"; then 26686bbecbeSmrg echo "$0: $dst_arg: Is a directory" >&2 26753354cdbSmrg exit 1 26853354cdbSmrg fi 26953354cdbSmrg dstdir=$dst 27053354cdbSmrg dst=$dstdir/`basename "$src"` 27153354cdbSmrg dstdir_status=0 27253354cdbSmrg else 27353354cdbSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 27453354cdbSmrg dstdir=` 27553354cdbSmrg (dirname "$dst") 2>/dev/null || 27653354cdbSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 27753354cdbSmrg X"$dst" : 'X\(//\)[^/]' \| \ 27853354cdbSmrg X"$dst" : 'X\(//\)$' \| \ 27953354cdbSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28053354cdbSmrg echo X"$dst" | 28153354cdbSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28253354cdbSmrg s//\1/ 28353354cdbSmrg q 28453354cdbSmrg } 28553354cdbSmrg /^X\(\/\/\)[^/].*/{ 28653354cdbSmrg s//\1/ 28753354cdbSmrg q 28853354cdbSmrg } 28953354cdbSmrg /^X\(\/\/\)$/{ 29053354cdbSmrg s//\1/ 29153354cdbSmrg q 29253354cdbSmrg } 29353354cdbSmrg /^X\(\/\).*/{ 29453354cdbSmrg s//\1/ 29553354cdbSmrg q 29653354cdbSmrg } 29753354cdbSmrg s/.*/./; q' 29853354cdbSmrg ` 29953354cdbSmrg 30053354cdbSmrg test -d "$dstdir" 30153354cdbSmrg dstdir_status=$? 30253354cdbSmrg fi 30353354cdbSmrg fi 30453354cdbSmrg 30553354cdbSmrg obsolete_mkdir_used=false 30653354cdbSmrg 30753354cdbSmrg if test $dstdir_status != 0; then 30853354cdbSmrg case $posix_mkdir in 30953354cdbSmrg '') 31053354cdbSmrg # Create intermediate dirs using mode 755 as modified by the umask. 31153354cdbSmrg # This is like FreeBSD 'install' as of 1997-10-28. 31253354cdbSmrg umask=`umask` 31353354cdbSmrg case $stripcmd.$umask in 31453354cdbSmrg # Optimize common cases. 31553354cdbSmrg *[2367][2367]) mkdir_umask=$umask;; 31653354cdbSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 31753354cdbSmrg 31853354cdbSmrg *[0-7]) 31953354cdbSmrg mkdir_umask=`expr $umask + 22 \ 32053354cdbSmrg - $umask % 100 % 40 + $umask % 20 \ 32153354cdbSmrg - $umask % 10 % 4 + $umask % 2 32253354cdbSmrg `;; 32353354cdbSmrg *) mkdir_umask=$umask,go-w;; 32453354cdbSmrg esac 32553354cdbSmrg 32653354cdbSmrg # With -d, create the new directory with the user-specified mode. 32753354cdbSmrg # Otherwise, rely on $mkdir_umask. 32853354cdbSmrg if test -n "$dir_arg"; then 32953354cdbSmrg mkdir_mode=-m$mode 33053354cdbSmrg else 33153354cdbSmrg mkdir_mode= 33253354cdbSmrg fi 33353354cdbSmrg 33453354cdbSmrg posix_mkdir=false 33553354cdbSmrg case $umask in 33653354cdbSmrg *[123567][0-7][0-7]) 33753354cdbSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 33853354cdbSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 33953354cdbSmrg ;; 34053354cdbSmrg *) 34153354cdbSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34253354cdbSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 34353354cdbSmrg 34453354cdbSmrg if (umask $mkdir_umask && 34553354cdbSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 34653354cdbSmrg then 34753354cdbSmrg if test -z "$dir_arg" || { 34853354cdbSmrg # Check for POSIX incompatibilities with -m. 34953354cdbSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35053354cdbSmrg # other-writeable bit of parent directory when it shouldn't. 35153354cdbSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35253354cdbSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 35353354cdbSmrg case $ls_ld_tmpdir in 35453354cdbSmrg d????-?r-*) different_mode=700;; 35553354cdbSmrg d????-?--*) different_mode=755;; 35653354cdbSmrg *) false;; 35753354cdbSmrg esac && 35853354cdbSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 35953354cdbSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36053354cdbSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36153354cdbSmrg } 36253354cdbSmrg } 36353354cdbSmrg then posix_mkdir=: 36453354cdbSmrg fi 36553354cdbSmrg rmdir "$tmpdir/d" "$tmpdir" 36653354cdbSmrg else 36753354cdbSmrg # Remove any dirs left behind by ancient mkdir implementations. 36853354cdbSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 36953354cdbSmrg fi 37053354cdbSmrg trap '' 0;; 37153354cdbSmrg esac;; 37253354cdbSmrg esac 37353354cdbSmrg 37453354cdbSmrg if 37553354cdbSmrg $posix_mkdir && ( 37653354cdbSmrg umask $mkdir_umask && 37753354cdbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 37853354cdbSmrg ) 37953354cdbSmrg then : 38053354cdbSmrg else 38153354cdbSmrg 38253354cdbSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 38353354cdbSmrg # or it failed possibly due to a race condition. Create the 38453354cdbSmrg # directory the slow way, step by step, checking for races as we go. 38553354cdbSmrg 38653354cdbSmrg case $dstdir in 38786bbecbeSmrg /*) prefix='/';; 38886bbecbeSmrg -*) prefix='./';; 38986bbecbeSmrg *) prefix='';; 39053354cdbSmrg esac 39153354cdbSmrg 39286bbecbeSmrg eval "$initialize_posix_glob" 39353354cdbSmrg 39453354cdbSmrg oIFS=$IFS 39553354cdbSmrg IFS=/ 39686bbecbeSmrg $posix_glob set -f 39753354cdbSmrg set fnord $dstdir 39853354cdbSmrg shift 39986bbecbeSmrg $posix_glob set +f 40053354cdbSmrg IFS=$oIFS 40153354cdbSmrg 40253354cdbSmrg prefixes= 40353354cdbSmrg 40453354cdbSmrg for d 40553354cdbSmrg do 40653354cdbSmrg test -z "$d" && continue 40753354cdbSmrg 40853354cdbSmrg prefix=$prefix$d 40953354cdbSmrg if test -d "$prefix"; then 41053354cdbSmrg prefixes= 41153354cdbSmrg else 41253354cdbSmrg if $posix_mkdir; then 41353354cdbSmrg (umask=$mkdir_umask && 41453354cdbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 41553354cdbSmrg # Don't fail if two instances are running concurrently. 41653354cdbSmrg test -d "$prefix" || exit 1 41753354cdbSmrg else 41853354cdbSmrg case $prefix in 41953354cdbSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42053354cdbSmrg *) qprefix=$prefix;; 42153354cdbSmrg esac 42253354cdbSmrg prefixes="$prefixes '$qprefix'" 42353354cdbSmrg fi 42453354cdbSmrg fi 42553354cdbSmrg prefix=$prefix/ 42653354cdbSmrg done 42753354cdbSmrg 42853354cdbSmrg if test -n "$prefixes"; then 42953354cdbSmrg # Don't fail if two instances are running concurrently. 43053354cdbSmrg (umask $mkdir_umask && 43153354cdbSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 43253354cdbSmrg test -d "$dstdir" || exit 1 43353354cdbSmrg obsolete_mkdir_used=true 43453354cdbSmrg fi 43553354cdbSmrg fi 43653354cdbSmrg fi 43753354cdbSmrg 43853354cdbSmrg if test -n "$dir_arg"; then 43953354cdbSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44053354cdbSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44153354cdbSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44253354cdbSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44353354cdbSmrg else 44453354cdbSmrg 44553354cdbSmrg # Make a couple of temp file names in the proper directory. 44653354cdbSmrg dsttmp=$dstdir/_inst.$$_ 44753354cdbSmrg rmtmp=$dstdir/_rm.$$_ 44853354cdbSmrg 44953354cdbSmrg # Trap to clean up those temp files at exit. 45053354cdbSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45153354cdbSmrg 45253354cdbSmrg # Copy the file name to the temp name. 45353354cdbSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 45453354cdbSmrg 45553354cdbSmrg # and set any options; do chmod last to preserve setuid bits. 45653354cdbSmrg # 45753354cdbSmrg # If any of these fail, we abort the whole thing. If we want to 45853354cdbSmrg # ignore errors from any of these, just make sure not to ignore 45953354cdbSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 46053354cdbSmrg # 46186bbecbeSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46286bbecbeSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 46386bbecbeSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 46486bbecbeSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 46586bbecbeSmrg 46686bbecbeSmrg # If -C, don't bother to copy if it wouldn't change the file. 46786bbecbeSmrg if $copy_on_change && 46886bbecbeSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 46986bbecbeSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47086bbecbeSmrg 47186bbecbeSmrg eval "$initialize_posix_glob" && 47286bbecbeSmrg $posix_glob set -f && 47386bbecbeSmrg set X $old && old=:$2:$4:$5:$6 && 47486bbecbeSmrg set X $new && new=:$2:$4:$5:$6 && 47586bbecbeSmrg $posix_glob set +f && 47686bbecbeSmrg 47786bbecbeSmrg test "$old" = "$new" && 47886bbecbeSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 47986bbecbeSmrg then 48086bbecbeSmrg rm -f "$dsttmp" 48186bbecbeSmrg else 48286bbecbeSmrg # Rename the file to the real destination. 48386bbecbeSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 48486bbecbeSmrg 48586bbecbeSmrg # The rename failed, perhaps because mv can't rename something else 48686bbecbeSmrg # to itself, or perhaps because mv is so ancient that it does not 48786bbecbeSmrg # support -f. 48886bbecbeSmrg { 48986bbecbeSmrg # Now remove or move aside any old file at destination location. 49086bbecbeSmrg # We try this two ways since rm can't unlink itself on some 49186bbecbeSmrg # systems and the destination file might be busy for other 49286bbecbeSmrg # reasons. In this case, the final cleanup might fail but the new 49386bbecbeSmrg # file should still install successfully. 49486bbecbeSmrg { 49586bbecbeSmrg test ! -f "$dst" || 49686bbecbeSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 49786bbecbeSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 49886bbecbeSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 49986bbecbeSmrg } || 50086bbecbeSmrg { echo "$0: cannot unlink or rename $dst" >&2 50186bbecbeSmrg (exit 1); exit 1 50286bbecbeSmrg } 50386bbecbeSmrg } && 50486bbecbeSmrg 50586bbecbeSmrg # Now rename the file to the real destination. 50686bbecbeSmrg $doit $mvcmd "$dsttmp" "$dst" 50786bbecbeSmrg } 50886bbecbeSmrg fi || exit 1 50953354cdbSmrg 51053354cdbSmrg trap '' 0 51153354cdbSmrg fi 51253354cdbSmrgdone 51353354cdbSmrg 51453354cdbSmrg# Local variables: 51553354cdbSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 51653354cdbSmrg# time-stamp-start: "scriptversion=" 51753354cdbSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 51886bbecbeSmrg# time-stamp-time-zone: "UTC" 51986bbecbeSmrg# time-stamp-end: "; # UTC" 52053354cdbSmrg# End: 521