155de1df9Smrg#!/bin/sh 255de1df9Smrg# install - install a program, script, or datafile 355de1df9Smrg 416e5c272Smrgscriptversion=2020-11-14.01; # UTC 555de1df9Smrg 655de1df9Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 755de1df9Smrg# later released in X11R6 (xc/config/util/install.sh) with the 855de1df9Smrg# following copyright and license. 955de1df9Smrg# 1055de1df9Smrg# Copyright (C) 1994 X Consortium 1155de1df9Smrg# 1255de1df9Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 1355de1df9Smrg# of this software and associated documentation files (the "Software"), to 1455de1df9Smrg# deal in the Software without restriction, including without limitation the 1555de1df9Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1655de1df9Smrg# sell copies of the Software, and to permit persons to whom the Software is 1755de1df9Smrg# furnished to do so, subject to the following conditions: 1855de1df9Smrg# 1955de1df9Smrg# The above copyright notice and this permission notice shall be included in 2055de1df9Smrg# all copies or substantial portions of the Software. 2155de1df9Smrg# 2255de1df9Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2355de1df9Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2455de1df9Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2555de1df9Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2655de1df9Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2755de1df9Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2855de1df9Smrg# 2955de1df9Smrg# Except as contained in this notice, the name of the X Consortium shall not 3055de1df9Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 3155de1df9Smrg# ings in this Software without prior written authorization from the X Consor- 3255de1df9Smrg# tium. 3355de1df9Smrg# 3455de1df9Smrg# 3555de1df9Smrg# FSF changes to this file are in the public domain. 3655de1df9Smrg# 3755de1df9Smrg# Calling this script install-sh is preferred over install.sh, to prevent 3816e5c272Smrg# 'make' implicit rules from creating a file called install from it 3955de1df9Smrg# when there is no Makefile. 4055de1df9Smrg# 4155de1df9Smrg# This script is compatible with the BSD install script, but was written 4255de1df9Smrg# from scratch. 4355de1df9Smrg 4416e5c272Smrgtab=' ' 4555de1df9Smrgnl=' 4655de1df9Smrg' 4716e5c272SmrgIFS=" $tab$nl" 4855de1df9Smrg 4916e5c272Smrg# Set DOITPROG to "echo" to test this script. 5055de1df9Smrg 5155de1df9Smrgdoit=${DOITPROG-} 5216e5c272Smrgdoit_exec=${doit:-exec} 5355de1df9Smrg 5455de1df9Smrg# Put in absolute file names if you don't have them in your path; 5555de1df9Smrg# or use environment vars. 5655de1df9Smrg 5755de1df9Smrgchgrpprog=${CHGRPPROG-chgrp} 5855de1df9Smrgchmodprog=${CHMODPROG-chmod} 5955de1df9Smrgchownprog=${CHOWNPROG-chown} 6055de1df9Smrgcmpprog=${CMPPROG-cmp} 6155de1df9Smrgcpprog=${CPPROG-cp} 6255de1df9Smrgmkdirprog=${MKDIRPROG-mkdir} 6355de1df9Smrgmvprog=${MVPROG-mv} 6455de1df9Smrgrmprog=${RMPROG-rm} 6555de1df9Smrgstripprog=${STRIPPROG-strip} 6655de1df9Smrg 6755de1df9Smrgposix_mkdir= 6855de1df9Smrg 6955de1df9Smrg# Desired mode of installed file. 7055de1df9Smrgmode=0755 7155de1df9Smrg 7216e5c272Smrg# Create dirs (including intermediate dirs) using mode 755. 7316e5c272Smrg# This is like GNU 'install' as of coreutils 8.32 (2020). 7416e5c272Smrgmkdir_umask=22 7516e5c272Smrg 7616e5c272Smrgbackupsuffix= 7755de1df9Smrgchgrpcmd= 7855de1df9Smrgchmodcmd=$chmodprog 7955de1df9Smrgchowncmd= 8055de1df9Smrgmvcmd=$mvprog 8155de1df9Smrgrmcmd="$rmprog -f" 8255de1df9Smrgstripcmd= 8355de1df9Smrg 8455de1df9Smrgsrc= 8555de1df9Smrgdst= 8655de1df9Smrgdir_arg= 8755de1df9Smrgdst_arg= 8855de1df9Smrg 8955de1df9Smrgcopy_on_change=false 9016e5c272Smrgis_target_a_directory=possibly 9155de1df9Smrg 9255de1df9Smrgusage="\ 9355de1df9SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 9455de1df9Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 9555de1df9Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 9655de1df9Smrg or: $0 [OPTION]... -d DIRECTORIES... 9755de1df9Smrg 9855de1df9SmrgIn the 1st form, copy SRCFILE to DSTFILE. 9955de1df9SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 10055de1df9SmrgIn the 4th, create DIRECTORIES. 10155de1df9Smrg 10255de1df9SmrgOptions: 10355de1df9Smrg --help display this help and exit. 10455de1df9Smrg --version display version info and exit. 10555de1df9Smrg 10655de1df9Smrg -c (ignored) 10716e5c272Smrg -C install only if different (preserve data modification time) 10855de1df9Smrg -d create directories instead of installing files. 10955de1df9Smrg -g GROUP $chgrpprog installed files to GROUP. 11055de1df9Smrg -m MODE $chmodprog installed files to MODE. 11155de1df9Smrg -o USER $chownprog installed files to USER. 11216e5c272Smrg -p pass -p to $cpprog. 11355de1df9Smrg -s $stripprog installed files. 11416e5c272Smrg -S SUFFIX attempt to back up existing files, with suffix SUFFIX. 11555de1df9Smrg -t DIRECTORY install into DIRECTORY. 11655de1df9Smrg -T report an error if DSTFILE is a directory. 11755de1df9Smrg 11855de1df9SmrgEnvironment variables override the default commands: 11955de1df9Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12055de1df9Smrg RMPROG STRIPPROG 12116e5c272Smrg 12216e5c272SmrgBy default, rm is invoked with -f; when overridden with RMPROG, 12316e5c272Smrgit's up to you to specify -f if you want it. 12416e5c272Smrg 12516e5c272SmrgIf -S is not specified, no backups are attempted. 12616e5c272Smrg 12716e5c272SmrgEmail bug reports to bug-automake@gnu.org. 12816e5c272SmrgAutomake home page: https://www.gnu.org/software/automake/ 12955de1df9Smrg" 13055de1df9Smrg 13155de1df9Smrgwhile test $# -ne 0; do 13255de1df9Smrg case $1 in 13355de1df9Smrg -c) ;; 13455de1df9Smrg 13555de1df9Smrg -C) copy_on_change=true;; 13655de1df9Smrg 13755de1df9Smrg -d) dir_arg=true;; 13855de1df9Smrg 13955de1df9Smrg -g) chgrpcmd="$chgrpprog $2" 14016e5c272Smrg shift;; 14155de1df9Smrg 14255de1df9Smrg --help) echo "$usage"; exit $?;; 14355de1df9Smrg 14455de1df9Smrg -m) mode=$2 14516e5c272Smrg case $mode in 14616e5c272Smrg *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 14716e5c272Smrg echo "$0: invalid mode: $mode" >&2 14816e5c272Smrg exit 1;; 14916e5c272Smrg esac 15016e5c272Smrg shift;; 15155de1df9Smrg 15255de1df9Smrg -o) chowncmd="$chownprog $2" 15316e5c272Smrg shift;; 15416e5c272Smrg 15516e5c272Smrg -p) cpprog="$cpprog -p";; 15655de1df9Smrg 15755de1df9Smrg -s) stripcmd=$stripprog;; 15855de1df9Smrg 15916e5c272Smrg -S) backupsuffix="$2" 16016e5c272Smrg shift;; 16116e5c272Smrg 16216e5c272Smrg -t) 16316e5c272Smrg is_target_a_directory=always 16416e5c272Smrg dst_arg=$2 16516e5c272Smrg # Protect names problematic for 'test' and other utilities. 16616e5c272Smrg case $dst_arg in 16716e5c272Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 16816e5c272Smrg esac 16916e5c272Smrg shift;; 17055de1df9Smrg 17116e5c272Smrg -T) is_target_a_directory=never;; 17255de1df9Smrg 17355de1df9Smrg --version) echo "$0 $scriptversion"; exit $?;; 17455de1df9Smrg 17516e5c272Smrg --) shift 17616e5c272Smrg break;; 17755de1df9Smrg 17816e5c272Smrg -*) echo "$0: invalid option: $1" >&2 17916e5c272Smrg exit 1;; 18055de1df9Smrg 18155de1df9Smrg *) break;; 18255de1df9Smrg esac 18355de1df9Smrg shift 18455de1df9Smrgdone 18555de1df9Smrg 18616e5c272Smrg# We allow the use of options -d and -T together, by making -d 18716e5c272Smrg# take the precedence; this is for compatibility with GNU install. 18816e5c272Smrg 18916e5c272Smrgif test -n "$dir_arg"; then 19016e5c272Smrg if test -n "$dst_arg"; then 19116e5c272Smrg echo "$0: target directory not allowed when installing a directory." >&2 19216e5c272Smrg exit 1 19316e5c272Smrg fi 19416e5c272Smrgfi 19516e5c272Smrg 19655de1df9Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 19755de1df9Smrg # When -d is used, all remaining arguments are directories to create. 19855de1df9Smrg # When -t is used, the destination is already specified. 19955de1df9Smrg # Otherwise, the last argument is the destination. Remove it from $@. 20055de1df9Smrg for arg 20155de1df9Smrg do 20255de1df9Smrg if test -n "$dst_arg"; then 20355de1df9Smrg # $@ is not empty: it contains at least $arg. 20455de1df9Smrg set fnord "$@" "$dst_arg" 20555de1df9Smrg shift # fnord 20655de1df9Smrg fi 20755de1df9Smrg shift # arg 20855de1df9Smrg dst_arg=$arg 20916e5c272Smrg # Protect names problematic for 'test' and other utilities. 21016e5c272Smrg case $dst_arg in 21116e5c272Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 21216e5c272Smrg esac 21355de1df9Smrg done 21455de1df9Smrgfi 21555de1df9Smrg 21655de1df9Smrgif test $# -eq 0; then 21755de1df9Smrg if test -z "$dir_arg"; then 21855de1df9Smrg echo "$0: no input file specified." >&2 21955de1df9Smrg exit 1 22055de1df9Smrg fi 22116e5c272Smrg # It's OK to call 'install-sh -d' without argument. 22255de1df9Smrg # This can happen when creating conditional directories. 22355de1df9Smrg exit 0 22455de1df9Smrgfi 22555de1df9Smrg 22655de1df9Smrgif test -z "$dir_arg"; then 22716e5c272Smrg if test $# -gt 1 || test "$is_target_a_directory" = always; then 22816e5c272Smrg if test ! -d "$dst_arg"; then 22916e5c272Smrg echo "$0: $dst_arg: Is not a directory." >&2 23016e5c272Smrg exit 1 23116e5c272Smrg fi 23216e5c272Smrg fi 23316e5c272Smrgfi 23416e5c272Smrg 23516e5c272Smrgif test -z "$dir_arg"; then 23616e5c272Smrg do_exit='(exit $ret); exit $ret' 23716e5c272Smrg trap "ret=129; $do_exit" 1 23816e5c272Smrg trap "ret=130; $do_exit" 2 23916e5c272Smrg trap "ret=141; $do_exit" 13 24016e5c272Smrg trap "ret=143; $do_exit" 15 24155de1df9Smrg 24255de1df9Smrg # Set umask so as not to create temps with too-generous modes. 24355de1df9Smrg # However, 'strip' requires both read and write access to temps. 24455de1df9Smrg case $mode in 24555de1df9Smrg # Optimize common cases. 24655de1df9Smrg *644) cp_umask=133;; 24755de1df9Smrg *755) cp_umask=22;; 24855de1df9Smrg 24955de1df9Smrg *[0-7]) 25055de1df9Smrg if test -z "$stripcmd"; then 25116e5c272Smrg u_plus_rw= 25255de1df9Smrg else 25316e5c272Smrg u_plus_rw='% 200' 25455de1df9Smrg fi 25555de1df9Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 25655de1df9Smrg *) 25755de1df9Smrg if test -z "$stripcmd"; then 25816e5c272Smrg u_plus_rw= 25955de1df9Smrg else 26016e5c272Smrg u_plus_rw=,u+rw 26155de1df9Smrg fi 26255de1df9Smrg cp_umask=$mode$u_plus_rw;; 26355de1df9Smrg esac 26455de1df9Smrgfi 26555de1df9Smrg 26655de1df9Smrgfor src 26755de1df9Smrgdo 26816e5c272Smrg # Protect names problematic for 'test' and other utilities. 26955de1df9Smrg case $src in 27016e5c272Smrg -* | [=\(\)!]) src=./$src;; 27155de1df9Smrg esac 27255de1df9Smrg 27355de1df9Smrg if test -n "$dir_arg"; then 27455de1df9Smrg dst=$src 27555de1df9Smrg dstdir=$dst 27655de1df9Smrg test -d "$dstdir" 27755de1df9Smrg dstdir_status=$? 27816e5c272Smrg # Don't chown directories that already exist. 27916e5c272Smrg if test $dstdir_status = 0; then 28016e5c272Smrg chowncmd="" 28116e5c272Smrg fi 28255de1df9Smrg else 28355de1df9Smrg 28455de1df9Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 28555de1df9Smrg # might cause directories to be created, which would be especially bad 28655de1df9Smrg # if $src (and thus $dsttmp) contains '*'. 28755de1df9Smrg if test ! -f "$src" && test ! -d "$src"; then 28855de1df9Smrg echo "$0: $src does not exist." >&2 28955de1df9Smrg exit 1 29055de1df9Smrg fi 29155de1df9Smrg 29255de1df9Smrg if test -z "$dst_arg"; then 29355de1df9Smrg echo "$0: no destination specified." >&2 29455de1df9Smrg exit 1 29555de1df9Smrg fi 29655de1df9Smrg dst=$dst_arg 29755de1df9Smrg 29816e5c272Smrg # If destination is a directory, append the input filename. 29955de1df9Smrg if test -d "$dst"; then 30016e5c272Smrg if test "$is_target_a_directory" = never; then 30116e5c272Smrg echo "$0: $dst_arg: Is a directory" >&2 30216e5c272Smrg exit 1 30355de1df9Smrg fi 30455de1df9Smrg dstdir=$dst 30516e5c272Smrg dstbase=`basename "$src"` 30616e5c272Smrg case $dst in 30716e5c272Smrg */) dst=$dst$dstbase;; 30816e5c272Smrg *) dst=$dst/$dstbase;; 30916e5c272Smrg esac 31055de1df9Smrg dstdir_status=0 31155de1df9Smrg else 31216e5c272Smrg dstdir=`dirname "$dst"` 31355de1df9Smrg test -d "$dstdir" 31455de1df9Smrg dstdir_status=$? 31555de1df9Smrg fi 31655de1df9Smrg fi 31755de1df9Smrg 31816e5c272Smrg case $dstdir in 31916e5c272Smrg */) dstdirslash=$dstdir;; 32016e5c272Smrg *) dstdirslash=$dstdir/;; 32116e5c272Smrg esac 32216e5c272Smrg 32355de1df9Smrg obsolete_mkdir_used=false 32455de1df9Smrg 32555de1df9Smrg if test $dstdir_status != 0; then 32655de1df9Smrg case $posix_mkdir in 32755de1df9Smrg '') 32816e5c272Smrg # With -d, create the new directory with the user-specified mode. 32916e5c272Smrg # Otherwise, rely on $mkdir_umask. 33016e5c272Smrg if test -n "$dir_arg"; then 33116e5c272Smrg mkdir_mode=-m$mode 33216e5c272Smrg else 33316e5c272Smrg mkdir_mode= 33416e5c272Smrg fi 33516e5c272Smrg 33616e5c272Smrg posix_mkdir=false 33716e5c272Smrg # The $RANDOM variable is not portable (e.g., dash). Use it 33816e5c272Smrg # here however when possible just to lower collision chance. 33916e5c272Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34016e5c272Smrg 34116e5c272Smrg trap ' 34216e5c272Smrg ret=$? 34316e5c272Smrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null 34416e5c272Smrg exit $ret 34516e5c272Smrg ' 0 34616e5c272Smrg 34716e5c272Smrg # Because "mkdir -p" follows existing symlinks and we likely work 34816e5c272Smrg # directly in world-writeable /tmp, make sure that the '$tmpdir' 34916e5c272Smrg # directory is successfully created first before we actually test 35016e5c272Smrg # 'mkdir -p'. 35116e5c272Smrg if (umask $mkdir_umask && 35216e5c272Smrg $mkdirprog $mkdir_mode "$tmpdir" && 35316e5c272Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 35416e5c272Smrg then 35516e5c272Smrg if test -z "$dir_arg" || { 35616e5c272Smrg # Check for POSIX incompatibilities with -m. 35716e5c272Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35816e5c272Smrg # other-writable bit of parent directory when it shouldn't. 35916e5c272Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 36016e5c272Smrg test_tmpdir="$tmpdir/a" 36116e5c272Smrg ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 36216e5c272Smrg case $ls_ld_tmpdir in 36316e5c272Smrg d????-?r-*) different_mode=700;; 36416e5c272Smrg d????-?--*) different_mode=755;; 36516e5c272Smrg *) false;; 36616e5c272Smrg esac && 36716e5c272Smrg $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 36816e5c272Smrg ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 36916e5c272Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 37016e5c272Smrg } 37116e5c272Smrg } 37216e5c272Smrg then posix_mkdir=: 37316e5c272Smrg fi 37416e5c272Smrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 37555de1df9Smrg else 37616e5c272Smrg # Remove any dirs left behind by ancient mkdir implementations. 37716e5c272Smrg rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 37855de1df9Smrg fi 37916e5c272Smrg trap '' 0;; 38055de1df9Smrg esac 38155de1df9Smrg 38255de1df9Smrg if 38355de1df9Smrg $posix_mkdir && ( 38416e5c272Smrg umask $mkdir_umask && 38516e5c272Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38655de1df9Smrg ) 38755de1df9Smrg then : 38855de1df9Smrg else 38955de1df9Smrg 39016e5c272Smrg # mkdir does not conform to POSIX, 39155de1df9Smrg # or it failed possibly due to a race condition. Create the 39255de1df9Smrg # directory the slow way, step by step, checking for races as we go. 39355de1df9Smrg 39455de1df9Smrg case $dstdir in 39516e5c272Smrg /*) prefix='/';; 39616e5c272Smrg [-=\(\)!]*) prefix='./';; 39716e5c272Smrg *) prefix='';; 39855de1df9Smrg esac 39955de1df9Smrg 40055de1df9Smrg oIFS=$IFS 40155de1df9Smrg IFS=/ 40216e5c272Smrg set -f 40355de1df9Smrg set fnord $dstdir 40455de1df9Smrg shift 40516e5c272Smrg set +f 40655de1df9Smrg IFS=$oIFS 40755de1df9Smrg 40855de1df9Smrg prefixes= 40955de1df9Smrg 41055de1df9Smrg for d 41155de1df9Smrg do 41216e5c272Smrg test X"$d" = X && continue 41316e5c272Smrg 41416e5c272Smrg prefix=$prefix$d 41516e5c272Smrg if test -d "$prefix"; then 41616e5c272Smrg prefixes= 41716e5c272Smrg else 41816e5c272Smrg if $posix_mkdir; then 41916e5c272Smrg (umask $mkdir_umask && 42016e5c272Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 42116e5c272Smrg # Don't fail if two instances are running concurrently. 42216e5c272Smrg test -d "$prefix" || exit 1 42316e5c272Smrg else 42416e5c272Smrg case $prefix in 42516e5c272Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42616e5c272Smrg *) qprefix=$prefix;; 42716e5c272Smrg esac 42816e5c272Smrg prefixes="$prefixes '$qprefix'" 42916e5c272Smrg fi 43016e5c272Smrg fi 43116e5c272Smrg prefix=$prefix/ 43255de1df9Smrg done 43355de1df9Smrg 43455de1df9Smrg if test -n "$prefixes"; then 43516e5c272Smrg # Don't fail if two instances are running concurrently. 43616e5c272Smrg (umask $mkdir_umask && 43716e5c272Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 43816e5c272Smrg test -d "$dstdir" || exit 1 43916e5c272Smrg obsolete_mkdir_used=true 44055de1df9Smrg fi 44155de1df9Smrg fi 44255de1df9Smrg fi 44355de1df9Smrg 44455de1df9Smrg if test -n "$dir_arg"; then 44555de1df9Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44655de1df9Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44755de1df9Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44855de1df9Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44955de1df9Smrg else 45055de1df9Smrg 45155de1df9Smrg # Make a couple of temp file names in the proper directory. 45216e5c272Smrg dsttmp=${dstdirslash}_inst.$$_ 45316e5c272Smrg rmtmp=${dstdirslash}_rm.$$_ 45455de1df9Smrg 45555de1df9Smrg # Trap to clean up those temp files at exit. 45655de1df9Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45755de1df9Smrg 45855de1df9Smrg # Copy the file name to the temp name. 45916e5c272Smrg (umask $cp_umask && 46016e5c272Smrg { test -z "$stripcmd" || { 46116e5c272Smrg # Create $dsttmp read-write so that cp doesn't create it read-only, 46216e5c272Smrg # which would cause strip to fail. 46316e5c272Smrg if test -z "$doit"; then 46416e5c272Smrg : >"$dsttmp" # No need to fork-exec 'touch'. 46516e5c272Smrg else 46616e5c272Smrg $doit touch "$dsttmp" 46716e5c272Smrg fi 46816e5c272Smrg } 46916e5c272Smrg } && 47016e5c272Smrg $doit_exec $cpprog "$src" "$dsttmp") && 47155de1df9Smrg 47255de1df9Smrg # and set any options; do chmod last to preserve setuid bits. 47355de1df9Smrg # 47455de1df9Smrg # If any of these fail, we abort the whole thing. If we want to 47555de1df9Smrg # ignore errors from any of these, just make sure not to ignore 47655de1df9Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 47755de1df9Smrg # 47855de1df9Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 47955de1df9Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 48055de1df9Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 48155de1df9Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 48255de1df9Smrg 48355de1df9Smrg # If -C, don't bother to copy if it wouldn't change the file. 48455de1df9Smrg if $copy_on_change && 48516e5c272Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 48616e5c272Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 48716e5c272Smrg set -f && 48855de1df9Smrg set X $old && old=:$2:$4:$5:$6 && 48955de1df9Smrg set X $new && new=:$2:$4:$5:$6 && 49016e5c272Smrg set +f && 49155de1df9Smrg test "$old" = "$new" && 49255de1df9Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 49355de1df9Smrg then 49455de1df9Smrg rm -f "$dsttmp" 49555de1df9Smrg else 49616e5c272Smrg # If $backupsuffix is set, and the file being installed 49716e5c272Smrg # already exists, attempt a backup. Don't worry if it fails, 49816e5c272Smrg # e.g., if mv doesn't support -f. 49916e5c272Smrg if test -n "$backupsuffix" && test -f "$dst"; then 50016e5c272Smrg $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null 50116e5c272Smrg fi 50216e5c272Smrg 50355de1df9Smrg # Rename the file to the real destination. 50455de1df9Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 50555de1df9Smrg 50655de1df9Smrg # The rename failed, perhaps because mv can't rename something else 50755de1df9Smrg # to itself, or perhaps because mv is so ancient that it does not 50855de1df9Smrg # support -f. 50955de1df9Smrg { 51016e5c272Smrg # Now remove or move aside any old file at destination location. 51116e5c272Smrg # We try this two ways since rm can't unlink itself on some 51216e5c272Smrg # systems and the destination file might be busy for other 51316e5c272Smrg # reasons. In this case, the final cleanup might fail but the new 51416e5c272Smrg # file should still install successfully. 51516e5c272Smrg { 51616e5c272Smrg test ! -f "$dst" || 51716e5c272Smrg $doit $rmcmd "$dst" 2>/dev/null || 51816e5c272Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 51916e5c272Smrg { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } 52016e5c272Smrg } || 52116e5c272Smrg { echo "$0: cannot unlink or rename $dst" >&2 52216e5c272Smrg (exit 1); exit 1 52316e5c272Smrg } 52416e5c272Smrg } && 52516e5c272Smrg 52616e5c272Smrg # Now rename the file to the real destination. 52716e5c272Smrg $doit $mvcmd "$dsttmp" "$dst" 52855de1df9Smrg } 52955de1df9Smrg fi || exit 1 53055de1df9Smrg 53155de1df9Smrg trap '' 0 53255de1df9Smrg fi 53355de1df9Smrgdone 53455de1df9Smrg 53555de1df9Smrg# Local variables: 53616e5c272Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 53755de1df9Smrg# time-stamp-start: "scriptversion=" 53855de1df9Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 53916e5c272Smrg# time-stamp-time-zone: "UTC0" 54055de1df9Smrg# time-stamp-end: "; # UTC" 54155de1df9Smrg# End: 542