14ecf19b2Smrg#!/bin/sh 24ecf19b2Smrg# install - install a program, script, or datafile 332034fa5Smrg 4ef516338Smrgscriptversion=2020-11-14.01; # UTC 532034fa5Smrg 64ecf19b2Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 74ecf19b2Smrg# later released in X11R6 (xc/config/util/install.sh) with the 84ecf19b2Smrg# following copyright and license. 94ecf19b2Smrg# 104ecf19b2Smrg# Copyright (C) 1994 X Consortium 114ecf19b2Smrg# 124ecf19b2Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 134ecf19b2Smrg# of this software and associated documentation files (the "Software"), to 144ecf19b2Smrg# deal in the Software without restriction, including without limitation the 154ecf19b2Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 164ecf19b2Smrg# sell copies of the Software, and to permit persons to whom the Software is 174ecf19b2Smrg# furnished to do so, subject to the following conditions: 184ecf19b2Smrg# 194ecf19b2Smrg# The above copyright notice and this permission notice shall be included in 204ecf19b2Smrg# all copies or substantial portions of the Software. 214ecf19b2Smrg# 224ecf19b2Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 234ecf19b2Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 244ecf19b2Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 254ecf19b2Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 264ecf19b2Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 274ecf19b2Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 284ecf19b2Smrg# 294ecf19b2Smrg# Except as contained in this notice, the name of the X Consortium shall not 304ecf19b2Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 314ecf19b2Smrg# ings in this Software without prior written authorization from the X Consor- 324ecf19b2Smrg# tium. 334ecf19b2Smrg# 344ecf19b2Smrg# 354ecf19b2Smrg# FSF changes to this file are in the public domain. 364ecf19b2Smrg# 374ecf19b2Smrg# Calling this script install-sh is preferred over install.sh, to prevent 38ef516338Smrg# 'make' implicit rules from creating a file called install from it 394ecf19b2Smrg# when there is no Makefile. 404ecf19b2Smrg# 414ecf19b2Smrg# This script is compatible with the BSD install script, but was written 4232034fa5Smrg# from scratch. 434ecf19b2Smrg 44ef516338Smrgtab=' ' 4532034fa5Smrgnl=' 4632034fa5Smrg' 47ef516338SmrgIFS=" $tab$nl" 484ecf19b2Smrg 49ef516338Smrg# Set DOITPROG to "echo" to test this script. 504ecf19b2Smrg 5132034fa5Smrgdoit=${DOITPROG-} 52ef516338Smrgdoit_exec=${doit:-exec} 534ecf19b2Smrg 5432034fa5Smrg# Put in absolute file names if you don't have them in your path; 5532034fa5Smrg# or use environment vars. 5632034fa5Smrg 5732034fa5Smrgchgrpprog=${CHGRPPROG-chgrp} 5832034fa5Smrgchmodprog=${CHMODPROG-chmod} 5932034fa5Smrgchownprog=${CHOWNPROG-chown} 6032034fa5Smrgcmpprog=${CMPPROG-cmp} 6132034fa5Smrgcpprog=${CPPROG-cp} 6232034fa5Smrgmkdirprog=${MKDIRPROG-mkdir} 6332034fa5Smrgmvprog=${MVPROG-mv} 6432034fa5Smrgrmprog=${RMPROG-rm} 6532034fa5Smrgstripprog=${STRIPPROG-strip} 6632034fa5Smrg 6732034fa5Smrgposix_mkdir= 6832034fa5Smrg 6932034fa5Smrg# Desired mode of installed file. 7032034fa5Smrgmode=0755 7132034fa5Smrg 72ef516338Smrg# Create dirs (including intermediate dirs) using mode 755. 73ef516338Smrg# This is like GNU 'install' as of coreutils 8.32 (2020). 74ef516338Smrgmkdir_umask=22 75ef516338Smrg 76ef516338Smrgbackupsuffix= 7732034fa5Smrgchgrpcmd= 7832034fa5Smrgchmodcmd=$chmodprog 7932034fa5Smrgchowncmd= 8032034fa5Smrgmvcmd=$mvprog 8132034fa5Smrgrmcmd="$rmprog -f" 8232034fa5Smrgstripcmd= 834ecf19b2Smrg 8432034fa5Smrgsrc= 8532034fa5Smrgdst= 8632034fa5Smrgdir_arg= 8732034fa5Smrgdst_arg= 884ecf19b2Smrg 8932034fa5Smrgcopy_on_change=false 90ef516338Smrgis_target_a_directory=possibly 914ecf19b2Smrg 9232034fa5Smrgusage="\ 9332034fa5SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 9432034fa5Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 9532034fa5Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 9632034fa5Smrg or: $0 [OPTION]... -d DIRECTORIES... 974ecf19b2Smrg 9832034fa5SmrgIn the 1st form, copy SRCFILE to DSTFILE. 9932034fa5SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 10032034fa5SmrgIn the 4th, create DIRECTORIES. 1014ecf19b2Smrg 10232034fa5SmrgOptions: 10332034fa5Smrg --help display this help and exit. 10432034fa5Smrg --version display version info and exit. 1054ecf19b2Smrg 10632034fa5Smrg -c (ignored) 107ef516338Smrg -C install only if different (preserve data modification time) 10832034fa5Smrg -d create directories instead of installing files. 10932034fa5Smrg -g GROUP $chgrpprog installed files to GROUP. 11032034fa5Smrg -m MODE $chmodprog installed files to MODE. 11132034fa5Smrg -o USER $chownprog installed files to USER. 112ef516338Smrg -p pass -p to $cpprog. 11332034fa5Smrg -s $stripprog installed files. 114ef516338Smrg -S SUFFIX attempt to back up existing files, with suffix SUFFIX. 11532034fa5Smrg -t DIRECTORY install into DIRECTORY. 11632034fa5Smrg -T report an error if DSTFILE is a directory. 1174ecf19b2Smrg 11832034fa5SmrgEnvironment variables override the default commands: 11932034fa5Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12032034fa5Smrg RMPROG STRIPPROG 121ef516338Smrg 122ef516338SmrgBy default, rm is invoked with -f; when overridden with RMPROG, 123ef516338Smrgit's up to you to specify -f if you want it. 124ef516338Smrg 125ef516338SmrgIf -S is not specified, no backups are attempted. 126ef516338Smrg 127ef516338SmrgEmail bug reports to bug-automake@gnu.org. 128ef516338SmrgAutomake home page: https://www.gnu.org/software/automake/ 12932034fa5Smrg" 1304ecf19b2Smrg 13132034fa5Smrgwhile test $# -ne 0; do 13232034fa5Smrg case $1 in 13332034fa5Smrg -c) ;; 1344ecf19b2Smrg 13532034fa5Smrg -C) copy_on_change=true;; 1364ecf19b2Smrg 13732034fa5Smrg -d) dir_arg=true;; 1384ecf19b2Smrg 13932034fa5Smrg -g) chgrpcmd="$chgrpprog $2" 140ef516338Smrg shift;; 1414ecf19b2Smrg 14232034fa5Smrg --help) echo "$usage"; exit $?;; 1434ecf19b2Smrg 14432034fa5Smrg -m) mode=$2 145ef516338Smrg case $mode in 146ef516338Smrg *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 147ef516338Smrg echo "$0: invalid mode: $mode" >&2 148ef516338Smrg exit 1;; 149ef516338Smrg esac 150ef516338Smrg shift;; 1514ecf19b2Smrg 15232034fa5Smrg -o) chowncmd="$chownprog $2" 153ef516338Smrg shift;; 154ef516338Smrg 155ef516338Smrg -p) cpprog="$cpprog -p";; 1564ecf19b2Smrg 15732034fa5Smrg -s) stripcmd=$stripprog;; 1584ecf19b2Smrg 159ef516338Smrg -S) backupsuffix="$2" 160ef516338Smrg shift;; 161ef516338Smrg 162ef516338Smrg -t) 163ef516338Smrg is_target_a_directory=always 164ef516338Smrg dst_arg=$2 165ef516338Smrg # Protect names problematic for 'test' and other utilities. 166ef516338Smrg case $dst_arg in 167ef516338Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 168ef516338Smrg esac 169ef516338Smrg shift;; 1704ecf19b2Smrg 171ef516338Smrg -T) is_target_a_directory=never;; 1724ecf19b2Smrg 17332034fa5Smrg --version) echo "$0 $scriptversion"; exit $?;; 1744ecf19b2Smrg 175ef516338Smrg --) shift 176ef516338Smrg break;; 1774ecf19b2Smrg 178ef516338Smrg -*) echo "$0: invalid option: $1" >&2 179ef516338Smrg exit 1;; 1804ecf19b2Smrg 18132034fa5Smrg *) break;; 18232034fa5Smrg esac 18332034fa5Smrg shift 18432034fa5Smrgdone 1854ecf19b2Smrg 186ef516338Smrg# We allow the use of options -d and -T together, by making -d 187ef516338Smrg# take the precedence; this is for compatibility with GNU install. 188ef516338Smrg 189ef516338Smrgif test -n "$dir_arg"; then 190ef516338Smrg if test -n "$dst_arg"; then 191ef516338Smrg echo "$0: target directory not allowed when installing a directory." >&2 192ef516338Smrg exit 1 193ef516338Smrg fi 194ef516338Smrgfi 195ef516338Smrg 19632034fa5Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 19732034fa5Smrg # When -d is used, all remaining arguments are directories to create. 19832034fa5Smrg # When -t is used, the destination is already specified. 19932034fa5Smrg # Otherwise, the last argument is the destination. Remove it from $@. 20032034fa5Smrg for arg 20132034fa5Smrg do 20232034fa5Smrg if test -n "$dst_arg"; then 20332034fa5Smrg # $@ is not empty: it contains at least $arg. 20432034fa5Smrg set fnord "$@" "$dst_arg" 20532034fa5Smrg shift # fnord 20632034fa5Smrg fi 20732034fa5Smrg shift # arg 20832034fa5Smrg dst_arg=$arg 209ef516338Smrg # Protect names problematic for 'test' and other utilities. 210ef516338Smrg case $dst_arg in 211ef516338Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 212ef516338Smrg esac 21332034fa5Smrg done 21432034fa5Smrgfi 2154ecf19b2Smrg 21632034fa5Smrgif test $# -eq 0; then 21732034fa5Smrg if test -z "$dir_arg"; then 21832034fa5Smrg echo "$0: no input file specified." >&2 21932034fa5Smrg exit 1 22032034fa5Smrg fi 221ef516338Smrg # It's OK to call 'install-sh -d' without argument. 22232034fa5Smrg # This can happen when creating conditional directories. 22332034fa5Smrg exit 0 22432034fa5Smrgfi 2254ecf19b2Smrg 22632034fa5Smrgif test -z "$dir_arg"; then 227ef516338Smrg if test $# -gt 1 || test "$is_target_a_directory" = always; then 228ef516338Smrg if test ! -d "$dst_arg"; then 229ef516338Smrg echo "$0: $dst_arg: Is not a directory." >&2 230ef516338Smrg exit 1 231ef516338Smrg fi 232ef516338Smrg fi 233ef516338Smrgfi 234ef516338Smrg 235ef516338Smrgif test -z "$dir_arg"; then 236ef516338Smrg do_exit='(exit $ret); exit $ret' 237ef516338Smrg trap "ret=129; $do_exit" 1 238ef516338Smrg trap "ret=130; $do_exit" 2 239ef516338Smrg trap "ret=141; $do_exit" 13 240ef516338Smrg trap "ret=143; $do_exit" 15 24132034fa5Smrg 24232034fa5Smrg # Set umask so as not to create temps with too-generous modes. 24332034fa5Smrg # However, 'strip' requires both read and write access to temps. 24432034fa5Smrg case $mode in 24532034fa5Smrg # Optimize common cases. 24632034fa5Smrg *644) cp_umask=133;; 24732034fa5Smrg *755) cp_umask=22;; 24832034fa5Smrg 24932034fa5Smrg *[0-7]) 25032034fa5Smrg if test -z "$stripcmd"; then 251ef516338Smrg u_plus_rw= 25232034fa5Smrg else 253ef516338Smrg u_plus_rw='% 200' 25432034fa5Smrg fi 25532034fa5Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 25632034fa5Smrg *) 25732034fa5Smrg if test -z "$stripcmd"; then 258ef516338Smrg u_plus_rw= 25932034fa5Smrg else 260ef516338Smrg u_plus_rw=,u+rw 26132034fa5Smrg fi 26232034fa5Smrg cp_umask=$mode$u_plus_rw;; 26332034fa5Smrg esac 26432034fa5Smrgfi 2654ecf19b2Smrg 26632034fa5Smrgfor src 26732034fa5Smrgdo 268ef516338Smrg # Protect names problematic for 'test' and other utilities. 26932034fa5Smrg case $src in 270ef516338Smrg -* | [=\(\)!]) src=./$src;; 27132034fa5Smrg esac 27232034fa5Smrg 27332034fa5Smrg if test -n "$dir_arg"; then 27432034fa5Smrg dst=$src 27532034fa5Smrg dstdir=$dst 27632034fa5Smrg test -d "$dstdir" 27732034fa5Smrg dstdir_status=$? 278ef516338Smrg # Don't chown directories that already exist. 279ef516338Smrg if test $dstdir_status = 0; then 280ef516338Smrg chowncmd="" 281ef516338Smrg fi 28232034fa5Smrg else 28332034fa5Smrg 28432034fa5Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 28532034fa5Smrg # might cause directories to be created, which would be especially bad 28632034fa5Smrg # if $src (and thus $dsttmp) contains '*'. 28732034fa5Smrg if test ! -f "$src" && test ! -d "$src"; then 28832034fa5Smrg echo "$0: $src does not exist." >&2 28932034fa5Smrg exit 1 29032034fa5Smrg fi 29132034fa5Smrg 29232034fa5Smrg if test -z "$dst_arg"; then 29332034fa5Smrg echo "$0: no destination specified." >&2 29432034fa5Smrg exit 1 29532034fa5Smrg fi 29632034fa5Smrg dst=$dst_arg 2974ecf19b2Smrg 298ef516338Smrg # If destination is a directory, append the input filename. 29932034fa5Smrg if test -d "$dst"; then 300ef516338Smrg if test "$is_target_a_directory" = never; then 301ef516338Smrg echo "$0: $dst_arg: Is a directory" >&2 302ef516338Smrg exit 1 30332034fa5Smrg fi 30432034fa5Smrg dstdir=$dst 305ef516338Smrg dstbase=`basename "$src"` 306ef516338Smrg case $dst in 307ef516338Smrg */) dst=$dst$dstbase;; 308ef516338Smrg *) dst=$dst/$dstbase;; 309ef516338Smrg esac 31032034fa5Smrg dstdir_status=0 31132034fa5Smrg else 312ef516338Smrg dstdir=`dirname "$dst"` 31332034fa5Smrg test -d "$dstdir" 31432034fa5Smrg dstdir_status=$? 31532034fa5Smrg fi 31632034fa5Smrg fi 31732034fa5Smrg 318ef516338Smrg case $dstdir in 319ef516338Smrg */) dstdirslash=$dstdir;; 320ef516338Smrg *) dstdirslash=$dstdir/;; 321ef516338Smrg esac 322ef516338Smrg 32332034fa5Smrg obsolete_mkdir_used=false 32432034fa5Smrg 32532034fa5Smrg if test $dstdir_status != 0; then 32632034fa5Smrg case $posix_mkdir in 32732034fa5Smrg '') 328ef516338Smrg # With -d, create the new directory with the user-specified mode. 329ef516338Smrg # Otherwise, rely on $mkdir_umask. 330ef516338Smrg if test -n "$dir_arg"; then 331ef516338Smrg mkdir_mode=-m$mode 332ef516338Smrg else 333ef516338Smrg mkdir_mode= 334ef516338Smrg fi 335ef516338Smrg 336ef516338Smrg posix_mkdir=false 337ef516338Smrg # The $RANDOM variable is not portable (e.g., dash). Use it 338ef516338Smrg # here however when possible just to lower collision chance. 339ef516338Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 340ef516338Smrg 341ef516338Smrg trap ' 342ef516338Smrg ret=$? 343ef516338Smrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null 344ef516338Smrg exit $ret 345ef516338Smrg ' 0 346ef516338Smrg 347ef516338Smrg # Because "mkdir -p" follows existing symlinks and we likely work 348ef516338Smrg # directly in world-writeable /tmp, make sure that the '$tmpdir' 349ef516338Smrg # directory is successfully created first before we actually test 350ef516338Smrg # 'mkdir -p'. 351ef516338Smrg if (umask $mkdir_umask && 352ef516338Smrg $mkdirprog $mkdir_mode "$tmpdir" && 353ef516338Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 354ef516338Smrg then 355ef516338Smrg if test -z "$dir_arg" || { 356ef516338Smrg # Check for POSIX incompatibilities with -m. 357ef516338Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 358ef516338Smrg # other-writable bit of parent directory when it shouldn't. 359ef516338Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 360ef516338Smrg test_tmpdir="$tmpdir/a" 361ef516338Smrg ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 362ef516338Smrg case $ls_ld_tmpdir in 363ef516338Smrg d????-?r-*) different_mode=700;; 364ef516338Smrg d????-?--*) different_mode=755;; 365ef516338Smrg *) false;; 366ef516338Smrg esac && 367ef516338Smrg $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 368ef516338Smrg ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 369ef516338Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 370ef516338Smrg } 371ef516338Smrg } 372ef516338Smrg then posix_mkdir=: 373ef516338Smrg fi 374ef516338Smrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 3754ecf19b2Smrg else 376ef516338Smrg # Remove any dirs left behind by ancient mkdir implementations. 377ef516338Smrg rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 3784ecf19b2Smrg fi 379ef516338Smrg trap '' 0;; 38032034fa5Smrg esac 3814ecf19b2Smrg 38232034fa5Smrg if 38332034fa5Smrg $posix_mkdir && ( 384ef516338Smrg umask $mkdir_umask && 385ef516338Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38632034fa5Smrg ) 38732034fa5Smrg then : 38832034fa5Smrg else 38932034fa5Smrg 390ef516338Smrg # mkdir does not conform to POSIX, 39132034fa5Smrg # or it failed possibly due to a race condition. Create the 39232034fa5Smrg # directory the slow way, step by step, checking for races as we go. 39332034fa5Smrg 39432034fa5Smrg case $dstdir in 395ef516338Smrg /*) prefix='/';; 396ef516338Smrg [-=\(\)!]*) prefix='./';; 397ef516338Smrg *) prefix='';; 39832034fa5Smrg esac 39932034fa5Smrg 40032034fa5Smrg oIFS=$IFS 40132034fa5Smrg IFS=/ 402ef516338Smrg set -f 40332034fa5Smrg set fnord $dstdir 40432034fa5Smrg shift 405ef516338Smrg set +f 40632034fa5Smrg IFS=$oIFS 40732034fa5Smrg 40832034fa5Smrg prefixes= 40932034fa5Smrg 41032034fa5Smrg for d 41132034fa5Smrg do 412ef516338Smrg test X"$d" = X && continue 413ef516338Smrg 414ef516338Smrg prefix=$prefix$d 415ef516338Smrg if test -d "$prefix"; then 416ef516338Smrg prefixes= 417ef516338Smrg else 418ef516338Smrg if $posix_mkdir; then 419ef516338Smrg (umask $mkdir_umask && 420ef516338Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 421ef516338Smrg # Don't fail if two instances are running concurrently. 422ef516338Smrg test -d "$prefix" || exit 1 423ef516338Smrg else 424ef516338Smrg case $prefix in 425ef516338Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 426ef516338Smrg *) qprefix=$prefix;; 427ef516338Smrg esac 428ef516338Smrg prefixes="$prefixes '$qprefix'" 429ef516338Smrg fi 430ef516338Smrg fi 431ef516338Smrg prefix=$prefix/ 43232034fa5Smrg done 43332034fa5Smrg 43432034fa5Smrg if test -n "$prefixes"; then 435ef516338Smrg # Don't fail if two instances are running concurrently. 436ef516338Smrg (umask $mkdir_umask && 437ef516338Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 438ef516338Smrg test -d "$dstdir" || exit 1 439ef516338Smrg obsolete_mkdir_used=true 44032034fa5Smrg fi 44132034fa5Smrg fi 44232034fa5Smrg fi 44332034fa5Smrg 44432034fa5Smrg if test -n "$dir_arg"; then 44532034fa5Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44632034fa5Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44732034fa5Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44832034fa5Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44932034fa5Smrg else 45032034fa5Smrg 45132034fa5Smrg # Make a couple of temp file names in the proper directory. 452ef516338Smrg dsttmp=${dstdirslash}_inst.$$_ 453ef516338Smrg rmtmp=${dstdirslash}_rm.$$_ 45432034fa5Smrg 45532034fa5Smrg # Trap to clean up those temp files at exit. 45632034fa5Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45732034fa5Smrg 45832034fa5Smrg # Copy the file name to the temp name. 459ef516338Smrg (umask $cp_umask && 460ef516338Smrg { test -z "$stripcmd" || { 461ef516338Smrg # Create $dsttmp read-write so that cp doesn't create it read-only, 462ef516338Smrg # which would cause strip to fail. 463ef516338Smrg if test -z "$doit"; then 464ef516338Smrg : >"$dsttmp" # No need to fork-exec 'touch'. 465ef516338Smrg else 466ef516338Smrg $doit touch "$dsttmp" 467ef516338Smrg fi 468ef516338Smrg } 469ef516338Smrg } && 470ef516338Smrg $doit_exec $cpprog "$src" "$dsttmp") && 47132034fa5Smrg 47232034fa5Smrg # and set any options; do chmod last to preserve setuid bits. 47332034fa5Smrg # 47432034fa5Smrg # If any of these fail, we abort the whole thing. If we want to 47532034fa5Smrg # ignore errors from any of these, just make sure not to ignore 47632034fa5Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 47732034fa5Smrg # 47832034fa5Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 47932034fa5Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 48032034fa5Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 48132034fa5Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 48232034fa5Smrg 48332034fa5Smrg # If -C, don't bother to copy if it wouldn't change the file. 48432034fa5Smrg if $copy_on_change && 485ef516338Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 486ef516338Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 487ef516338Smrg set -f && 48832034fa5Smrg set X $old && old=:$2:$4:$5:$6 && 48932034fa5Smrg set X $new && new=:$2:$4:$5:$6 && 490ef516338Smrg set +f && 49132034fa5Smrg test "$old" = "$new" && 49232034fa5Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 49332034fa5Smrg then 49432034fa5Smrg rm -f "$dsttmp" 49532034fa5Smrg else 496ef516338Smrg # If $backupsuffix is set, and the file being installed 497ef516338Smrg # already exists, attempt a backup. Don't worry if it fails, 498ef516338Smrg # e.g., if mv doesn't support -f. 499ef516338Smrg if test -n "$backupsuffix" && test -f "$dst"; then 500ef516338Smrg $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null 501ef516338Smrg fi 502ef516338Smrg 50332034fa5Smrg # Rename the file to the real destination. 50432034fa5Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 50532034fa5Smrg 50632034fa5Smrg # The rename failed, perhaps because mv can't rename something else 50732034fa5Smrg # to itself, or perhaps because mv is so ancient that it does not 50832034fa5Smrg # support -f. 50932034fa5Smrg { 510ef516338Smrg # Now remove or move aside any old file at destination location. 511ef516338Smrg # We try this two ways since rm can't unlink itself on some 512ef516338Smrg # systems and the destination file might be busy for other 513ef516338Smrg # reasons. In this case, the final cleanup might fail but the new 514ef516338Smrg # file should still install successfully. 515ef516338Smrg { 516ef516338Smrg test ! -f "$dst" || 517ef516338Smrg $doit $rmcmd "$dst" 2>/dev/null || 518ef516338Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 519ef516338Smrg { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } 520ef516338Smrg } || 521ef516338Smrg { echo "$0: cannot unlink or rename $dst" >&2 522ef516338Smrg (exit 1); exit 1 523ef516338Smrg } 524ef516338Smrg } && 525ef516338Smrg 526ef516338Smrg # Now rename the file to the real destination. 527ef516338Smrg $doit $mvcmd "$dsttmp" "$dst" 52832034fa5Smrg } 52932034fa5Smrg fi || exit 1 53032034fa5Smrg 53132034fa5Smrg trap '' 0 53232034fa5Smrg fi 53332034fa5Smrgdone 5344ecf19b2Smrg 53532034fa5Smrg# Local variables: 536ef516338Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 53732034fa5Smrg# time-stamp-start: "scriptversion=" 53832034fa5Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 539ef516338Smrg# time-stamp-time-zone: "UTC0" 54032034fa5Smrg# time-stamp-end: "; # UTC" 54132034fa5Smrg# End: 542