install-sh revision 2b2b4fcb
1ab47cfaaSmrg#!/bin/sh 2ab47cfaaSmrg# install - install a program, script, or datafile 3ab47cfaaSmrg 42b2b4fcbSmrgscriptversion=2020-11-14.01; # UTC 5ab47cfaaSmrg 6ab47cfaaSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 7ab47cfaaSmrg# later released in X11R6 (xc/config/util/install.sh) with the 8ab47cfaaSmrg# following copyright and license. 9ab47cfaaSmrg# 10ab47cfaaSmrg# Copyright (C) 1994 X Consortium 11ab47cfaaSmrg# 12ab47cfaaSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 13ab47cfaaSmrg# of this software and associated documentation files (the "Software"), to 14ab47cfaaSmrg# deal in the Software without restriction, including without limitation the 15ab47cfaaSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16ab47cfaaSmrg# sell copies of the Software, and to permit persons to whom the Software is 17ab47cfaaSmrg# furnished to do so, subject to the following conditions: 18ab47cfaaSmrg# 19ab47cfaaSmrg# The above copyright notice and this permission notice shall be included in 20ab47cfaaSmrg# all copies or substantial portions of the Software. 21ab47cfaaSmrg# 22ab47cfaaSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23ab47cfaaSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24ab47cfaaSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25ab47cfaaSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26ab47cfaaSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27ab47cfaaSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28ab47cfaaSmrg# 29ab47cfaaSmrg# Except as contained in this notice, the name of the X Consortium shall not 30ab47cfaaSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 31ab47cfaaSmrg# ings in this Software without prior written authorization from the X Consor- 32ab47cfaaSmrg# tium. 33ab47cfaaSmrg# 34ab47cfaaSmrg# 35ab47cfaaSmrg# FSF changes to this file are in the public domain. 36ab47cfaaSmrg# 37ab47cfaaSmrg# Calling this script install-sh is preferred over install.sh, to prevent 381e449e82Smrg# 'make' implicit rules from creating a file called install from it 39ab47cfaaSmrg# when there is no Makefile. 40ab47cfaaSmrg# 41ab47cfaaSmrg# This script is compatible with the BSD install script, but was written 428697ee19Smrg# from scratch. 438697ee19Smrg 44300bf1aeSmrgtab=' ' 458697ee19Smrgnl=' 468697ee19Smrg' 47300bf1aeSmrgIFS=" $tab$nl" 48ab47cfaaSmrg 49300bf1aeSmrg# Set DOITPROG to "echo" to test this script. 50ab47cfaaSmrg 511473d951Smrgdoit=${DOITPROG-} 52300bf1aeSmrgdoit_exec=${doit:-exec} 53ab47cfaaSmrg 548697ee19Smrg# Put in absolute file names if you don't have them in your path; 558697ee19Smrg# or use environment vars. 56ab47cfaaSmrg 571473d951Smrgchgrpprog=${CHGRPPROG-chgrp} 581473d951Smrgchmodprog=${CHMODPROG-chmod} 591473d951Smrgchownprog=${CHOWNPROG-chown} 601473d951Smrgcmpprog=${CMPPROG-cmp} 611473d951Smrgcpprog=${CPPROG-cp} 621473d951Smrgmkdirprog=${MKDIRPROG-mkdir} 631473d951Smrgmvprog=${MVPROG-mv} 641473d951Smrgrmprog=${RMPROG-rm} 651473d951Smrgstripprog=${STRIPPROG-strip} 661473d951Smrg 678697ee19Smrgposix_mkdir= 688697ee19Smrg 698697ee19Smrg# Desired mode of installed file. 708697ee19Smrgmode=0755 718697ee19Smrg 722b2b4fcbSmrg# Create dirs (including intermediate dirs) using mode 755. 732b2b4fcbSmrg# This is like GNU 'install' as of coreutils 8.32 (2020). 742b2b4fcbSmrgmkdir_umask=22 752b2b4fcbSmrg 762b2b4fcbSmrgbackupsuffix= 771473d951Smrgchgrpcmd= 788697ee19Smrgchmodcmd=$chmodprog 79ab47cfaaSmrgchowncmd= 801473d951Smrgmvcmd=$mvprog 81ab47cfaaSmrgrmcmd="$rmprog -f" 821473d951Smrgstripcmd= 831473d951Smrg 84ab47cfaaSmrgsrc= 85ab47cfaaSmrgdst= 86ab47cfaaSmrgdir_arg= 871473d951Smrgdst_arg= 881473d951Smrg 891473d951Smrgcopy_on_change=false 90300bf1aeSmrgis_target_a_directory=possibly 91ab47cfaaSmrg 921473d951Smrgusage="\ 931473d951SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 94ab47cfaaSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 95ab47cfaaSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 96ab47cfaaSmrg or: $0 [OPTION]... -d DIRECTORIES... 97ab47cfaaSmrg 98ab47cfaaSmrgIn the 1st form, copy SRCFILE to DSTFILE. 99ab47cfaaSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 100ab47cfaaSmrgIn the 4th, create DIRECTORIES. 101ab47cfaaSmrg 102ab47cfaaSmrgOptions: 1031473d951Smrg --help display this help and exit. 1041473d951Smrg --version display version info and exit. 1051473d951Smrg 1061473d951Smrg -c (ignored) 1072b2b4fcbSmrg -C install only if different (preserve data modification time) 1081473d951Smrg -d create directories instead of installing files. 1091473d951Smrg -g GROUP $chgrpprog installed files to GROUP. 1101473d951Smrg -m MODE $chmodprog installed files to MODE. 1111473d951Smrg -o USER $chownprog installed files to USER. 1122b2b4fcbSmrg -p pass -p to $cpprog. 1131473d951Smrg -s $stripprog installed files. 1142b2b4fcbSmrg -S SUFFIX attempt to back up existing files, with suffix SUFFIX. 1151473d951Smrg -t DIRECTORY install into DIRECTORY. 1161473d951Smrg -T report an error if DSTFILE is a directory. 117ab47cfaaSmrg 118ab47cfaaSmrgEnvironment variables override the default commands: 1191473d951Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 1201473d951Smrg RMPROG STRIPPROG 1212b2b4fcbSmrg 1222b2b4fcbSmrgBy default, rm is invoked with -f; when overridden with RMPROG, 1232b2b4fcbSmrgit's up to you to specify -f if you want it. 1242b2b4fcbSmrg 1252b2b4fcbSmrgIf -S is not specified, no backups are attempted. 1262b2b4fcbSmrg 1272b2b4fcbSmrgEmail bug reports to bug-automake@gnu.org. 1282b2b4fcbSmrgAutomake home page: https://www.gnu.org/software/automake/ 129ab47cfaaSmrg" 130ab47cfaaSmrg 1318697ee19Smrgwhile test $# -ne 0; do 132ab47cfaaSmrg case $1 in 1331473d951Smrg -c) ;; 1341473d951Smrg 1351473d951Smrg -C) copy_on_change=true;; 136ab47cfaaSmrg 1371473d951Smrg -d) dir_arg=true;; 138ab47cfaaSmrg 139ab47cfaaSmrg -g) chgrpcmd="$chgrpprog $2" 140300bf1aeSmrg shift;; 141ab47cfaaSmrg 142ab47cfaaSmrg --help) echo "$usage"; exit $?;; 143ab47cfaaSmrg 1448697ee19Smrg -m) mode=$2 145300bf1aeSmrg case $mode in 146300bf1aeSmrg *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 147300bf1aeSmrg echo "$0: invalid mode: $mode" >&2 148300bf1aeSmrg exit 1;; 149300bf1aeSmrg esac 150300bf1aeSmrg shift;; 151ab47cfaaSmrg 152ab47cfaaSmrg -o) chowncmd="$chownprog $2" 153300bf1aeSmrg shift;; 154ab47cfaaSmrg 1552b2b4fcbSmrg -p) cpprog="$cpprog -p";; 1562b2b4fcbSmrg 1571473d951Smrg -s) stripcmd=$stripprog;; 158ab47cfaaSmrg 1592b2b4fcbSmrg -S) backupsuffix="$2" 1602b2b4fcbSmrg shift;; 1612b2b4fcbSmrg 162300bf1aeSmrg -t) 163300bf1aeSmrg is_target_a_directory=always 164300bf1aeSmrg dst_arg=$2 165300bf1aeSmrg # Protect names problematic for 'test' and other utilities. 166300bf1aeSmrg case $dst_arg in 167300bf1aeSmrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 168300bf1aeSmrg esac 169300bf1aeSmrg shift;; 170ab47cfaaSmrg 171300bf1aeSmrg -T) is_target_a_directory=never;; 172ab47cfaaSmrg 173ab47cfaaSmrg --version) echo "$0 $scriptversion"; exit $?;; 174ab47cfaaSmrg 175300bf1aeSmrg --) shift 176300bf1aeSmrg break;; 1778697ee19Smrg 178300bf1aeSmrg -*) echo "$0: invalid option: $1" >&2 179300bf1aeSmrg exit 1;; 1808697ee19Smrg 1818697ee19Smrg *) break;; 182ab47cfaaSmrg esac 1831473d951Smrg shift 184ab47cfaaSmrgdone 185ab47cfaaSmrg 186300bf1aeSmrg# We allow the use of options -d and -T together, by making -d 187300bf1aeSmrg# take the precedence; this is for compatibility with GNU install. 188300bf1aeSmrg 189300bf1aeSmrgif test -n "$dir_arg"; then 190300bf1aeSmrg if test -n "$dst_arg"; then 191300bf1aeSmrg echo "$0: target directory not allowed when installing a directory." >&2 192300bf1aeSmrg exit 1 193300bf1aeSmrg fi 194300bf1aeSmrgfi 195300bf1aeSmrg 1961473d951Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 1978697ee19Smrg # When -d is used, all remaining arguments are directories to create. 1988697ee19Smrg # When -t is used, the destination is already specified. 1998697ee19Smrg # Otherwise, the last argument is the destination. Remove it from $@. 2008697ee19Smrg for arg 2018697ee19Smrg do 2021473d951Smrg if test -n "$dst_arg"; then 2038697ee19Smrg # $@ is not empty: it contains at least $arg. 2041473d951Smrg set fnord "$@" "$dst_arg" 2058697ee19Smrg shift # fnord 2068697ee19Smrg fi 2078697ee19Smrg shift # arg 2081473d951Smrg dst_arg=$arg 2091e449e82Smrg # Protect names problematic for 'test' and other utilities. 210aa9e3350Smrg case $dst_arg in 211aa9e3350Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 212aa9e3350Smrg esac 2138697ee19Smrg done 2148697ee19Smrgfi 2158697ee19Smrg 2168697ee19Smrgif test $# -eq 0; then 217ab47cfaaSmrg if test -z "$dir_arg"; then 218ab47cfaaSmrg echo "$0: no input file specified." >&2 219ab47cfaaSmrg exit 1 220ab47cfaaSmrg fi 2211e449e82Smrg # It's OK to call 'install-sh -d' without argument. 222ab47cfaaSmrg # This can happen when creating conditional directories. 223ab47cfaaSmrg exit 0 224ab47cfaaSmrgfi 225ab47cfaaSmrg 226300bf1aeSmrgif test -z "$dir_arg"; then 227300bf1aeSmrg if test $# -gt 1 || test "$is_target_a_directory" = always; then 228300bf1aeSmrg if test ! -d "$dst_arg"; then 229300bf1aeSmrg echo "$0: $dst_arg: Is not a directory." >&2 230300bf1aeSmrg exit 1 231300bf1aeSmrg fi 232300bf1aeSmrg fi 233300bf1aeSmrgfi 234300bf1aeSmrg 2358697ee19Smrgif test -z "$dir_arg"; then 236aa9e3350Smrg do_exit='(exit $ret); exit $ret' 237aa9e3350Smrg trap "ret=129; $do_exit" 1 238aa9e3350Smrg trap "ret=130; $do_exit" 2 239aa9e3350Smrg trap "ret=141; $do_exit" 13 240aa9e3350Smrg trap "ret=143; $do_exit" 15 2418697ee19Smrg 2428697ee19Smrg # Set umask so as not to create temps with too-generous modes. 2438697ee19Smrg # However, 'strip' requires both read and write access to temps. 2448697ee19Smrg case $mode in 2458697ee19Smrg # Optimize common cases. 2468697ee19Smrg *644) cp_umask=133;; 2478697ee19Smrg *755) cp_umask=22;; 2488697ee19Smrg 2498697ee19Smrg *[0-7]) 2508697ee19Smrg if test -z "$stripcmd"; then 251300bf1aeSmrg u_plus_rw= 2528697ee19Smrg else 253300bf1aeSmrg u_plus_rw='% 200' 2548697ee19Smrg fi 2558697ee19Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2568697ee19Smrg *) 2578697ee19Smrg if test -z "$stripcmd"; then 258300bf1aeSmrg u_plus_rw= 2598697ee19Smrg else 260300bf1aeSmrg u_plus_rw=,u+rw 2618697ee19Smrg fi 2628697ee19Smrg cp_umask=$mode$u_plus_rw;; 2638697ee19Smrg esac 2648697ee19Smrgfi 2658697ee19Smrg 266ab47cfaaSmrgfor src 267ab47cfaaSmrgdo 2681e449e82Smrg # Protect names problematic for 'test' and other utilities. 269ab47cfaaSmrg case $src in 270aa9e3350Smrg -* | [=\(\)!]) src=./$src;; 271ab47cfaaSmrg esac 272ab47cfaaSmrg 273ab47cfaaSmrg if test -n "$dir_arg"; then 274ab47cfaaSmrg dst=$src 2758697ee19Smrg dstdir=$dst 2768697ee19Smrg test -d "$dstdir" 2778697ee19Smrg dstdir_status=$? 2782b2b4fcbSmrg # Don't chown directories that already exist. 2792b2b4fcbSmrg if test $dstdir_status = 0; then 2802b2b4fcbSmrg chowncmd="" 2812b2b4fcbSmrg fi 282ab47cfaaSmrg else 2838697ee19Smrg 284ab47cfaaSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 285ab47cfaaSmrg # might cause directories to be created, which would be especially bad 286ab47cfaaSmrg # if $src (and thus $dsttmp) contains '*'. 287ab47cfaaSmrg if test ! -f "$src" && test ! -d "$src"; then 288ab47cfaaSmrg echo "$0: $src does not exist." >&2 289ab47cfaaSmrg exit 1 290ab47cfaaSmrg fi 291ab47cfaaSmrg 2921473d951Smrg if test -z "$dst_arg"; then 293ab47cfaaSmrg echo "$0: no destination specified." >&2 294ab47cfaaSmrg exit 1 295ab47cfaaSmrg fi 2961473d951Smrg dst=$dst_arg 297ab47cfaaSmrg 2982b2b4fcbSmrg # If destination is a directory, append the input filename. 299ab47cfaaSmrg if test -d "$dst"; then 300300bf1aeSmrg if test "$is_target_a_directory" = never; then 301300bf1aeSmrg echo "$0: $dst_arg: Is a directory" >&2 302300bf1aeSmrg exit 1 303ab47cfaaSmrg fi 3048697ee19Smrg dstdir=$dst 3052b2b4fcbSmrg dstbase=`basename "$src"` 3062b2b4fcbSmrg case $dst in 3072b2b4fcbSmrg */) dst=$dst$dstbase;; 3082b2b4fcbSmrg *) dst=$dst/$dstbase;; 3092b2b4fcbSmrg esac 3108697ee19Smrg dstdir_status=0 3118697ee19Smrg else 312300bf1aeSmrg dstdir=`dirname "$dst"` 3138697ee19Smrg test -d "$dstdir" 3148697ee19Smrg dstdir_status=$? 315ab47cfaaSmrg fi 316ab47cfaaSmrg fi 317ab47cfaaSmrg 3182b2b4fcbSmrg case $dstdir in 3192b2b4fcbSmrg */) dstdirslash=$dstdir;; 3202b2b4fcbSmrg *) dstdirslash=$dstdir/;; 3212b2b4fcbSmrg esac 3222b2b4fcbSmrg 3238697ee19Smrg obsolete_mkdir_used=false 3248697ee19Smrg 3258697ee19Smrg if test $dstdir_status != 0; then 3268697ee19Smrg case $posix_mkdir in 3278697ee19Smrg '') 328300bf1aeSmrg # With -d, create the new directory with the user-specified mode. 329300bf1aeSmrg # Otherwise, rely on $mkdir_umask. 330300bf1aeSmrg if test -n "$dir_arg"; then 331300bf1aeSmrg mkdir_mode=-m$mode 332300bf1aeSmrg else 333300bf1aeSmrg mkdir_mode= 334300bf1aeSmrg fi 335300bf1aeSmrg 336300bf1aeSmrg posix_mkdir=false 3372b2b4fcbSmrg # The $RANDOM variable is not portable (e.g., dash). Use it 3382b2b4fcbSmrg # here however when possible just to lower collision chance. 3392b2b4fcbSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3402b2b4fcbSmrg 3412b2b4fcbSmrg trap ' 3422b2b4fcbSmrg ret=$? 3432b2b4fcbSmrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null 3442b2b4fcbSmrg exit $ret 3452b2b4fcbSmrg ' 0 3462b2b4fcbSmrg 3472b2b4fcbSmrg # Because "mkdir -p" follows existing symlinks and we likely work 3482b2b4fcbSmrg # directly in world-writeable /tmp, make sure that the '$tmpdir' 3492b2b4fcbSmrg # directory is successfully created first before we actually test 3502b2b4fcbSmrg # 'mkdir -p'. 3512b2b4fcbSmrg if (umask $mkdir_umask && 3522b2b4fcbSmrg $mkdirprog $mkdir_mode "$tmpdir" && 3532b2b4fcbSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 3542b2b4fcbSmrg then 3552b2b4fcbSmrg if test -z "$dir_arg" || { 3562b2b4fcbSmrg # Check for POSIX incompatibilities with -m. 3572b2b4fcbSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 3582b2b4fcbSmrg # other-writable bit of parent directory when it shouldn't. 3592b2b4fcbSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3602b2b4fcbSmrg test_tmpdir="$tmpdir/a" 3612b2b4fcbSmrg ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 3622b2b4fcbSmrg case $ls_ld_tmpdir in 3632b2b4fcbSmrg d????-?r-*) different_mode=700;; 3642b2b4fcbSmrg d????-?--*) different_mode=755;; 3652b2b4fcbSmrg *) false;; 3662b2b4fcbSmrg esac && 3672b2b4fcbSmrg $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 3682b2b4fcbSmrg ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 3692b2b4fcbSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3702b2b4fcbSmrg } 3712b2b4fcbSmrg } 3722b2b4fcbSmrg then posix_mkdir=: 3732b2b4fcbSmrg fi 3742b2b4fcbSmrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 3752b2b4fcbSmrg else 3762b2b4fcbSmrg # Remove any dirs left behind by ancient mkdir implementations. 3772b2b4fcbSmrg rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 3782b2b4fcbSmrg fi 3792b2b4fcbSmrg trap '' 0;; 3808697ee19Smrg esac 381ab47cfaaSmrg 3828697ee19Smrg if 3838697ee19Smrg $posix_mkdir && ( 384300bf1aeSmrg umask $mkdir_umask && 385300bf1aeSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3868697ee19Smrg ) 3878697ee19Smrg then : 3888697ee19Smrg else 389ab47cfaaSmrg 3902b2b4fcbSmrg # mkdir does not conform to POSIX, 3918697ee19Smrg # or it failed possibly due to a race condition. Create the 3928697ee19Smrg # directory the slow way, step by step, checking for races as we go. 3938697ee19Smrg 3948697ee19Smrg case $dstdir in 395300bf1aeSmrg /*) prefix='/';; 396300bf1aeSmrg [-=\(\)!]*) prefix='./';; 397300bf1aeSmrg *) prefix='';; 3988697ee19Smrg esac 3998697ee19Smrg 4008697ee19Smrg oIFS=$IFS 4018697ee19Smrg IFS=/ 402300bf1aeSmrg set -f 4038697ee19Smrg set fnord $dstdir 404ab47cfaaSmrg shift 405300bf1aeSmrg set +f 4068697ee19Smrg IFS=$oIFS 4078697ee19Smrg 4088697ee19Smrg prefixes= 4098697ee19Smrg 4108697ee19Smrg for d 4118697ee19Smrg do 412300bf1aeSmrg test X"$d" = X && continue 413300bf1aeSmrg 414300bf1aeSmrg prefix=$prefix$d 415300bf1aeSmrg if test -d "$prefix"; then 416300bf1aeSmrg prefixes= 417300bf1aeSmrg else 418300bf1aeSmrg if $posix_mkdir; then 4192b2b4fcbSmrg (umask $mkdir_umask && 420300bf1aeSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 421300bf1aeSmrg # Don't fail if two instances are running concurrently. 422300bf1aeSmrg test -d "$prefix" || exit 1 423300bf1aeSmrg else 424300bf1aeSmrg case $prefix in 425300bf1aeSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 426300bf1aeSmrg *) qprefix=$prefix;; 427300bf1aeSmrg esac 428300bf1aeSmrg prefixes="$prefixes '$qprefix'" 429300bf1aeSmrg fi 430300bf1aeSmrg fi 431300bf1aeSmrg prefix=$prefix/ 4328697ee19Smrg done 4338697ee19Smrg 4348697ee19Smrg if test -n "$prefixes"; then 435300bf1aeSmrg # Don't fail if two instances are running concurrently. 436300bf1aeSmrg (umask $mkdir_umask && 437300bf1aeSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 438300bf1aeSmrg test -d "$dstdir" || exit 1 439300bf1aeSmrg obsolete_mkdir_used=true 440ab47cfaaSmrg fi 4418697ee19Smrg fi 442ab47cfaaSmrg fi 443ab47cfaaSmrg 444ab47cfaaSmrg if test -n "$dir_arg"; then 4458697ee19Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4468697ee19Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4478697ee19Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4488697ee19Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 449ab47cfaaSmrg else 450ab47cfaaSmrg 451ab47cfaaSmrg # Make a couple of temp file names in the proper directory. 4522b2b4fcbSmrg dsttmp=${dstdirslash}_inst.$$_ 4532b2b4fcbSmrg rmtmp=${dstdirslash}_rm.$$_ 454ab47cfaaSmrg 455ab47cfaaSmrg # Trap to clean up those temp files at exit. 456ab47cfaaSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 457ab47cfaaSmrg 458ab47cfaaSmrg # Copy the file name to the temp name. 4592b2b4fcbSmrg (umask $cp_umask && 4602b2b4fcbSmrg { test -z "$stripcmd" || { 4612b2b4fcbSmrg # Create $dsttmp read-write so that cp doesn't create it read-only, 4622b2b4fcbSmrg # which would cause strip to fail. 4632b2b4fcbSmrg if test -z "$doit"; then 4642b2b4fcbSmrg : >"$dsttmp" # No need to fork-exec 'touch'. 4652b2b4fcbSmrg else 4662b2b4fcbSmrg $doit touch "$dsttmp" 4672b2b4fcbSmrg fi 4682b2b4fcbSmrg } 4692b2b4fcbSmrg } && 4702b2b4fcbSmrg $doit_exec $cpprog "$src" "$dsttmp") && 471ab47cfaaSmrg 472ab47cfaaSmrg # and set any options; do chmod last to preserve setuid bits. 473ab47cfaaSmrg # 474ab47cfaaSmrg # If any of these fail, we abort the whole thing. If we want to 475ab47cfaaSmrg # ignore errors from any of these, just make sure not to ignore 476ab47cfaaSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 477ab47cfaaSmrg # 4781473d951Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 4791473d951Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 4801473d951Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 4811473d951Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 4821473d951Smrg 4831473d951Smrg # If -C, don't bother to copy if it wouldn't change the file. 4841473d951Smrg if $copy_on_change && 485300bf1aeSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 486300bf1aeSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 487300bf1aeSmrg set -f && 4881473d951Smrg set X $old && old=:$2:$4:$5:$6 && 4891473d951Smrg set X $new && new=:$2:$4:$5:$6 && 490300bf1aeSmrg set +f && 4911473d951Smrg test "$old" = "$new" && 4921473d951Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 4931473d951Smrg then 4941473d951Smrg rm -f "$dsttmp" 4951473d951Smrg else 4962b2b4fcbSmrg # If $backupsuffix is set, and the file being installed 4972b2b4fcbSmrg # already exists, attempt a backup. Don't worry if it fails, 4982b2b4fcbSmrg # e.g., if mv doesn't support -f. 4992b2b4fcbSmrg if test -n "$backupsuffix" && test -f "$dst"; then 5002b2b4fcbSmrg $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null 5012b2b4fcbSmrg fi 5022b2b4fcbSmrg 5031473d951Smrg # Rename the file to the real destination. 5041473d951Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 5051473d951Smrg 5061473d951Smrg # The rename failed, perhaps because mv can't rename something else 5071473d951Smrg # to itself, or perhaps because mv is so ancient that it does not 5081473d951Smrg # support -f. 5091473d951Smrg { 510300bf1aeSmrg # Now remove or move aside any old file at destination location. 511300bf1aeSmrg # We try this two ways since rm can't unlink itself on some 512300bf1aeSmrg # systems and the destination file might be busy for other 513300bf1aeSmrg # reasons. In this case, the final cleanup might fail but the new 514300bf1aeSmrg # file should still install successfully. 515300bf1aeSmrg { 516300bf1aeSmrg test ! -f "$dst" || 5172b2b4fcbSmrg $doit $rmcmd "$dst" 2>/dev/null || 518300bf1aeSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 5192b2b4fcbSmrg { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } 520300bf1aeSmrg } || 521300bf1aeSmrg { echo "$0: cannot unlink or rename $dst" >&2 522300bf1aeSmrg (exit 1); exit 1 523300bf1aeSmrg } 524300bf1aeSmrg } && 525300bf1aeSmrg 526300bf1aeSmrg # Now rename the file to the real destination. 527300bf1aeSmrg $doit $mvcmd "$dsttmp" "$dst" 5281473d951Smrg } 5291473d951Smrg fi || exit 1 530ab47cfaaSmrg 5318697ee19Smrg trap '' 0 5328697ee19Smrg fi 5338697ee19Smrgdone 534ab47cfaaSmrg 535ab47cfaaSmrg# Local variables: 5362b2b4fcbSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 537ab47cfaaSmrg# time-stamp-start: "scriptversion=" 538ab47cfaaSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 5392b2b4fcbSmrg# time-stamp-time-zone: "UTC0" 5405c42550eSmrg# time-stamp-end: "; # UTC" 541ab47cfaaSmrg# End: 542