install-sh revision d1a7ce7b
1eaef79e5Smrg#!/bin/sh 2eaef79e5Smrg# install - install a program, script, or datafile 3eaef79e5Smrg 4d1a7ce7bSmrgscriptversion=2013-12-25.23; # UTC 5eaef79e5Smrg 6eaef79e5Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 7eaef79e5Smrg# later released in X11R6 (xc/config/util/install.sh) with the 8eaef79e5Smrg# following copyright and license. 9eaef79e5Smrg# 10eaef79e5Smrg# Copyright (C) 1994 X Consortium 11eaef79e5Smrg# 12eaef79e5Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 13eaef79e5Smrg# of this software and associated documentation files (the "Software"), to 14eaef79e5Smrg# deal in the Software without restriction, including without limitation the 15eaef79e5Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16eaef79e5Smrg# sell copies of the Software, and to permit persons to whom the Software is 17eaef79e5Smrg# furnished to do so, subject to the following conditions: 18eaef79e5Smrg# 19eaef79e5Smrg# The above copyright notice and this permission notice shall be included in 20eaef79e5Smrg# all copies or substantial portions of the Software. 21eaef79e5Smrg# 22eaef79e5Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23eaef79e5Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24eaef79e5Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25eaef79e5Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26eaef79e5Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27eaef79e5Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28eaef79e5Smrg# 29eaef79e5Smrg# Except as contained in this notice, the name of the X Consortium shall not 30eaef79e5Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 31eaef79e5Smrg# ings in this Software without prior written authorization from the X Consor- 32eaef79e5Smrg# tium. 33eaef79e5Smrg# 34eaef79e5Smrg# 35eaef79e5Smrg# FSF changes to this file are in the public domain. 36eaef79e5Smrg# 37eaef79e5Smrg# Calling this script install-sh is preferred over install.sh, to prevent 38cbc4e2beSmrg# 'make' implicit rules from creating a file called install from it 39eaef79e5Smrg# when there is no Makefile. 40eaef79e5Smrg# 41eaef79e5Smrg# This script is compatible with the BSD install script, but was written 422b32c8f7Smrg# from scratch. 432b32c8f7Smrg 44d1a7ce7bSmrgtab=' ' 452b32c8f7Smrgnl=' 462b32c8f7Smrg' 47d1a7ce7bSmrgIFS=" $tab$nl" 48eaef79e5Smrg 49d1a7ce7bSmrg# Set DOITPROG to "echo" to test this script. 50eaef79e5Smrg 512b32c8f7Smrgdoit=${DOITPROG-} 52d1a7ce7bSmrgdoit_exec=${doit:-exec} 53eaef79e5Smrg 542b32c8f7Smrg# Put in absolute file names if you don't have them in your path; 552b32c8f7Smrg# or use environment vars. 562b32c8f7Smrg 572b32c8f7Smrgchgrpprog=${CHGRPPROG-chgrp} 582b32c8f7Smrgchmodprog=${CHMODPROG-chmod} 592b32c8f7Smrgchownprog=${CHOWNPROG-chown} 602b32c8f7Smrgcmpprog=${CMPPROG-cmp} 612b32c8f7Smrgcpprog=${CPPROG-cp} 622b32c8f7Smrgmkdirprog=${MKDIRPROG-mkdir} 632b32c8f7Smrgmvprog=${MVPROG-mv} 642b32c8f7Smrgrmprog=${RMPROG-rm} 652b32c8f7Smrgstripprog=${STRIPPROG-strip} 662b32c8f7Smrg 672b32c8f7Smrgposix_mkdir= 682b32c8f7Smrg 692b32c8f7Smrg# Desired mode of installed file. 702b32c8f7Smrgmode=0755 71eaef79e5Smrg 72eaef79e5Smrgchgrpcmd= 732b32c8f7Smrgchmodcmd=$chmodprog 742b32c8f7Smrgchowncmd= 752b32c8f7Smrgmvcmd=$mvprog 76eaef79e5Smrgrmcmd="$rmprog -f" 772b32c8f7Smrgstripcmd= 782b32c8f7Smrg 79eaef79e5Smrgsrc= 80eaef79e5Smrgdst= 81eaef79e5Smrgdir_arg= 822b32c8f7Smrgdst_arg= 832b32c8f7Smrg 842b32c8f7Smrgcopy_on_change=false 85d1a7ce7bSmrgis_target_a_directory=possibly 86eaef79e5Smrg 872b32c8f7Smrgusage="\ 882b32c8f7SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 89eaef79e5Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 90eaef79e5Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 91eaef79e5Smrg or: $0 [OPTION]... -d DIRECTORIES... 92eaef79e5Smrg 93eaef79e5SmrgIn the 1st form, copy SRCFILE to DSTFILE. 94eaef79e5SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 95eaef79e5SmrgIn the 4th, create DIRECTORIES. 96eaef79e5Smrg 97eaef79e5SmrgOptions: 982b32c8f7Smrg --help display this help and exit. 992b32c8f7Smrg --version display version info and exit. 1002b32c8f7Smrg 1012b32c8f7Smrg -c (ignored) 1022b32c8f7Smrg -C install only if different (preserve the last data modification time) 1032b32c8f7Smrg -d create directories instead of installing files. 1042b32c8f7Smrg -g GROUP $chgrpprog installed files to GROUP. 1052b32c8f7Smrg -m MODE $chmodprog installed files to MODE. 1062b32c8f7Smrg -o USER $chownprog installed files to USER. 1072b32c8f7Smrg -s $stripprog installed files. 1082b32c8f7Smrg -t DIRECTORY install into DIRECTORY. 1092b32c8f7Smrg -T report an error if DSTFILE is a directory. 110eaef79e5Smrg 111eaef79e5SmrgEnvironment variables override the default commands: 1122b32c8f7Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 1132b32c8f7Smrg RMPROG STRIPPROG 114eaef79e5Smrg" 115eaef79e5Smrg 1162b32c8f7Smrgwhile test $# -ne 0; do 117eaef79e5Smrg case $1 in 1182b32c8f7Smrg -c) ;; 1192b32c8f7Smrg 1202b32c8f7Smrg -C) copy_on_change=true;; 121eaef79e5Smrg 1222b32c8f7Smrg -d) dir_arg=true;; 123eaef79e5Smrg 124eaef79e5Smrg -g) chgrpcmd="$chgrpprog $2" 125d1a7ce7bSmrg shift;; 126eaef79e5Smrg 127eaef79e5Smrg --help) echo "$usage"; exit $?;; 128eaef79e5Smrg 1292b32c8f7Smrg -m) mode=$2 130d1a7ce7bSmrg case $mode in 131d1a7ce7bSmrg *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 132d1a7ce7bSmrg echo "$0: invalid mode: $mode" >&2 133d1a7ce7bSmrg exit 1;; 134d1a7ce7bSmrg esac 135d1a7ce7bSmrg shift;; 136eaef79e5Smrg 137eaef79e5Smrg -o) chowncmd="$chownprog $2" 138d1a7ce7bSmrg shift;; 139eaef79e5Smrg 1402b32c8f7Smrg -s) stripcmd=$stripprog;; 141eaef79e5Smrg 142d1a7ce7bSmrg -t) 143d1a7ce7bSmrg is_target_a_directory=always 144d1a7ce7bSmrg dst_arg=$2 145d1a7ce7bSmrg # Protect names problematic for 'test' and other utilities. 146d1a7ce7bSmrg case $dst_arg in 147d1a7ce7bSmrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 148d1a7ce7bSmrg esac 149d1a7ce7bSmrg shift;; 150eaef79e5Smrg 151d1a7ce7bSmrg -T) is_target_a_directory=never;; 152eaef79e5Smrg 153eaef79e5Smrg --version) echo "$0 $scriptversion"; exit $?;; 154eaef79e5Smrg 155d1a7ce7bSmrg --) shift 156d1a7ce7bSmrg break;; 1572b32c8f7Smrg 158d1a7ce7bSmrg -*) echo "$0: invalid option: $1" >&2 159d1a7ce7bSmrg exit 1;; 1602b32c8f7Smrg 1612b32c8f7Smrg *) break;; 162eaef79e5Smrg esac 1632b32c8f7Smrg shift 164eaef79e5Smrgdone 165eaef79e5Smrg 166d1a7ce7bSmrg# We allow the use of options -d and -T together, by making -d 167d1a7ce7bSmrg# take the precedence; this is for compatibility with GNU install. 168d1a7ce7bSmrg 169d1a7ce7bSmrgif test -n "$dir_arg"; then 170d1a7ce7bSmrg if test -n "$dst_arg"; then 171d1a7ce7bSmrg echo "$0: target directory not allowed when installing a directory." >&2 172d1a7ce7bSmrg exit 1 173d1a7ce7bSmrg fi 174d1a7ce7bSmrgfi 175d1a7ce7bSmrg 1762b32c8f7Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 1772b32c8f7Smrg # When -d is used, all remaining arguments are directories to create. 1782b32c8f7Smrg # When -t is used, the destination is already specified. 1792b32c8f7Smrg # Otherwise, the last argument is the destination. Remove it from $@. 1802b32c8f7Smrg for arg 1812b32c8f7Smrg do 1822b32c8f7Smrg if test -n "$dst_arg"; then 1832b32c8f7Smrg # $@ is not empty: it contains at least $arg. 1842b32c8f7Smrg set fnord "$@" "$dst_arg" 1852b32c8f7Smrg shift # fnord 1862b32c8f7Smrg fi 1872b32c8f7Smrg shift # arg 1882b32c8f7Smrg dst_arg=$arg 189cbc4e2beSmrg # Protect names problematic for 'test' and other utilities. 190cbc4e2beSmrg case $dst_arg in 191cbc4e2beSmrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 192cbc4e2beSmrg esac 1932b32c8f7Smrg done 1942b32c8f7Smrgfi 1952b32c8f7Smrg 1962b32c8f7Smrgif test $# -eq 0; then 197eaef79e5Smrg if test -z "$dir_arg"; then 198eaef79e5Smrg echo "$0: no input file specified." >&2 199eaef79e5Smrg exit 1 200eaef79e5Smrg fi 201cbc4e2beSmrg # It's OK to call 'install-sh -d' without argument. 202eaef79e5Smrg # This can happen when creating conditional directories. 203eaef79e5Smrg exit 0 204eaef79e5Smrgfi 205eaef79e5Smrg 206d1a7ce7bSmrgif test -z "$dir_arg"; then 207d1a7ce7bSmrg if test $# -gt 1 || test "$is_target_a_directory" = always; then 208d1a7ce7bSmrg if test ! -d "$dst_arg"; then 209d1a7ce7bSmrg echo "$0: $dst_arg: Is not a directory." >&2 210d1a7ce7bSmrg exit 1 211d1a7ce7bSmrg fi 212d1a7ce7bSmrg fi 213d1a7ce7bSmrgfi 214d1a7ce7bSmrg 2152b32c8f7Smrgif test -z "$dir_arg"; then 216cbc4e2beSmrg do_exit='(exit $ret); exit $ret' 217cbc4e2beSmrg trap "ret=129; $do_exit" 1 218cbc4e2beSmrg trap "ret=130; $do_exit" 2 219cbc4e2beSmrg trap "ret=141; $do_exit" 13 220cbc4e2beSmrg trap "ret=143; $do_exit" 15 2212b32c8f7Smrg 2222b32c8f7Smrg # Set umask so as not to create temps with too-generous modes. 2232b32c8f7Smrg # However, 'strip' requires both read and write access to temps. 2242b32c8f7Smrg case $mode in 2252b32c8f7Smrg # Optimize common cases. 2262b32c8f7Smrg *644) cp_umask=133;; 2272b32c8f7Smrg *755) cp_umask=22;; 2282b32c8f7Smrg 2292b32c8f7Smrg *[0-7]) 2302b32c8f7Smrg if test -z "$stripcmd"; then 231d1a7ce7bSmrg u_plus_rw= 2322b32c8f7Smrg else 233d1a7ce7bSmrg u_plus_rw='% 200' 2342b32c8f7Smrg fi 2352b32c8f7Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2362b32c8f7Smrg *) 2372b32c8f7Smrg if test -z "$stripcmd"; then 238d1a7ce7bSmrg u_plus_rw= 2392b32c8f7Smrg else 240d1a7ce7bSmrg u_plus_rw=,u+rw 2412b32c8f7Smrg fi 2422b32c8f7Smrg cp_umask=$mode$u_plus_rw;; 2432b32c8f7Smrg esac 2442b32c8f7Smrgfi 2452b32c8f7Smrg 246eaef79e5Smrgfor src 247eaef79e5Smrgdo 248cbc4e2beSmrg # Protect names problematic for 'test' and other utilities. 249eaef79e5Smrg case $src in 250cbc4e2beSmrg -* | [=\(\)!]) src=./$src;; 251eaef79e5Smrg esac 252eaef79e5Smrg 253eaef79e5Smrg if test -n "$dir_arg"; then 254eaef79e5Smrg dst=$src 2552b32c8f7Smrg dstdir=$dst 2562b32c8f7Smrg test -d "$dstdir" 2572b32c8f7Smrg dstdir_status=$? 258eaef79e5Smrg else 2592b32c8f7Smrg 260eaef79e5Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 261eaef79e5Smrg # might cause directories to be created, which would be especially bad 262eaef79e5Smrg # if $src (and thus $dsttmp) contains '*'. 263eaef79e5Smrg if test ! -f "$src" && test ! -d "$src"; then 264eaef79e5Smrg echo "$0: $src does not exist." >&2 265eaef79e5Smrg exit 1 266eaef79e5Smrg fi 267eaef79e5Smrg 2682b32c8f7Smrg if test -z "$dst_arg"; then 269eaef79e5Smrg echo "$0: no destination specified." >&2 270eaef79e5Smrg exit 1 271eaef79e5Smrg fi 2722b32c8f7Smrg dst=$dst_arg 273eaef79e5Smrg 274eaef79e5Smrg # If destination is a directory, append the input filename; won't work 275eaef79e5Smrg # if double slashes aren't ignored. 276eaef79e5Smrg if test -d "$dst"; then 277d1a7ce7bSmrg if test "$is_target_a_directory" = never; then 278d1a7ce7bSmrg echo "$0: $dst_arg: Is a directory" >&2 279d1a7ce7bSmrg exit 1 280eaef79e5Smrg fi 2812b32c8f7Smrg dstdir=$dst 2822b32c8f7Smrg dst=$dstdir/`basename "$src"` 2832b32c8f7Smrg dstdir_status=0 2842b32c8f7Smrg else 285d1a7ce7bSmrg dstdir=`dirname "$dst"` 2862b32c8f7Smrg test -d "$dstdir" 2872b32c8f7Smrg dstdir_status=$? 288eaef79e5Smrg fi 289eaef79e5Smrg fi 290eaef79e5Smrg 2912b32c8f7Smrg obsolete_mkdir_used=false 2922b32c8f7Smrg 2932b32c8f7Smrg if test $dstdir_status != 0; then 2942b32c8f7Smrg case $posix_mkdir in 2952b32c8f7Smrg '') 296d1a7ce7bSmrg # Create intermediate dirs using mode 755 as modified by the umask. 297d1a7ce7bSmrg # This is like FreeBSD 'install' as of 1997-10-28. 298d1a7ce7bSmrg umask=`umask` 299d1a7ce7bSmrg case $stripcmd.$umask in 300d1a7ce7bSmrg # Optimize common cases. 301d1a7ce7bSmrg *[2367][2367]) mkdir_umask=$umask;; 302d1a7ce7bSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 303d1a7ce7bSmrg 304d1a7ce7bSmrg *[0-7]) 305d1a7ce7bSmrg mkdir_umask=`expr $umask + 22 \ 306d1a7ce7bSmrg - $umask % 100 % 40 + $umask % 20 \ 307d1a7ce7bSmrg - $umask % 10 % 4 + $umask % 2 308d1a7ce7bSmrg `;; 309d1a7ce7bSmrg *) mkdir_umask=$umask,go-w;; 310d1a7ce7bSmrg esac 311d1a7ce7bSmrg 312d1a7ce7bSmrg # With -d, create the new directory with the user-specified mode. 313d1a7ce7bSmrg # Otherwise, rely on $mkdir_umask. 314d1a7ce7bSmrg if test -n "$dir_arg"; then 315d1a7ce7bSmrg mkdir_mode=-m$mode 316d1a7ce7bSmrg else 317d1a7ce7bSmrg mkdir_mode= 318d1a7ce7bSmrg fi 319d1a7ce7bSmrg 320d1a7ce7bSmrg posix_mkdir=false 321d1a7ce7bSmrg case $umask in 322d1a7ce7bSmrg *[123567][0-7][0-7]) 323d1a7ce7bSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 324d1a7ce7bSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 325d1a7ce7bSmrg ;; 326d1a7ce7bSmrg *) 327d1a7ce7bSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 328d1a7ce7bSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 329d1a7ce7bSmrg 330d1a7ce7bSmrg if (umask $mkdir_umask && 331d1a7ce7bSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 332d1a7ce7bSmrg then 333d1a7ce7bSmrg if test -z "$dir_arg" || { 334d1a7ce7bSmrg # Check for POSIX incompatibilities with -m. 335d1a7ce7bSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 336d1a7ce7bSmrg # other-writable bit of parent directory when it shouldn't. 337d1a7ce7bSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 338d1a7ce7bSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 339d1a7ce7bSmrg case $ls_ld_tmpdir in 340d1a7ce7bSmrg d????-?r-*) different_mode=700;; 341d1a7ce7bSmrg d????-?--*) different_mode=755;; 342d1a7ce7bSmrg *) false;; 343d1a7ce7bSmrg esac && 344d1a7ce7bSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 345d1a7ce7bSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 346d1a7ce7bSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 347d1a7ce7bSmrg } 348d1a7ce7bSmrg } 349d1a7ce7bSmrg then posix_mkdir=: 350d1a7ce7bSmrg fi 351d1a7ce7bSmrg rmdir "$tmpdir/d" "$tmpdir" 352d1a7ce7bSmrg else 353d1a7ce7bSmrg # Remove any dirs left behind by ancient mkdir implementations. 354d1a7ce7bSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 355d1a7ce7bSmrg fi 356d1a7ce7bSmrg trap '' 0;; 357d1a7ce7bSmrg esac;; 3582b32c8f7Smrg esac 359eaef79e5Smrg 3602b32c8f7Smrg if 3612b32c8f7Smrg $posix_mkdir && ( 362d1a7ce7bSmrg umask $mkdir_umask && 363d1a7ce7bSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3642b32c8f7Smrg ) 3652b32c8f7Smrg then : 3662b32c8f7Smrg else 367eaef79e5Smrg 3682b32c8f7Smrg # The umask is ridiculous, or mkdir does not conform to POSIX, 3692b32c8f7Smrg # or it failed possibly due to a race condition. Create the 3702b32c8f7Smrg # directory the slow way, step by step, checking for races as we go. 371eaef79e5Smrg 3722b32c8f7Smrg case $dstdir in 373d1a7ce7bSmrg /*) prefix='/';; 374d1a7ce7bSmrg [-=\(\)!]*) prefix='./';; 375d1a7ce7bSmrg *) prefix='';; 3762b32c8f7Smrg esac 377eaef79e5Smrg 3782b32c8f7Smrg oIFS=$IFS 3792b32c8f7Smrg IFS=/ 380d1a7ce7bSmrg set -f 3812b32c8f7Smrg set fnord $dstdir 382eaef79e5Smrg shift 383d1a7ce7bSmrg set +f 3842b32c8f7Smrg IFS=$oIFS 3852b32c8f7Smrg 3862b32c8f7Smrg prefixes= 3872b32c8f7Smrg 3882b32c8f7Smrg for d 3892b32c8f7Smrg do 390d1a7ce7bSmrg test X"$d" = X && continue 391d1a7ce7bSmrg 392d1a7ce7bSmrg prefix=$prefix$d 393d1a7ce7bSmrg if test -d "$prefix"; then 394d1a7ce7bSmrg prefixes= 395d1a7ce7bSmrg else 396d1a7ce7bSmrg if $posix_mkdir; then 397d1a7ce7bSmrg (umask=$mkdir_umask && 398d1a7ce7bSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 399d1a7ce7bSmrg # Don't fail if two instances are running concurrently. 400d1a7ce7bSmrg test -d "$prefix" || exit 1 401d1a7ce7bSmrg else 402d1a7ce7bSmrg case $prefix in 403d1a7ce7bSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 404d1a7ce7bSmrg *) qprefix=$prefix;; 405d1a7ce7bSmrg esac 406d1a7ce7bSmrg prefixes="$prefixes '$qprefix'" 407d1a7ce7bSmrg fi 408d1a7ce7bSmrg fi 409d1a7ce7bSmrg prefix=$prefix/ 4102b32c8f7Smrg done 4112b32c8f7Smrg 4122b32c8f7Smrg if test -n "$prefixes"; then 413d1a7ce7bSmrg # Don't fail if two instances are running concurrently. 414d1a7ce7bSmrg (umask $mkdir_umask && 415d1a7ce7bSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 416d1a7ce7bSmrg test -d "$dstdir" || exit 1 417d1a7ce7bSmrg obsolete_mkdir_used=true 418eaef79e5Smrg fi 4192b32c8f7Smrg fi 420eaef79e5Smrg fi 421eaef79e5Smrg 422eaef79e5Smrg if test -n "$dir_arg"; then 4232b32c8f7Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4242b32c8f7Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4252b32c8f7Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4262b32c8f7Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 427eaef79e5Smrg else 428eaef79e5Smrg 429eaef79e5Smrg # Make a couple of temp file names in the proper directory. 430eaef79e5Smrg dsttmp=$dstdir/_inst.$$_ 431eaef79e5Smrg rmtmp=$dstdir/_rm.$$_ 432eaef79e5Smrg 433eaef79e5Smrg # Trap to clean up those temp files at exit. 434eaef79e5Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 435eaef79e5Smrg 436eaef79e5Smrg # Copy the file name to the temp name. 4372b32c8f7Smrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 438eaef79e5Smrg 439eaef79e5Smrg # and set any options; do chmod last to preserve setuid bits. 440eaef79e5Smrg # 441eaef79e5Smrg # If any of these fail, we abort the whole thing. If we want to 442eaef79e5Smrg # ignore errors from any of these, just make sure not to ignore 443eaef79e5Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 444eaef79e5Smrg # 4452b32c8f7Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 4462b32c8f7Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 4472b32c8f7Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 4482b32c8f7Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 4492b32c8f7Smrg 4502b32c8f7Smrg # If -C, don't bother to copy if it wouldn't change the file. 4512b32c8f7Smrg if $copy_on_change && 452d1a7ce7bSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 453d1a7ce7bSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 454d1a7ce7bSmrg set -f && 4552b32c8f7Smrg set X $old && old=:$2:$4:$5:$6 && 4562b32c8f7Smrg set X $new && new=:$2:$4:$5:$6 && 457d1a7ce7bSmrg set +f && 4582b32c8f7Smrg test "$old" = "$new" && 4592b32c8f7Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 4602b32c8f7Smrg then 4612b32c8f7Smrg rm -f "$dsttmp" 4622b32c8f7Smrg else 4632b32c8f7Smrg # Rename the file to the real destination. 4642b32c8f7Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 4652b32c8f7Smrg 4662b32c8f7Smrg # The rename failed, perhaps because mv can't rename something else 4672b32c8f7Smrg # to itself, or perhaps because mv is so ancient that it does not 4682b32c8f7Smrg # support -f. 4692b32c8f7Smrg { 470d1a7ce7bSmrg # Now remove or move aside any old file at destination location. 471d1a7ce7bSmrg # We try this two ways since rm can't unlink itself on some 472d1a7ce7bSmrg # systems and the destination file might be busy for other 473d1a7ce7bSmrg # reasons. In this case, the final cleanup might fail but the new 474d1a7ce7bSmrg # file should still install successfully. 475d1a7ce7bSmrg { 476d1a7ce7bSmrg test ! -f "$dst" || 477d1a7ce7bSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 478d1a7ce7bSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 479d1a7ce7bSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 480d1a7ce7bSmrg } || 481d1a7ce7bSmrg { echo "$0: cannot unlink or rename $dst" >&2 482d1a7ce7bSmrg (exit 1); exit 1 483d1a7ce7bSmrg } 484d1a7ce7bSmrg } && 485d1a7ce7bSmrg 486d1a7ce7bSmrg # Now rename the file to the real destination. 487d1a7ce7bSmrg $doit $mvcmd "$dsttmp" "$dst" 4882b32c8f7Smrg } 4892b32c8f7Smrg fi || exit 1 4902b32c8f7Smrg 4912b32c8f7Smrg trap '' 0 4922b32c8f7Smrg fi 493eaef79e5Smrgdone 494eaef79e5Smrg 495eaef79e5Smrg# Local variables: 496eaef79e5Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 497eaef79e5Smrg# time-stamp-start: "scriptversion=" 498eaef79e5Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 4992b32c8f7Smrg# time-stamp-time-zone: "UTC" 5002b32c8f7Smrg# time-stamp-end: "; # UTC" 501eaef79e5Smrg# End: 502