1fdb3d228Smrg#!/bin/sh 2fdb3d228Smrg# install - install a program, script, or datafile 39b41ff1aSmrg 474b35aa8Smrgscriptversion=2020-11-14.01; # UTC 59b41ff1aSmrg 6fdb3d228Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 7fdb3d228Smrg# later released in X11R6 (xc/config/util/install.sh) with the 8fdb3d228Smrg# following copyright and license. 9fdb3d228Smrg# 10fdb3d228Smrg# Copyright (C) 1994 X Consortium 11fdb3d228Smrg# 12fdb3d228Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 13fdb3d228Smrg# of this software and associated documentation files (the "Software"), to 14fdb3d228Smrg# deal in the Software without restriction, including without limitation the 15fdb3d228Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16fdb3d228Smrg# sell copies of the Software, and to permit persons to whom the Software is 17fdb3d228Smrg# furnished to do so, subject to the following conditions: 18fdb3d228Smrg# 19fdb3d228Smrg# The above copyright notice and this permission notice shall be included in 20fdb3d228Smrg# all copies or substantial portions of the Software. 21fdb3d228Smrg# 22fdb3d228Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23fdb3d228Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24fdb3d228Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25fdb3d228Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26fdb3d228Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27fdb3d228Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28fdb3d228Smrg# 29fdb3d228Smrg# Except as contained in this notice, the name of the X Consortium shall not 30fdb3d228Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 31fdb3d228Smrg# ings in this Software without prior written authorization from the X Consor- 32fdb3d228Smrg# tium. 33fdb3d228Smrg# 34fdb3d228Smrg# 35fdb3d228Smrg# FSF changes to this file are in the public domain. 36fdb3d228Smrg# 37fdb3d228Smrg# Calling this script install-sh is preferred over install.sh, to prevent 38585aa3f7Smrg# 'make' implicit rules from creating a file called install from it 39fdb3d228Smrg# when there is no Makefile. 40fdb3d228Smrg# 41fdb3d228Smrg# This script is compatible with the BSD install script, but was written 429b41ff1aSmrg# from scratch. 43fdb3d228Smrg 44585aa3f7Smrgtab=' ' 459b41ff1aSmrgnl=' 469b41ff1aSmrg' 47585aa3f7SmrgIFS=" $tab$nl" 48fdb3d228Smrg 49585aa3f7Smrg# Set DOITPROG to "echo" to test this script. 50fdb3d228Smrg 519b41ff1aSmrgdoit=${DOITPROG-} 52585aa3f7Smrgdoit_exec=${doit:-exec} 53fdb3d228Smrg 549b41ff1aSmrg# Put in absolute file names if you don't have them in your path; 559b41ff1aSmrg# or use environment vars. 569b41ff1aSmrg 579b41ff1aSmrgchgrpprog=${CHGRPPROG-chgrp} 589b41ff1aSmrgchmodprog=${CHMODPROG-chmod} 599b41ff1aSmrgchownprog=${CHOWNPROG-chown} 609b41ff1aSmrgcmpprog=${CMPPROG-cmp} 619b41ff1aSmrgcpprog=${CPPROG-cp} 629b41ff1aSmrgmkdirprog=${MKDIRPROG-mkdir} 639b41ff1aSmrgmvprog=${MVPROG-mv} 649b41ff1aSmrgrmprog=${RMPROG-rm} 659b41ff1aSmrgstripprog=${STRIPPROG-strip} 669b41ff1aSmrg 679b41ff1aSmrgposix_mkdir= 689b41ff1aSmrg 699b41ff1aSmrg# Desired mode of installed file. 709b41ff1aSmrgmode=0755 719b41ff1aSmrg 7274b35aa8Smrg# Create dirs (including intermediate dirs) using mode 755. 7374b35aa8Smrg# This is like GNU 'install' as of coreutils 8.32 (2020). 7474b35aa8Smrgmkdir_umask=22 7574b35aa8Smrg 7674b35aa8Smrgbackupsuffix= 779b41ff1aSmrgchgrpcmd= 789b41ff1aSmrgchmodcmd=$chmodprog 799b41ff1aSmrgchowncmd= 809b41ff1aSmrgmvcmd=$mvprog 819b41ff1aSmrgrmcmd="$rmprog -f" 829b41ff1aSmrgstripcmd= 83fdb3d228Smrg 849b41ff1aSmrgsrc= 859b41ff1aSmrgdst= 869b41ff1aSmrgdir_arg= 879b41ff1aSmrgdst_arg= 88fdb3d228Smrg 899b41ff1aSmrgcopy_on_change=false 90585aa3f7Smrgis_target_a_directory=possibly 91fdb3d228Smrg 929b41ff1aSmrgusage="\ 939b41ff1aSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 949b41ff1aSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 959b41ff1aSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 969b41ff1aSmrg or: $0 [OPTION]... -d DIRECTORIES... 97fdb3d228Smrg 989b41ff1aSmrgIn the 1st form, copy SRCFILE to DSTFILE. 999b41ff1aSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 1009b41ff1aSmrgIn the 4th, create DIRECTORIES. 101fdb3d228Smrg 1029b41ff1aSmrgOptions: 1039b41ff1aSmrg --help display this help and exit. 1049b41ff1aSmrg --version display version info and exit. 105fdb3d228Smrg 1069b41ff1aSmrg -c (ignored) 10774b35aa8Smrg -C install only if different (preserve data modification time) 1089b41ff1aSmrg -d create directories instead of installing files. 1099b41ff1aSmrg -g GROUP $chgrpprog installed files to GROUP. 1109b41ff1aSmrg -m MODE $chmodprog installed files to MODE. 1119b41ff1aSmrg -o USER $chownprog installed files to USER. 11274b35aa8Smrg -p pass -p to $cpprog. 1139b41ff1aSmrg -s $stripprog installed files. 11474b35aa8Smrg -S SUFFIX attempt to back up existing files, with suffix SUFFIX. 1159b41ff1aSmrg -t DIRECTORY install into DIRECTORY. 1169b41ff1aSmrg -T report an error if DSTFILE is a directory. 117fdb3d228Smrg 1189b41ff1aSmrgEnvironment variables override the default commands: 1199b41ff1aSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 1209b41ff1aSmrg RMPROG STRIPPROG 12174b35aa8Smrg 12274b35aa8SmrgBy default, rm is invoked with -f; when overridden with RMPROG, 12374b35aa8Smrgit's up to you to specify -f if you want it. 12474b35aa8Smrg 12574b35aa8SmrgIf -S is not specified, no backups are attempted. 12674b35aa8Smrg 12774b35aa8SmrgEmail bug reports to bug-automake@gnu.org. 12874b35aa8SmrgAutomake home page: https://www.gnu.org/software/automake/ 1299b41ff1aSmrg" 130fdb3d228Smrg 1319b41ff1aSmrgwhile test $# -ne 0; do 1329b41ff1aSmrg case $1 in 1339b41ff1aSmrg -c) ;; 134fdb3d228Smrg 1359b41ff1aSmrg -C) copy_on_change=true;; 136fdb3d228Smrg 1379b41ff1aSmrg -d) dir_arg=true;; 138fdb3d228Smrg 1399b41ff1aSmrg -g) chgrpcmd="$chgrpprog $2" 140585aa3f7Smrg shift;; 141fdb3d228Smrg 1429b41ff1aSmrg --help) echo "$usage"; exit $?;; 143fdb3d228Smrg 1449b41ff1aSmrg -m) mode=$2 145585aa3f7Smrg case $mode in 146585aa3f7Smrg *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 147585aa3f7Smrg echo "$0: invalid mode: $mode" >&2 148585aa3f7Smrg exit 1;; 149585aa3f7Smrg esac 150585aa3f7Smrg shift;; 151fdb3d228Smrg 1529b41ff1aSmrg -o) chowncmd="$chownprog $2" 153585aa3f7Smrg shift;; 154fdb3d228Smrg 15574b35aa8Smrg -p) cpprog="$cpprog -p";; 15674b35aa8Smrg 1579b41ff1aSmrg -s) stripcmd=$stripprog;; 158fdb3d228Smrg 15974b35aa8Smrg -S) backupsuffix="$2" 16074b35aa8Smrg shift;; 16174b35aa8Smrg 162585aa3f7Smrg -t) 163585aa3f7Smrg is_target_a_directory=always 164585aa3f7Smrg dst_arg=$2 165585aa3f7Smrg # Protect names problematic for 'test' and other utilities. 166585aa3f7Smrg case $dst_arg in 167585aa3f7Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 168585aa3f7Smrg esac 169585aa3f7Smrg shift;; 170fdb3d228Smrg 171585aa3f7Smrg -T) is_target_a_directory=never;; 172fdb3d228Smrg 1739b41ff1aSmrg --version) echo "$0 $scriptversion"; exit $?;; 174fdb3d228Smrg 175585aa3f7Smrg --) shift 176585aa3f7Smrg break;; 177fdb3d228Smrg 178585aa3f7Smrg -*) echo "$0: invalid option: $1" >&2 179585aa3f7Smrg exit 1;; 180fdb3d228Smrg 1819b41ff1aSmrg *) break;; 1829b41ff1aSmrg esac 1839b41ff1aSmrg shift 1849b41ff1aSmrgdone 185fdb3d228Smrg 186585aa3f7Smrg# We allow the use of options -d and -T together, by making -d 187585aa3f7Smrg# take the precedence; this is for compatibility with GNU install. 188585aa3f7Smrg 189585aa3f7Smrgif test -n "$dir_arg"; then 190585aa3f7Smrg if test -n "$dst_arg"; then 191585aa3f7Smrg echo "$0: target directory not allowed when installing a directory." >&2 192585aa3f7Smrg exit 1 193585aa3f7Smrg fi 194585aa3f7Smrgfi 195585aa3f7Smrg 1969b41ff1aSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 1979b41ff1aSmrg # When -d is used, all remaining arguments are directories to create. 1989b41ff1aSmrg # When -t is used, the destination is already specified. 1999b41ff1aSmrg # Otherwise, the last argument is the destination. Remove it from $@. 2009b41ff1aSmrg for arg 2019b41ff1aSmrg do 2029b41ff1aSmrg if test -n "$dst_arg"; then 2039b41ff1aSmrg # $@ is not empty: it contains at least $arg. 2049b41ff1aSmrg set fnord "$@" "$dst_arg" 2059b41ff1aSmrg shift # fnord 2069b41ff1aSmrg fi 2079b41ff1aSmrg shift # arg 2089b41ff1aSmrg dst_arg=$arg 209585aa3f7Smrg # Protect names problematic for 'test' and other utilities. 2107d575c90Smrg case $dst_arg in 2117d575c90Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 2127d575c90Smrg esac 2139b41ff1aSmrg done 2149b41ff1aSmrgfi 215fdb3d228Smrg 2169b41ff1aSmrgif test $# -eq 0; then 2179b41ff1aSmrg if test -z "$dir_arg"; then 2189b41ff1aSmrg echo "$0: no input file specified." >&2 2199b41ff1aSmrg exit 1 2209b41ff1aSmrg fi 221585aa3f7Smrg # It's OK to call 'install-sh -d' without argument. 2229b41ff1aSmrg # This can happen when creating conditional directories. 2239b41ff1aSmrg exit 0 2249b41ff1aSmrgfi 225fdb3d228Smrg 226585aa3f7Smrgif test -z "$dir_arg"; then 227585aa3f7Smrg if test $# -gt 1 || test "$is_target_a_directory" = always; then 228585aa3f7Smrg if test ! -d "$dst_arg"; then 229585aa3f7Smrg echo "$0: $dst_arg: Is not a directory." >&2 230585aa3f7Smrg exit 1 231585aa3f7Smrg fi 232585aa3f7Smrg fi 233585aa3f7Smrgfi 234585aa3f7Smrg 2359b41ff1aSmrgif test -z "$dir_arg"; then 2367d575c90Smrg do_exit='(exit $ret); exit $ret' 2377d575c90Smrg trap "ret=129; $do_exit" 1 2387d575c90Smrg trap "ret=130; $do_exit" 2 2397d575c90Smrg trap "ret=141; $do_exit" 13 2407d575c90Smrg trap "ret=143; $do_exit" 15 2419b41ff1aSmrg 2429b41ff1aSmrg # Set umask so as not to create temps with too-generous modes. 2439b41ff1aSmrg # However, 'strip' requires both read and write access to temps. 2449b41ff1aSmrg case $mode in 2459b41ff1aSmrg # Optimize common cases. 2469b41ff1aSmrg *644) cp_umask=133;; 2479b41ff1aSmrg *755) cp_umask=22;; 2489b41ff1aSmrg 2499b41ff1aSmrg *[0-7]) 2509b41ff1aSmrg if test -z "$stripcmd"; then 251585aa3f7Smrg u_plus_rw= 2529b41ff1aSmrg else 253585aa3f7Smrg u_plus_rw='% 200' 2549b41ff1aSmrg fi 2559b41ff1aSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2569b41ff1aSmrg *) 2579b41ff1aSmrg if test -z "$stripcmd"; then 258585aa3f7Smrg u_plus_rw= 2599b41ff1aSmrg else 260585aa3f7Smrg u_plus_rw=,u+rw 2619b41ff1aSmrg fi 2629b41ff1aSmrg cp_umask=$mode$u_plus_rw;; 2639b41ff1aSmrg esac 2649b41ff1aSmrgfi 265fdb3d228Smrg 2669b41ff1aSmrgfor src 2679b41ff1aSmrgdo 268585aa3f7Smrg # Protect names problematic for 'test' and other utilities. 2699b41ff1aSmrg case $src in 2707d575c90Smrg -* | [=\(\)!]) src=./$src;; 2719b41ff1aSmrg esac 2729b41ff1aSmrg 2739b41ff1aSmrg if test -n "$dir_arg"; then 2749b41ff1aSmrg dst=$src 2759b41ff1aSmrg dstdir=$dst 2769b41ff1aSmrg test -d "$dstdir" 2779b41ff1aSmrg dstdir_status=$? 27874b35aa8Smrg # Don't chown directories that already exist. 27974b35aa8Smrg if test $dstdir_status = 0; then 28074b35aa8Smrg chowncmd="" 28174b35aa8Smrg fi 2829b41ff1aSmrg else 2839b41ff1aSmrg 2849b41ff1aSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 2859b41ff1aSmrg # might cause directories to be created, which would be especially bad 2869b41ff1aSmrg # if $src (and thus $dsttmp) contains '*'. 2879b41ff1aSmrg if test ! -f "$src" && test ! -d "$src"; then 2889b41ff1aSmrg echo "$0: $src does not exist." >&2 2899b41ff1aSmrg exit 1 2909b41ff1aSmrg fi 2919b41ff1aSmrg 2929b41ff1aSmrg if test -z "$dst_arg"; then 2939b41ff1aSmrg echo "$0: no destination specified." >&2 2949b41ff1aSmrg exit 1 2959b41ff1aSmrg fi 2969b41ff1aSmrg dst=$dst_arg 297fdb3d228Smrg 29874b35aa8Smrg # If destination is a directory, append the input filename. 2999b41ff1aSmrg if test -d "$dst"; then 300585aa3f7Smrg if test "$is_target_a_directory" = never; then 301585aa3f7Smrg echo "$0: $dst_arg: Is a directory" >&2 302585aa3f7Smrg exit 1 3039b41ff1aSmrg fi 3049b41ff1aSmrg dstdir=$dst 30574b35aa8Smrg dstbase=`basename "$src"` 30674b35aa8Smrg case $dst in 30774b35aa8Smrg */) dst=$dst$dstbase;; 30874b35aa8Smrg *) dst=$dst/$dstbase;; 30974b35aa8Smrg esac 3109b41ff1aSmrg dstdir_status=0 3119b41ff1aSmrg else 312585aa3f7Smrg dstdir=`dirname "$dst"` 3139b41ff1aSmrg test -d "$dstdir" 3149b41ff1aSmrg dstdir_status=$? 3159b41ff1aSmrg fi 3169b41ff1aSmrg fi 3179b41ff1aSmrg 31874b35aa8Smrg case $dstdir in 31974b35aa8Smrg */) dstdirslash=$dstdir;; 32074b35aa8Smrg *) dstdirslash=$dstdir/;; 32174b35aa8Smrg esac 32274b35aa8Smrg 3239b41ff1aSmrg obsolete_mkdir_used=false 3249b41ff1aSmrg 3259b41ff1aSmrg if test $dstdir_status != 0; then 3269b41ff1aSmrg case $posix_mkdir in 3279b41ff1aSmrg '') 328585aa3f7Smrg # With -d, create the new directory with the user-specified mode. 329585aa3f7Smrg # Otherwise, rely on $mkdir_umask. 330585aa3f7Smrg if test -n "$dir_arg"; then 331585aa3f7Smrg mkdir_mode=-m$mode 332585aa3f7Smrg else 333585aa3f7Smrg mkdir_mode= 334585aa3f7Smrg fi 335585aa3f7Smrg 336585aa3f7Smrg posix_mkdir=false 33774b35aa8Smrg # The $RANDOM variable is not portable (e.g., dash). Use it 33874b35aa8Smrg # here however when possible just to lower collision chance. 33974b35aa8Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34074b35aa8Smrg 34174b35aa8Smrg trap ' 34274b35aa8Smrg ret=$? 34374b35aa8Smrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null 34474b35aa8Smrg exit $ret 34574b35aa8Smrg ' 0 34674b35aa8Smrg 34774b35aa8Smrg # Because "mkdir -p" follows existing symlinks and we likely work 34874b35aa8Smrg # directly in world-writeable /tmp, make sure that the '$tmpdir' 34974b35aa8Smrg # directory is successfully created first before we actually test 35074b35aa8Smrg # 'mkdir -p'. 35174b35aa8Smrg if (umask $mkdir_umask && 35274b35aa8Smrg $mkdirprog $mkdir_mode "$tmpdir" && 35374b35aa8Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 35474b35aa8Smrg then 35574b35aa8Smrg if test -z "$dir_arg" || { 35674b35aa8Smrg # Check for POSIX incompatibilities with -m. 35774b35aa8Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35874b35aa8Smrg # other-writable bit of parent directory when it shouldn't. 35974b35aa8Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 36074b35aa8Smrg test_tmpdir="$tmpdir/a" 36174b35aa8Smrg ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 36274b35aa8Smrg case $ls_ld_tmpdir in 36374b35aa8Smrg d????-?r-*) different_mode=700;; 36474b35aa8Smrg d????-?--*) different_mode=755;; 36574b35aa8Smrg *) false;; 36674b35aa8Smrg esac && 36774b35aa8Smrg $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 36874b35aa8Smrg ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 36974b35aa8Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 37074b35aa8Smrg } 37174b35aa8Smrg } 37274b35aa8Smrg then posix_mkdir=: 37374b35aa8Smrg fi 37474b35aa8Smrg rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 37574b35aa8Smrg else 37674b35aa8Smrg # Remove any dirs left behind by ancient mkdir implementations. 37774b35aa8Smrg rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 37874b35aa8Smrg fi 37974b35aa8Smrg trap '' 0;; 3809b41ff1aSmrg esac 381fdb3d228Smrg 3829b41ff1aSmrg if 3839b41ff1aSmrg $posix_mkdir && ( 384585aa3f7Smrg umask $mkdir_umask && 385585aa3f7Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3869b41ff1aSmrg ) 3879b41ff1aSmrg then : 3889b41ff1aSmrg else 3899b41ff1aSmrg 39074b35aa8Smrg # mkdir does not conform to POSIX, 3919b41ff1aSmrg # or it failed possibly due to a race condition. Create the 3929b41ff1aSmrg # directory the slow way, step by step, checking for races as we go. 3939b41ff1aSmrg 3949b41ff1aSmrg case $dstdir in 395585aa3f7Smrg /*) prefix='/';; 396585aa3f7Smrg [-=\(\)!]*) prefix='./';; 397585aa3f7Smrg *) prefix='';; 3989b41ff1aSmrg esac 3999b41ff1aSmrg 4009b41ff1aSmrg oIFS=$IFS 4019b41ff1aSmrg IFS=/ 402585aa3f7Smrg set -f 4039b41ff1aSmrg set fnord $dstdir 4049b41ff1aSmrg shift 405585aa3f7Smrg set +f 4069b41ff1aSmrg IFS=$oIFS 4079b41ff1aSmrg 4089b41ff1aSmrg prefixes= 4099b41ff1aSmrg 4109b41ff1aSmrg for d 4119b41ff1aSmrg do 412585aa3f7Smrg test X"$d" = X && continue 413585aa3f7Smrg 414585aa3f7Smrg prefix=$prefix$d 415585aa3f7Smrg if test -d "$prefix"; then 416585aa3f7Smrg prefixes= 417585aa3f7Smrg else 418585aa3f7Smrg if $posix_mkdir; then 41974b35aa8Smrg (umask $mkdir_umask && 420585aa3f7Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 421585aa3f7Smrg # Don't fail if two instances are running concurrently. 422585aa3f7Smrg test -d "$prefix" || exit 1 423585aa3f7Smrg else 424585aa3f7Smrg case $prefix in 425585aa3f7Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 426585aa3f7Smrg *) qprefix=$prefix;; 427585aa3f7Smrg esac 428585aa3f7Smrg prefixes="$prefixes '$qprefix'" 429585aa3f7Smrg fi 430585aa3f7Smrg fi 431585aa3f7Smrg prefix=$prefix/ 4329b41ff1aSmrg done 4339b41ff1aSmrg 4349b41ff1aSmrg if test -n "$prefixes"; then 435585aa3f7Smrg # Don't fail if two instances are running concurrently. 436585aa3f7Smrg (umask $mkdir_umask && 437585aa3f7Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 438585aa3f7Smrg test -d "$dstdir" || exit 1 439585aa3f7Smrg obsolete_mkdir_used=true 4409b41ff1aSmrg fi 4419b41ff1aSmrg fi 4429b41ff1aSmrg fi 4439b41ff1aSmrg 4449b41ff1aSmrg if test -n "$dir_arg"; then 4459b41ff1aSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4469b41ff1aSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4479b41ff1aSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4489b41ff1aSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 4499b41ff1aSmrg else 4509b41ff1aSmrg 4519b41ff1aSmrg # Make a couple of temp file names in the proper directory. 45274b35aa8Smrg dsttmp=${dstdirslash}_inst.$$_ 45374b35aa8Smrg rmtmp=${dstdirslash}_rm.$$_ 4549b41ff1aSmrg 4559b41ff1aSmrg # Trap to clean up those temp files at exit. 4569b41ff1aSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 4579b41ff1aSmrg 4589b41ff1aSmrg # Copy the file name to the temp name. 45974b35aa8Smrg (umask $cp_umask && 46074b35aa8Smrg { test -z "$stripcmd" || { 46174b35aa8Smrg # Create $dsttmp read-write so that cp doesn't create it read-only, 46274b35aa8Smrg # which would cause strip to fail. 46374b35aa8Smrg if test -z "$doit"; then 46474b35aa8Smrg : >"$dsttmp" # No need to fork-exec 'touch'. 46574b35aa8Smrg else 46674b35aa8Smrg $doit touch "$dsttmp" 46774b35aa8Smrg fi 46874b35aa8Smrg } 46974b35aa8Smrg } && 47074b35aa8Smrg $doit_exec $cpprog "$src" "$dsttmp") && 4719b41ff1aSmrg 4729b41ff1aSmrg # and set any options; do chmod last to preserve setuid bits. 4739b41ff1aSmrg # 4749b41ff1aSmrg # If any of these fail, we abort the whole thing. If we want to 4759b41ff1aSmrg # ignore errors from any of these, just make sure not to ignore 4769b41ff1aSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 4779b41ff1aSmrg # 4789b41ff1aSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 4799b41ff1aSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 4809b41ff1aSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 4819b41ff1aSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 4829b41ff1aSmrg 4839b41ff1aSmrg # If -C, don't bother to copy if it wouldn't change the file. 4849b41ff1aSmrg if $copy_on_change && 485585aa3f7Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 486585aa3f7Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 487585aa3f7Smrg set -f && 4889b41ff1aSmrg set X $old && old=:$2:$4:$5:$6 && 4899b41ff1aSmrg set X $new && new=:$2:$4:$5:$6 && 490585aa3f7Smrg set +f && 4919b41ff1aSmrg test "$old" = "$new" && 4929b41ff1aSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 4939b41ff1aSmrg then 4949b41ff1aSmrg rm -f "$dsttmp" 4959b41ff1aSmrg else 49674b35aa8Smrg # If $backupsuffix is set, and the file being installed 49774b35aa8Smrg # already exists, attempt a backup. Don't worry if it fails, 49874b35aa8Smrg # e.g., if mv doesn't support -f. 49974b35aa8Smrg if test -n "$backupsuffix" && test -f "$dst"; then 50074b35aa8Smrg $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null 50174b35aa8Smrg fi 50274b35aa8Smrg 5039b41ff1aSmrg # Rename the file to the real destination. 5049b41ff1aSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 5059b41ff1aSmrg 5069b41ff1aSmrg # The rename failed, perhaps because mv can't rename something else 5079b41ff1aSmrg # to itself, or perhaps because mv is so ancient that it does not 5089b41ff1aSmrg # support -f. 5099b41ff1aSmrg { 510585aa3f7Smrg # Now remove or move aside any old file at destination location. 511585aa3f7Smrg # We try this two ways since rm can't unlink itself on some 512585aa3f7Smrg # systems and the destination file might be busy for other 513585aa3f7Smrg # reasons. In this case, the final cleanup might fail but the new 514585aa3f7Smrg # file should still install successfully. 515585aa3f7Smrg { 516585aa3f7Smrg test ! -f "$dst" || 51774b35aa8Smrg $doit $rmcmd "$dst" 2>/dev/null || 518585aa3f7Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 51974b35aa8Smrg { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } 520585aa3f7Smrg } || 521585aa3f7Smrg { echo "$0: cannot unlink or rename $dst" >&2 522585aa3f7Smrg (exit 1); exit 1 523585aa3f7Smrg } 524585aa3f7Smrg } && 525585aa3f7Smrg 526585aa3f7Smrg # Now rename the file to the real destination. 527585aa3f7Smrg $doit $mvcmd "$dsttmp" "$dst" 5289b41ff1aSmrg } 5299b41ff1aSmrg fi || exit 1 5309b41ff1aSmrg 5319b41ff1aSmrg trap '' 0 5329b41ff1aSmrg fi 5339b41ff1aSmrgdone 534fdb3d228Smrg 5359b41ff1aSmrg# Local variables: 53674b35aa8Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 5379b41ff1aSmrg# time-stamp-start: "scriptversion=" 5389b41ff1aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 53974b35aa8Smrg# time-stamp-time-zone: "UTC0" 5409b41ff1aSmrg# time-stamp-end: "; # UTC" 5419b41ff1aSmrg# End: 542