install-sh revision 04007eba
104007ebaSmrg#!/bin/sh 204007ebaSmrg# install - install a program, script, or datafile 304007ebaSmrg 404007ebaSmrgscriptversion=2011-11-20.07; # UTC 504007ebaSmrg 604007ebaSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 704007ebaSmrg# later released in X11R6 (xc/config/util/install.sh) with the 804007ebaSmrg# following copyright and license. 904007ebaSmrg# 1004007ebaSmrg# Copyright (C) 1994 X Consortium 1104007ebaSmrg# 1204007ebaSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 1304007ebaSmrg# of this software and associated documentation files (the "Software"), to 1404007ebaSmrg# deal in the Software without restriction, including without limitation the 1504007ebaSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1604007ebaSmrg# sell copies of the Software, and to permit persons to whom the Software is 1704007ebaSmrg# furnished to do so, subject to the following conditions: 1804007ebaSmrg# 1904007ebaSmrg# The above copyright notice and this permission notice shall be included in 2004007ebaSmrg# all copies or substantial portions of the Software. 2104007ebaSmrg# 2204007ebaSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2304007ebaSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2404007ebaSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2504007ebaSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2604007ebaSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2704007ebaSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2804007ebaSmrg# 2904007ebaSmrg# Except as contained in this notice, the name of the X Consortium shall not 3004007ebaSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 3104007ebaSmrg# ings in this Software without prior written authorization from the X Consor- 3204007ebaSmrg# tium. 3304007ebaSmrg# 3404007ebaSmrg# 3504007ebaSmrg# FSF changes to this file are in the public domain. 3604007ebaSmrg# 3704007ebaSmrg# Calling this script install-sh is preferred over install.sh, to prevent 3804007ebaSmrg# 'make' implicit rules from creating a file called install from it 3904007ebaSmrg# when there is no Makefile. 4004007ebaSmrg# 4104007ebaSmrg# This script is compatible with the BSD install script, but was written 4204007ebaSmrg# from scratch. 4304007ebaSmrg 4404007ebaSmrgnl=' 4504007ebaSmrg' 4604007ebaSmrgIFS=" "" $nl" 4704007ebaSmrg 4804007ebaSmrg# set DOITPROG to echo to test this script 4904007ebaSmrg 5004007ebaSmrg# Don't use :- since 4.3BSD and earlier shells don't like it. 5104007ebaSmrgdoit=${DOITPROG-} 5204007ebaSmrgif test -z "$doit"; then 5304007ebaSmrg doit_exec=exec 5404007ebaSmrgelse 5504007ebaSmrg doit_exec=$doit 5604007ebaSmrgfi 5704007ebaSmrg 5804007ebaSmrg# Put in absolute file names if you don't have them in your path; 5904007ebaSmrg# or use environment vars. 6004007ebaSmrg 6104007ebaSmrgchgrpprog=${CHGRPPROG-chgrp} 6204007ebaSmrgchmodprog=${CHMODPROG-chmod} 6304007ebaSmrgchownprog=${CHOWNPROG-chown} 6404007ebaSmrgcmpprog=${CMPPROG-cmp} 6504007ebaSmrgcpprog=${CPPROG-cp} 6604007ebaSmrgmkdirprog=${MKDIRPROG-mkdir} 6704007ebaSmrgmvprog=${MVPROG-mv} 6804007ebaSmrgrmprog=${RMPROG-rm} 6904007ebaSmrgstripprog=${STRIPPROG-strip} 7004007ebaSmrg 7104007ebaSmrgposix_glob='?' 7204007ebaSmrginitialize_posix_glob=' 7304007ebaSmrg test "$posix_glob" != "?" || { 7404007ebaSmrg if (set -f) 2>/dev/null; then 7504007ebaSmrg posix_glob= 7604007ebaSmrg else 7704007ebaSmrg posix_glob=: 7804007ebaSmrg fi 7904007ebaSmrg } 8004007ebaSmrg' 8104007ebaSmrg 8204007ebaSmrgposix_mkdir= 8304007ebaSmrg 8404007ebaSmrg# Desired mode of installed file. 8504007ebaSmrgmode=0755 8604007ebaSmrg 8704007ebaSmrgchgrpcmd= 8804007ebaSmrgchmodcmd=$chmodprog 8904007ebaSmrgchowncmd= 9004007ebaSmrgmvcmd=$mvprog 9104007ebaSmrgrmcmd="$rmprog -f" 9204007ebaSmrgstripcmd= 9304007ebaSmrg 9404007ebaSmrgsrc= 9504007ebaSmrgdst= 9604007ebaSmrgdir_arg= 9704007ebaSmrgdst_arg= 9804007ebaSmrg 9904007ebaSmrgcopy_on_change=false 10004007ebaSmrgno_target_directory= 10104007ebaSmrg 10204007ebaSmrgusage="\ 10304007ebaSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 10404007ebaSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 10504007ebaSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 10604007ebaSmrg or: $0 [OPTION]... -d DIRECTORIES... 10704007ebaSmrg 10804007ebaSmrgIn the 1st form, copy SRCFILE to DSTFILE. 10904007ebaSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 11004007ebaSmrgIn the 4th, create DIRECTORIES. 11104007ebaSmrg 11204007ebaSmrgOptions: 11304007ebaSmrg --help display this help and exit. 11404007ebaSmrg --version display version info and exit. 11504007ebaSmrg 11604007ebaSmrg -c (ignored) 11704007ebaSmrg -C install only if different (preserve the last data modification time) 11804007ebaSmrg -d create directories instead of installing files. 11904007ebaSmrg -g GROUP $chgrpprog installed files to GROUP. 12004007ebaSmrg -m MODE $chmodprog installed files to MODE. 12104007ebaSmrg -o USER $chownprog installed files to USER. 12204007ebaSmrg -s $stripprog installed files. 12304007ebaSmrg -t DIRECTORY install into DIRECTORY. 12404007ebaSmrg -T report an error if DSTFILE is a directory. 12504007ebaSmrg 12604007ebaSmrgEnvironment variables override the default commands: 12704007ebaSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12804007ebaSmrg RMPROG STRIPPROG 12904007ebaSmrg" 13004007ebaSmrg 13104007ebaSmrgwhile test $# -ne 0; do 13204007ebaSmrg case $1 in 13304007ebaSmrg -c) ;; 13404007ebaSmrg 13504007ebaSmrg -C) copy_on_change=true;; 13604007ebaSmrg 13704007ebaSmrg -d) dir_arg=true;; 13804007ebaSmrg 13904007ebaSmrg -g) chgrpcmd="$chgrpprog $2" 14004007ebaSmrg shift;; 14104007ebaSmrg 14204007ebaSmrg --help) echo "$usage"; exit $?;; 14304007ebaSmrg 14404007ebaSmrg -m) mode=$2 14504007ebaSmrg case $mode in 14604007ebaSmrg *' '* | *' '* | *' 14704007ebaSmrg'* | *'*'* | *'?'* | *'['*) 14804007ebaSmrg echo "$0: invalid mode: $mode" >&2 14904007ebaSmrg exit 1;; 15004007ebaSmrg esac 15104007ebaSmrg shift;; 15204007ebaSmrg 15304007ebaSmrg -o) chowncmd="$chownprog $2" 15404007ebaSmrg shift;; 15504007ebaSmrg 15604007ebaSmrg -s) stripcmd=$stripprog;; 15704007ebaSmrg 15804007ebaSmrg -t) dst_arg=$2 15904007ebaSmrg # Protect names problematic for 'test' and other utilities. 16004007ebaSmrg case $dst_arg in 16104007ebaSmrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 16204007ebaSmrg esac 16304007ebaSmrg shift;; 16404007ebaSmrg 16504007ebaSmrg -T) no_target_directory=true;; 16604007ebaSmrg 16704007ebaSmrg --version) echo "$0 $scriptversion"; exit $?;; 16804007ebaSmrg 16904007ebaSmrg --) shift 17004007ebaSmrg break;; 17104007ebaSmrg 17204007ebaSmrg -*) echo "$0: invalid option: $1" >&2 17304007ebaSmrg exit 1;; 17404007ebaSmrg 17504007ebaSmrg *) break;; 17604007ebaSmrg esac 17704007ebaSmrg shift 17804007ebaSmrgdone 17904007ebaSmrg 18004007ebaSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 18104007ebaSmrg # When -d is used, all remaining arguments are directories to create. 18204007ebaSmrg # When -t is used, the destination is already specified. 18304007ebaSmrg # Otherwise, the last argument is the destination. Remove it from $@. 18404007ebaSmrg for arg 18504007ebaSmrg do 18604007ebaSmrg if test -n "$dst_arg"; then 18704007ebaSmrg # $@ is not empty: it contains at least $arg. 18804007ebaSmrg set fnord "$@" "$dst_arg" 18904007ebaSmrg shift # fnord 19004007ebaSmrg fi 19104007ebaSmrg shift # arg 19204007ebaSmrg dst_arg=$arg 19304007ebaSmrg # Protect names problematic for 'test' and other utilities. 19404007ebaSmrg case $dst_arg in 19504007ebaSmrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 19604007ebaSmrg esac 19704007ebaSmrg done 19804007ebaSmrgfi 19904007ebaSmrg 20004007ebaSmrgif test $# -eq 0; then 20104007ebaSmrg if test -z "$dir_arg"; then 20204007ebaSmrg echo "$0: no input file specified." >&2 20304007ebaSmrg exit 1 20404007ebaSmrg fi 20504007ebaSmrg # It's OK to call 'install-sh -d' without argument. 20604007ebaSmrg # This can happen when creating conditional directories. 20704007ebaSmrg exit 0 20804007ebaSmrgfi 20904007ebaSmrg 21004007ebaSmrgif test -z "$dir_arg"; then 21104007ebaSmrg do_exit='(exit $ret); exit $ret' 21204007ebaSmrg trap "ret=129; $do_exit" 1 21304007ebaSmrg trap "ret=130; $do_exit" 2 21404007ebaSmrg trap "ret=141; $do_exit" 13 21504007ebaSmrg trap "ret=143; $do_exit" 15 21604007ebaSmrg 21704007ebaSmrg # Set umask so as not to create temps with too-generous modes. 21804007ebaSmrg # However, 'strip' requires both read and write access to temps. 21904007ebaSmrg case $mode in 22004007ebaSmrg # Optimize common cases. 22104007ebaSmrg *644) cp_umask=133;; 22204007ebaSmrg *755) cp_umask=22;; 22304007ebaSmrg 22404007ebaSmrg *[0-7]) 22504007ebaSmrg if test -z "$stripcmd"; then 22604007ebaSmrg u_plus_rw= 22704007ebaSmrg else 22804007ebaSmrg u_plus_rw='% 200' 22904007ebaSmrg fi 23004007ebaSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 23104007ebaSmrg *) 23204007ebaSmrg if test -z "$stripcmd"; then 23304007ebaSmrg u_plus_rw= 23404007ebaSmrg else 23504007ebaSmrg u_plus_rw=,u+rw 23604007ebaSmrg fi 23704007ebaSmrg cp_umask=$mode$u_plus_rw;; 23804007ebaSmrg esac 23904007ebaSmrgfi 24004007ebaSmrg 24104007ebaSmrgfor src 24204007ebaSmrgdo 24304007ebaSmrg # Protect names problematic for 'test' and other utilities. 24404007ebaSmrg case $src in 24504007ebaSmrg -* | [=\(\)!]) src=./$src;; 24604007ebaSmrg esac 24704007ebaSmrg 24804007ebaSmrg if test -n "$dir_arg"; then 24904007ebaSmrg dst=$src 25004007ebaSmrg dstdir=$dst 25104007ebaSmrg test -d "$dstdir" 25204007ebaSmrg dstdir_status=$? 25304007ebaSmrg else 25404007ebaSmrg 25504007ebaSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 25604007ebaSmrg # might cause directories to be created, which would be especially bad 25704007ebaSmrg # if $src (and thus $dsttmp) contains '*'. 25804007ebaSmrg if test ! -f "$src" && test ! -d "$src"; then 25904007ebaSmrg echo "$0: $src does not exist." >&2 26004007ebaSmrg exit 1 26104007ebaSmrg fi 26204007ebaSmrg 26304007ebaSmrg if test -z "$dst_arg"; then 26404007ebaSmrg echo "$0: no destination specified." >&2 26504007ebaSmrg exit 1 26604007ebaSmrg fi 26704007ebaSmrg dst=$dst_arg 26804007ebaSmrg 26904007ebaSmrg # If destination is a directory, append the input filename; won't work 27004007ebaSmrg # if double slashes aren't ignored. 27104007ebaSmrg if test -d "$dst"; then 27204007ebaSmrg if test -n "$no_target_directory"; then 27304007ebaSmrg echo "$0: $dst_arg: Is a directory" >&2 27404007ebaSmrg exit 1 27504007ebaSmrg fi 27604007ebaSmrg dstdir=$dst 27704007ebaSmrg dst=$dstdir/`basename "$src"` 27804007ebaSmrg dstdir_status=0 27904007ebaSmrg else 28004007ebaSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 28104007ebaSmrg dstdir=` 28204007ebaSmrg (dirname "$dst") 2>/dev/null || 28304007ebaSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 28404007ebaSmrg X"$dst" : 'X\(//\)[^/]' \| \ 28504007ebaSmrg X"$dst" : 'X\(//\)$' \| \ 28604007ebaSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28704007ebaSmrg echo X"$dst" | 28804007ebaSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28904007ebaSmrg s//\1/ 29004007ebaSmrg q 29104007ebaSmrg } 29204007ebaSmrg /^X\(\/\/\)[^/].*/{ 29304007ebaSmrg s//\1/ 29404007ebaSmrg q 29504007ebaSmrg } 29604007ebaSmrg /^X\(\/\/\)$/{ 29704007ebaSmrg s//\1/ 29804007ebaSmrg q 29904007ebaSmrg } 30004007ebaSmrg /^X\(\/\).*/{ 30104007ebaSmrg s//\1/ 30204007ebaSmrg q 30304007ebaSmrg } 30404007ebaSmrg s/.*/./; q' 30504007ebaSmrg ` 30604007ebaSmrg 30704007ebaSmrg test -d "$dstdir" 30804007ebaSmrg dstdir_status=$? 30904007ebaSmrg fi 31004007ebaSmrg fi 31104007ebaSmrg 31204007ebaSmrg obsolete_mkdir_used=false 31304007ebaSmrg 31404007ebaSmrg if test $dstdir_status != 0; then 31504007ebaSmrg case $posix_mkdir in 31604007ebaSmrg '') 31704007ebaSmrg # Create intermediate dirs using mode 755 as modified by the umask. 31804007ebaSmrg # This is like FreeBSD 'install' as of 1997-10-28. 31904007ebaSmrg umask=`umask` 32004007ebaSmrg case $stripcmd.$umask in 32104007ebaSmrg # Optimize common cases. 32204007ebaSmrg *[2367][2367]) mkdir_umask=$umask;; 32304007ebaSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 32404007ebaSmrg 32504007ebaSmrg *[0-7]) 32604007ebaSmrg mkdir_umask=`expr $umask + 22 \ 32704007ebaSmrg - $umask % 100 % 40 + $umask % 20 \ 32804007ebaSmrg - $umask % 10 % 4 + $umask % 2 32904007ebaSmrg `;; 33004007ebaSmrg *) mkdir_umask=$umask,go-w;; 33104007ebaSmrg esac 33204007ebaSmrg 33304007ebaSmrg # With -d, create the new directory with the user-specified mode. 33404007ebaSmrg # Otherwise, rely on $mkdir_umask. 33504007ebaSmrg if test -n "$dir_arg"; then 33604007ebaSmrg mkdir_mode=-m$mode 33704007ebaSmrg else 33804007ebaSmrg mkdir_mode= 33904007ebaSmrg fi 34004007ebaSmrg 34104007ebaSmrg posix_mkdir=false 34204007ebaSmrg case $umask in 34304007ebaSmrg *[123567][0-7][0-7]) 34404007ebaSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 34504007ebaSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 34604007ebaSmrg ;; 34704007ebaSmrg *) 34804007ebaSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34904007ebaSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 35004007ebaSmrg 35104007ebaSmrg if (umask $mkdir_umask && 35204007ebaSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 35304007ebaSmrg then 35404007ebaSmrg if test -z "$dir_arg" || { 35504007ebaSmrg # Check for POSIX incompatibilities with -m. 35604007ebaSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35704007ebaSmrg # other-writable bit of parent directory when it shouldn't. 35804007ebaSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35904007ebaSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 36004007ebaSmrg case $ls_ld_tmpdir in 36104007ebaSmrg d????-?r-*) different_mode=700;; 36204007ebaSmrg d????-?--*) different_mode=755;; 36304007ebaSmrg *) false;; 36404007ebaSmrg esac && 36504007ebaSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 36604007ebaSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36704007ebaSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36804007ebaSmrg } 36904007ebaSmrg } 37004007ebaSmrg then posix_mkdir=: 37104007ebaSmrg fi 37204007ebaSmrg rmdir "$tmpdir/d" "$tmpdir" 37304007ebaSmrg else 37404007ebaSmrg # Remove any dirs left behind by ancient mkdir implementations. 37504007ebaSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 37604007ebaSmrg fi 37704007ebaSmrg trap '' 0;; 37804007ebaSmrg esac;; 37904007ebaSmrg esac 38004007ebaSmrg 38104007ebaSmrg if 38204007ebaSmrg $posix_mkdir && ( 38304007ebaSmrg umask $mkdir_umask && 38404007ebaSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38504007ebaSmrg ) 38604007ebaSmrg then : 38704007ebaSmrg else 38804007ebaSmrg 38904007ebaSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 39004007ebaSmrg # or it failed possibly due to a race condition. Create the 39104007ebaSmrg # directory the slow way, step by step, checking for races as we go. 39204007ebaSmrg 39304007ebaSmrg case $dstdir in 39404007ebaSmrg /*) prefix='/';; 39504007ebaSmrg [-=\(\)!]*) prefix='./';; 39604007ebaSmrg *) prefix='';; 39704007ebaSmrg esac 39804007ebaSmrg 39904007ebaSmrg eval "$initialize_posix_glob" 40004007ebaSmrg 40104007ebaSmrg oIFS=$IFS 40204007ebaSmrg IFS=/ 40304007ebaSmrg $posix_glob set -f 40404007ebaSmrg set fnord $dstdir 40504007ebaSmrg shift 40604007ebaSmrg $posix_glob set +f 40704007ebaSmrg IFS=$oIFS 40804007ebaSmrg 40904007ebaSmrg prefixes= 41004007ebaSmrg 41104007ebaSmrg for d 41204007ebaSmrg do 41304007ebaSmrg test X"$d" = X && continue 41404007ebaSmrg 41504007ebaSmrg prefix=$prefix$d 41604007ebaSmrg if test -d "$prefix"; then 41704007ebaSmrg prefixes= 41804007ebaSmrg else 41904007ebaSmrg if $posix_mkdir; then 42004007ebaSmrg (umask=$mkdir_umask && 42104007ebaSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 42204007ebaSmrg # Don't fail if two instances are running concurrently. 42304007ebaSmrg test -d "$prefix" || exit 1 42404007ebaSmrg else 42504007ebaSmrg case $prefix in 42604007ebaSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42704007ebaSmrg *) qprefix=$prefix;; 42804007ebaSmrg esac 42904007ebaSmrg prefixes="$prefixes '$qprefix'" 43004007ebaSmrg fi 43104007ebaSmrg fi 43204007ebaSmrg prefix=$prefix/ 43304007ebaSmrg done 43404007ebaSmrg 43504007ebaSmrg if test -n "$prefixes"; then 43604007ebaSmrg # Don't fail if two instances are running concurrently. 43704007ebaSmrg (umask $mkdir_umask && 43804007ebaSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 43904007ebaSmrg test -d "$dstdir" || exit 1 44004007ebaSmrg obsolete_mkdir_used=true 44104007ebaSmrg fi 44204007ebaSmrg fi 44304007ebaSmrg fi 44404007ebaSmrg 44504007ebaSmrg if test -n "$dir_arg"; then 44604007ebaSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44704007ebaSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44804007ebaSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44904007ebaSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 45004007ebaSmrg else 45104007ebaSmrg 45204007ebaSmrg # Make a couple of temp file names in the proper directory. 45304007ebaSmrg dsttmp=$dstdir/_inst.$$_ 45404007ebaSmrg rmtmp=$dstdir/_rm.$$_ 45504007ebaSmrg 45604007ebaSmrg # Trap to clean up those temp files at exit. 45704007ebaSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45804007ebaSmrg 45904007ebaSmrg # Copy the file name to the temp name. 46004007ebaSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 46104007ebaSmrg 46204007ebaSmrg # and set any options; do chmod last to preserve setuid bits. 46304007ebaSmrg # 46404007ebaSmrg # If any of these fail, we abort the whole thing. If we want to 46504007ebaSmrg # ignore errors from any of these, just make sure not to ignore 46604007ebaSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 46704007ebaSmrg # 46804007ebaSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46904007ebaSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 47004007ebaSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 47104007ebaSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 47204007ebaSmrg 47304007ebaSmrg # If -C, don't bother to copy if it wouldn't change the file. 47404007ebaSmrg if $copy_on_change && 47504007ebaSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 47604007ebaSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47704007ebaSmrg 47804007ebaSmrg eval "$initialize_posix_glob" && 47904007ebaSmrg $posix_glob set -f && 48004007ebaSmrg set X $old && old=:$2:$4:$5:$6 && 48104007ebaSmrg set X $new && new=:$2:$4:$5:$6 && 48204007ebaSmrg $posix_glob set +f && 48304007ebaSmrg 48404007ebaSmrg test "$old" = "$new" && 48504007ebaSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 48604007ebaSmrg then 48704007ebaSmrg rm -f "$dsttmp" 48804007ebaSmrg else 48904007ebaSmrg # Rename the file to the real destination. 49004007ebaSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 49104007ebaSmrg 49204007ebaSmrg # The rename failed, perhaps because mv can't rename something else 49304007ebaSmrg # to itself, or perhaps because mv is so ancient that it does not 49404007ebaSmrg # support -f. 49504007ebaSmrg { 49604007ebaSmrg # Now remove or move aside any old file at destination location. 49704007ebaSmrg # We try this two ways since rm can't unlink itself on some 49804007ebaSmrg # systems and the destination file might be busy for other 49904007ebaSmrg # reasons. In this case, the final cleanup might fail but the new 50004007ebaSmrg # file should still install successfully. 50104007ebaSmrg { 50204007ebaSmrg test ! -f "$dst" || 50304007ebaSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 50404007ebaSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 50504007ebaSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 50604007ebaSmrg } || 50704007ebaSmrg { echo "$0: cannot unlink or rename $dst" >&2 50804007ebaSmrg (exit 1); exit 1 50904007ebaSmrg } 51004007ebaSmrg } && 51104007ebaSmrg 51204007ebaSmrg # Now rename the file to the real destination. 51304007ebaSmrg $doit $mvcmd "$dsttmp" "$dst" 51404007ebaSmrg } 51504007ebaSmrg fi || exit 1 51604007ebaSmrg 51704007ebaSmrg trap '' 0 51804007ebaSmrg fi 51904007ebaSmrgdone 52004007ebaSmrg 52104007ebaSmrg# Local variables: 52204007ebaSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 52304007ebaSmrg# time-stamp-start: "scriptversion=" 52404007ebaSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 52504007ebaSmrg# time-stamp-time-zone: "UTC" 52604007ebaSmrg# time-stamp-end: "; # UTC" 52704007ebaSmrg# End: 528