193249ebfSmrg#!/bin/sh 293249ebfSmrg# install - install a program, script, or datafile 393249ebfSmrg 493249ebfSmrgscriptversion=2020-11-14.01; # UTC 593249ebfSmrg 693249ebfSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 793249ebfSmrg# later released in X11R6 (xc/config/util/install.sh) with the 893249ebfSmrg# following copyright and license. 993249ebfSmrg# 1093249ebfSmrg# Copyright (C) 1994 X Consortium 1193249ebfSmrg# 1293249ebfSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 1393249ebfSmrg# of this software and associated documentation files (the "Software"), to 1493249ebfSmrg# deal in the Software without restriction, including without limitation the 1593249ebfSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1693249ebfSmrg# sell copies of the Software, and to permit persons to whom the Software is 1793249ebfSmrg# furnished to do so, subject to the following conditions: 1893249ebfSmrg# 1993249ebfSmrg# The above copyright notice and this permission notice shall be included in 2093249ebfSmrg# all copies or substantial portions of the Software. 2193249ebfSmrg# 2293249ebfSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2393249ebfSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2493249ebfSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2593249ebfSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2693249ebfSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2793249ebfSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2893249ebfSmrg# 2993249ebfSmrg# Except as contained in this notice, the name of the X Consortium shall not 3093249ebfSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 3193249ebfSmrg# ings in this Software without prior written authorization from the X Consor- 3293249ebfSmrg# tium. 3393249ebfSmrg# 3493249ebfSmrg# 3593249ebfSmrg# FSF changes to this file are in the public domain. 3693249ebfSmrg# 3793249ebfSmrg# Calling this script install-sh is preferred over install.sh, to prevent 3893249ebfSmrg# 'make' implicit rules from creating a file called install from it 3993249ebfSmrg# when there is no Makefile. 4093249ebfSmrg# 4193249ebfSmrg# This script is compatible with the BSD install script, but was written 4293249ebfSmrg# from scratch. 4393249ebfSmrg 4493249ebfSmrgtab=' ' 4593249ebfSmrgnl=' 4693249ebfSmrg' 4793249ebfSmrgIFS=" $tab$nl" 4893249ebfSmrg 4993249ebfSmrg# Set DOITPROG to "echo" to test this script. 5093249ebfSmrg 5193249ebfSmrgdoit=${DOITPROG-} 5293249ebfSmrgdoit_exec=${doit:-exec} 5393249ebfSmrg 5493249ebfSmrg# Put in absolute file names if you don't have them in your path; 5593249ebfSmrg# or use environment vars. 5693249ebfSmrg 5793249ebfSmrgchgrpprog=${CHGRPPROG-chgrp} 5893249ebfSmrgchmodprog=${CHMODPROG-chmod} 5993249ebfSmrgchownprog=${CHOWNPROG-chown} 6093249ebfSmrgcmpprog=${CMPPROG-cmp} 6193249ebfSmrgcpprog=${CPPROG-cp} 6293249ebfSmrgmkdirprog=${MKDIRPROG-mkdir} 6393249ebfSmrgmvprog=${MVPROG-mv} 6493249ebfSmrgrmprog=${RMPROG-rm} 6593249ebfSmrgstripprog=${STRIPPROG-strip} 6693249ebfSmrg 6793249ebfSmrgposix_mkdir= 6893249ebfSmrg 6993249ebfSmrg# Desired mode of installed file. 7093249ebfSmrgmode=0755 7193249ebfSmrg 7293249ebfSmrg# Create dirs (including intermediate dirs) using mode 755. 7393249ebfSmrg# This is like GNU 'install' as of coreutils 8.32 (2020). 7493249ebfSmrgmkdir_umask=22 7593249ebfSmrg 7693249ebfSmrgbackupsuffix= 7793249ebfSmrgchgrpcmd= 7893249ebfSmrgchmodcmd=$chmodprog 7993249ebfSmrgchowncmd= 8093249ebfSmrgmvcmd=$mvprog 8193249ebfSmrgrmcmd="$rmprog -f" 8293249ebfSmrgstripcmd= 8393249ebfSmrg 8493249ebfSmrgsrc= 8593249ebfSmrgdst= 8693249ebfSmrgdir_arg= 8793249ebfSmrgdst_arg= 8893249ebfSmrg 8993249ebfSmrgcopy_on_change=false 9093249ebfSmrgis_target_a_directory=possibly 9193249ebfSmrg 9293249ebfSmrgusage="\ 9393249ebfSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 9493249ebfSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 9593249ebfSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 9693249ebfSmrg or: $0 [OPTION]... -d DIRECTORIES... 9793249ebfSmrg 9893249ebfSmrgIn the 1st form, copy SRCFILE to DSTFILE. 9993249ebfSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 10093249ebfSmrgIn the 4th, create DIRECTORIES. 10193249ebfSmrg 10293249ebfSmrgOptions: 10393249ebfSmrg --help display this help and exit. 10493249ebfSmrg --version display version info and exit. 10593249ebfSmrg 10693249ebfSmrg -c (ignored) 10793249ebfSmrg -C install only if different (preserve data modification time) 10893249ebfSmrg -d create directories instead of installing files. 10993249ebfSmrg -g GROUP $chgrpprog installed files to GROUP. 11093249ebfSmrg -m MODE $chmodprog installed files to MODE. 11193249ebfSmrg -o USER $chownprog installed files to USER. 11293249ebfSmrg -p pass -p to $cpprog. 11393249ebfSmrg -s $stripprog installed files. 11493249ebfSmrg -S SUFFIX attempt to back up existing files, with suffix SUFFIX. 11593249ebfSmrg -t DIRECTORY install into DIRECTORY. 11693249ebfSmrg -T report an error if DSTFILE is a directory. 11793249ebfSmrg 11893249ebfSmrgEnvironment variables override the default commands: 11993249ebfSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12093249ebfSmrg RMPROG STRIPPROG 12193249ebfSmrg 12293249ebfSmrgBy default, rm is invoked with -f; when overridden with RMPROG, 12393249ebfSmrgit's up to you to specify -f if you want it. 12493249ebfSmrg 12593249ebfSmrgIf -S is not specified, no backups are attempted. 12693249ebfSmrg 12793249ebfSmrgEmail bug reports to bug-automake@gnu.org. 12893249ebfSmrgAutomake home page: https://www.gnu.org/software/automake/ 12993249ebfSmrg" 13093249ebfSmrg 13193249ebfSmrgwhile test $# -ne 0; do 13293249ebfSmrg case $1 in 13393249ebfSmrg -c) ;; 13493249ebfSmrg 13593249ebfSmrg -C) copy_on_change=true;; 13693249ebfSmrg 13793249ebfSmrg -d) dir_arg=true;; 13893249ebfSmrg 13993249ebfSmrg -g) chgrpcmd="$chgrpprog $2" 14093249ebfSmrg shift;; 14193249ebfSmrg 14293249ebfSmrg --help) echo "$usage"; exit $?;; 14393249ebfSmrg 14493249ebfSmrg -m) mode=$2 14593249ebfSmrg case $mode in 14693249ebfSmrg *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 14793249ebfSmrg echo "$0: invalid mode: $mode" >&2 14893249ebfSmrg exit 1;; 14993249ebfSmrg esac 15093249ebfSmrg shift;; 15193249ebfSmrg 15293249ebfSmrg -o) chowncmd="$chownprog $2" 15393249ebfSmrg shift;; 15493249ebfSmrg 15593249ebfSmrg -p) cpprog="$cpprog -p";; 15693249ebfSmrg 15793249ebfSmrg -s) stripcmd=$stripprog;; 15893249ebfSmrg 15993249ebfSmrg -S) backupsuffix="$2" 16093249ebfSmrg shift;; 16193249ebfSmrg 16293249ebfSmrg -t) 16393249ebfSmrg is_target_a_directory=always 16493249ebfSmrg dst_arg=$2 16593249ebfSmrg # Protect names problematic for 'test' and other utilities. 16693249ebfSmrg case $dst_arg in 16793249ebfSmrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 16893249ebfSmrg esac 16993249ebfSmrg shift;; 17093249ebfSmrg 17193249ebfSmrg -T) is_target_a_directory=never;; 17293249ebfSmrg 17393249ebfSmrg --version) echo "$0 $scriptversion"; exit $?;; 17493249ebfSmrg 17593249ebfSmrg --) shift 17693249ebfSmrg break;; 17793249ebfSmrg 17893249ebfSmrg -*) echo "$0: invalid option: $1" >&2 17993249ebfSmrg exit 1;; 18093249ebfSmrg 18193249ebfSmrg *) break;; 18293249ebfSmrg esac 18393249ebfSmrg shift 18493249ebfSmrgdone 18593249ebfSmrg 18693249ebfSmrg# We allow the use of options -d and -T together, by making -d 18793249ebfSmrg# take the precedence; this is for compatibility with GNU install. 18893249ebfSmrg 18993249ebfSmrgif test -n "$dir_arg"; then 19093249ebfSmrg if test -n "$dst_arg"; then 19193249ebfSmrg echo "$0: target directory not allowed when installing a directory." >&2 19293249ebfSmrg exit 1 19393249ebfSmrg fi 19493249ebfSmrgfi 19593249ebfSmrg 19693249ebfSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 19793249ebfSmrg # When -d is used, all remaining arguments are directories to create. 19893249ebfSmrg # When -t is used, the destination is already specified. 19993249ebfSmrg # Otherwise, the last argument is the destination. Remove it from $@. 20093249ebfSmrg for arg 20193249ebfSmrg do 20293249ebfSmrg if test -n "$dst_arg"; then 20393249ebfSmrg # $@ is not empty: it contains at least $arg. 20493249ebfSmrg set fnord "$@" "$dst_arg" 20593249ebfSmrg shift # fnord 20693249ebfSmrg fi 20793249ebfSmrg shift # arg 20893249ebfSmrg dst_arg=$arg 20993249ebfSmrg # Protect names problematic for 'test' and other utilities. 21093249ebfSmrg case $dst_arg in 21193249ebfSmrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 21293249ebfSmrg esac 21393249ebfSmrg done 21493249ebfSmrgfi 21593249ebfSmrg 21693249ebfSmrgif test $# -eq 0; then 21793249ebfSmrg if test -z "$dir_arg"; then 21893249ebfSmrg echo "$0: no input file specified." >&2 21993249ebfSmrg exit 1 22093249ebfSmrg fi 22193249ebfSmrg # It's OK to call 'install-sh -d' without argument. 22293249ebfSmrg # This can happen when creating conditional directories. 22393249ebfSmrg exit 0 22493249ebfSmrgfi 22593249ebfSmrg 22693249ebfSmrgif test -z "$dir_arg"; then 22793249ebfSmrg if test $# -gt 1 || test "$is_target_a_directory" = always; then 22893249ebfSmrg if test ! -d "$dst_arg"; then 22993249ebfSmrg echo "$0: $dst_arg: Is not a directory." >&2 23093249ebfSmrg exit 1 23193249ebfSmrg fi 23293249ebfSmrg fi 23393249ebfSmrgfi 23493249ebfSmrg 23593249ebfSmrgif test -z "$dir_arg"; then 23693249ebfSmrg do_exit='(exit $ret); exit $ret' 23793249ebfSmrg trap "ret=129; $do_exit" 1 23893249ebfSmrg trap "ret=130; $do_exit" 2 23993249ebfSmrg trap "ret=141; $do_exit" 13 24093249ebfSmrg trap "ret=143; $do_exit" 15 24193249ebfSmrg 24293249ebfSmrg # Set umask so as not to create temps with too-generous modes. 24393249ebfSmrg # However, 'strip' requires both read and write access to temps. 24493249ebfSmrg case $mode in 24593249ebfSmrg # Optimize common cases. 24693249ebfSmrg *644) cp_umask=133;; 24793249ebfSmrg *755) cp_umask=22;; 24893249ebfSmrg 24993249ebfSmrg *[0-7]) 25093249ebfSmrg if test -z "$stripcmd"; then 25193249ebfSmrg u_plus_rw= 25293249ebfSmrg else 25393249ebfSmrg u_plus_rw='% 200' 25493249ebfSmrg fi 25593249ebfSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 25693249ebfSmrg *) 25793249ebfSmrg if test -z "$stripcmd"; then 25893249ebfSmrg u_plus_rw= 25993249ebfSmrg else 26093249ebfSmrg u_plus_rw=,u+rw 26193249ebfSmrg fi 26293249ebfSmrg cp_umask=$mode$u_plus_rw;; 26393249ebfSmrg esac 26493249ebfSmrgfi 26593249ebfSmrg 26693249ebfSmrgfor src 26793249ebfSmrgdo 26893249ebfSmrg # Protect names problematic for 'test' and other utilities. 26993249ebfSmrg case $src in 27093249ebfSmrg -* | [=\(\)!]) src=./$src;; 27193249ebfSmrg esac 27293249ebfSmrg 27393249ebfSmrg if test -n "$dir_arg"; then 27493249ebfSmrg dst=$src 27593249ebfSmrg dstdir=$dst 27693249ebfSmrg test -d "$dstdir" 27793249ebfSmrg dstdir_status=$? 27893249ebfSmrg # Don't chown directories that already exist. 27993249ebfSmrg if test $dstdir_status = 0; then 28093249ebfSmrg chowncmd="" 28193249ebfSmrg fi 28293249ebfSmrg else 28393249ebfSmrg 28493249ebfSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 28593249ebfSmrg # might cause directories to be created, which would be especially bad 28693249ebfSmrg # if $src (and thus $dsttmp) contains '*'. 28793249ebfSmrg if test ! -f "$src" && test ! -d "$src"; then 28893249ebfSmrg echo "$0: $src does not exist." >&2 28993249ebfSmrg exit 1 29093249ebfSmrg fi 29193249ebfSmrg 29293249ebfSmrg if test -z "$dst_arg"; then 29393249ebfSmrg echo "$0: no destination specified." >&2 29493249ebfSmrg exit 1 29593249ebfSmrg fi 29693249ebfSmrg dst=$dst_arg 29793249ebfSmrg 29893249ebfSmrg # If destination is a directory, append the input filename. 29993249ebfSmrg if test -d "$dst"; then 30093249ebfSmrg if test "$is_target_a_directory" = never; then 30193249ebfSmrg echo "$0: $dst_arg: Is a directory" >&2 30293249ebfSmrg exit 1 30393249ebfSmrg fi 30493249ebfSmrg dstdir=$dst 30593249ebfSmrg dstbase=`basename "$src"` 30693249ebfSmrg case $dst in 30793249ebfSmrg */) dst=$dst$dstbase;; 30893249ebfSmrg *) dst=$dst/$dstbase;; 30993249ebfSmrg esac 31093249ebfSmrg dstdir_status=0 31193249ebfSmrg else 31293249ebfSmrg dstdir=`dirname "$dst"` 31393249ebfSmrg test -d "$dstdir" 31493249ebfSmrg dstdir_status=$? 31593249ebfSmrg fi 31693249ebfSmrg fi 31793249ebfSmrg 31893249ebfSmrg case $dstdir in 31993249ebfSmrg */) dstdirslash=$dstdir;; 32093249ebfSmrg *) dstdirslash=$dstdir/;; 32193249ebfSmrg esac 32293249ebfSmrg 32393249ebfSmrg obsolete_mkdir_used=false 32493249ebfSmrg 32593249ebfSmrg if test $dstdir_status != 0; then 32693249ebfSmrg case $posix_mkdir in 32793249ebfSmrg '') 32893249ebfSmrg # With -d, create the new directory with the user-specified mode. 32993249ebfSmrg # Otherwise, rely on $mkdir_umask. 33093249ebfSmrg if test -n "$dir_arg"; then 33193249ebfSmrg mkdir_mode=-m$mode 33293249ebfSmrg else 33393249ebfSmrg mkdir_mode= 33493249ebfSmrg fi 33593249ebfSmrg 33693249ebfSmrg posix_mkdir=false 33793249ebfSmrg # The $RANDOM variable is not portable (e.g., dash). Use it 33893249ebfSmrg # here however when possible just to lower collision chance. 33993249ebfSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34093249ebfSmrg 34193249ebfSmrg trap ' 34293249ebfSmrg ret=$? 34393249ebfSmrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null 34493249ebfSmrg exit $ret 34593249ebfSmrg ' 0 34693249ebfSmrg 34793249ebfSmrg # Because "mkdir -p" follows existing symlinks and we likely work 34893249ebfSmrg # directly in world-writeable /tmp, make sure that the '$tmpdir' 34993249ebfSmrg # directory is successfully created first before we actually test 35093249ebfSmrg # 'mkdir -p'. 35193249ebfSmrg if (umask $mkdir_umask && 35293249ebfSmrg $mkdirprog $mkdir_mode "$tmpdir" && 35393249ebfSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 35493249ebfSmrg then 35593249ebfSmrg if test -z "$dir_arg" || { 35693249ebfSmrg # Check for POSIX incompatibilities with -m. 35793249ebfSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35893249ebfSmrg # other-writable bit of parent directory when it shouldn't. 35993249ebfSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 36093249ebfSmrg test_tmpdir="$tmpdir/a" 36193249ebfSmrg ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 36293249ebfSmrg case $ls_ld_tmpdir in 36393249ebfSmrg d????-?r-*) different_mode=700;; 36493249ebfSmrg d????-?--*) different_mode=755;; 36593249ebfSmrg *) false;; 36693249ebfSmrg esac && 36793249ebfSmrg $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 36893249ebfSmrg ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 36993249ebfSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 37093249ebfSmrg } 37193249ebfSmrg } 37293249ebfSmrg then posix_mkdir=: 37393249ebfSmrg fi 37493249ebfSmrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 37593249ebfSmrg else 37693249ebfSmrg # Remove any dirs left behind by ancient mkdir implementations. 37793249ebfSmrg rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 37893249ebfSmrg fi 37993249ebfSmrg trap '' 0;; 38093249ebfSmrg esac 38193249ebfSmrg 38293249ebfSmrg if 38393249ebfSmrg $posix_mkdir && ( 38493249ebfSmrg umask $mkdir_umask && 38593249ebfSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38693249ebfSmrg ) 38793249ebfSmrg then : 38893249ebfSmrg else 38993249ebfSmrg 39093249ebfSmrg # mkdir does not conform to POSIX, 39193249ebfSmrg # or it failed possibly due to a race condition. Create the 39293249ebfSmrg # directory the slow way, step by step, checking for races as we go. 39393249ebfSmrg 39493249ebfSmrg case $dstdir in 39593249ebfSmrg /*) prefix='/';; 39693249ebfSmrg [-=\(\)!]*) prefix='./';; 39793249ebfSmrg *) prefix='';; 39893249ebfSmrg esac 39993249ebfSmrg 40093249ebfSmrg oIFS=$IFS 40193249ebfSmrg IFS=/ 40293249ebfSmrg set -f 40393249ebfSmrg set fnord $dstdir 40493249ebfSmrg shift 40593249ebfSmrg set +f 40693249ebfSmrg IFS=$oIFS 40793249ebfSmrg 40893249ebfSmrg prefixes= 40993249ebfSmrg 41093249ebfSmrg for d 41193249ebfSmrg do 41293249ebfSmrg test X"$d" = X && continue 41393249ebfSmrg 41493249ebfSmrg prefix=$prefix$d 41593249ebfSmrg if test -d "$prefix"; then 41693249ebfSmrg prefixes= 41793249ebfSmrg else 41893249ebfSmrg if $posix_mkdir; then 41993249ebfSmrg (umask $mkdir_umask && 42093249ebfSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 42193249ebfSmrg # Don't fail if two instances are running concurrently. 42293249ebfSmrg test -d "$prefix" || exit 1 42393249ebfSmrg else 42493249ebfSmrg case $prefix in 42593249ebfSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42693249ebfSmrg *) qprefix=$prefix;; 42793249ebfSmrg esac 42893249ebfSmrg prefixes="$prefixes '$qprefix'" 42993249ebfSmrg fi 43093249ebfSmrg fi 43193249ebfSmrg prefix=$prefix/ 43293249ebfSmrg done 43393249ebfSmrg 43493249ebfSmrg if test -n "$prefixes"; then 43593249ebfSmrg # Don't fail if two instances are running concurrently. 43693249ebfSmrg (umask $mkdir_umask && 43793249ebfSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 43893249ebfSmrg test -d "$dstdir" || exit 1 43993249ebfSmrg obsolete_mkdir_used=true 44093249ebfSmrg fi 44193249ebfSmrg fi 44293249ebfSmrg fi 44393249ebfSmrg 44493249ebfSmrg if test -n "$dir_arg"; then 44593249ebfSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44693249ebfSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44793249ebfSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44893249ebfSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44993249ebfSmrg else 45093249ebfSmrg 45193249ebfSmrg # Make a couple of temp file names in the proper directory. 45293249ebfSmrg dsttmp=${dstdirslash}_inst.$$_ 45393249ebfSmrg rmtmp=${dstdirslash}_rm.$$_ 45493249ebfSmrg 45593249ebfSmrg # Trap to clean up those temp files at exit. 45693249ebfSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45793249ebfSmrg 45893249ebfSmrg # Copy the file name to the temp name. 45993249ebfSmrg (umask $cp_umask && 46093249ebfSmrg { test -z "$stripcmd" || { 46193249ebfSmrg # Create $dsttmp read-write so that cp doesn't create it read-only, 46293249ebfSmrg # which would cause strip to fail. 46393249ebfSmrg if test -z "$doit"; then 46493249ebfSmrg : >"$dsttmp" # No need to fork-exec 'touch'. 46593249ebfSmrg else 46693249ebfSmrg $doit touch "$dsttmp" 46793249ebfSmrg fi 46893249ebfSmrg } 46993249ebfSmrg } && 47093249ebfSmrg $doit_exec $cpprog "$src" "$dsttmp") && 47193249ebfSmrg 47293249ebfSmrg # and set any options; do chmod last to preserve setuid bits. 47393249ebfSmrg # 47493249ebfSmrg # If any of these fail, we abort the whole thing. If we want to 47593249ebfSmrg # ignore errors from any of these, just make sure not to ignore 47693249ebfSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 47793249ebfSmrg # 47893249ebfSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 47993249ebfSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 48093249ebfSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 48193249ebfSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 48293249ebfSmrg 48393249ebfSmrg # If -C, don't bother to copy if it wouldn't change the file. 48493249ebfSmrg if $copy_on_change && 48593249ebfSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 48693249ebfSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 48793249ebfSmrg set -f && 48893249ebfSmrg set X $old && old=:$2:$4:$5:$6 && 48993249ebfSmrg set X $new && new=:$2:$4:$5:$6 && 49093249ebfSmrg set +f && 49193249ebfSmrg test "$old" = "$new" && 49293249ebfSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 49393249ebfSmrg then 49493249ebfSmrg rm -f "$dsttmp" 49593249ebfSmrg else 49693249ebfSmrg # If $backupsuffix is set, and the file being installed 49793249ebfSmrg # already exists, attempt a backup. Don't worry if it fails, 49893249ebfSmrg # e.g., if mv doesn't support -f. 49993249ebfSmrg if test -n "$backupsuffix" && test -f "$dst"; then 50093249ebfSmrg $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null 50193249ebfSmrg fi 50293249ebfSmrg 50393249ebfSmrg # Rename the file to the real destination. 50493249ebfSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 50593249ebfSmrg 50693249ebfSmrg # The rename failed, perhaps because mv can't rename something else 50793249ebfSmrg # to itself, or perhaps because mv is so ancient that it does not 50893249ebfSmrg # support -f. 50993249ebfSmrg { 51093249ebfSmrg # Now remove or move aside any old file at destination location. 51193249ebfSmrg # We try this two ways since rm can't unlink itself on some 51293249ebfSmrg # systems and the destination file might be busy for other 51393249ebfSmrg # reasons. In this case, the final cleanup might fail but the new 51493249ebfSmrg # file should still install successfully. 51593249ebfSmrg { 51693249ebfSmrg test ! -f "$dst" || 51793249ebfSmrg $doit $rmcmd "$dst" 2>/dev/null || 51893249ebfSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 51993249ebfSmrg { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } 52093249ebfSmrg } || 52193249ebfSmrg { echo "$0: cannot unlink or rename $dst" >&2 52293249ebfSmrg (exit 1); exit 1 52393249ebfSmrg } 52493249ebfSmrg } && 52593249ebfSmrg 52693249ebfSmrg # Now rename the file to the real destination. 52793249ebfSmrg $doit $mvcmd "$dsttmp" "$dst" 52893249ebfSmrg } 52993249ebfSmrg fi || exit 1 53093249ebfSmrg 53193249ebfSmrg trap '' 0 53293249ebfSmrg fi 53393249ebfSmrgdone 53493249ebfSmrg 53593249ebfSmrg# Local variables: 53693249ebfSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 53793249ebfSmrg# time-stamp-start: "scriptversion=" 53893249ebfSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 53993249ebfSmrg# time-stamp-time-zone: "UTC0" 54093249ebfSmrg# time-stamp-end: "; # UTC" 54193249ebfSmrg# End: 542