install-sh revision a5399cb1
1bb2e14f3Smrg#!/bin/sh 2bb2e14f3Smrg# install - install a program, script, or datafile 3bb2e14f3Smrg 4a5399cb1Smrgscriptversion=2009-04-28.21; # UTC 5bb2e14f3Smrg 6bb2e14f3Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 7bb2e14f3Smrg# later released in X11R6 (xc/config/util/install.sh) with the 8bb2e14f3Smrg# following copyright and license. 9bb2e14f3Smrg# 10bb2e14f3Smrg# Copyright (C) 1994 X Consortium 11bb2e14f3Smrg# 12bb2e14f3Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 13bb2e14f3Smrg# of this software and associated documentation files (the "Software"), to 14bb2e14f3Smrg# deal in the Software without restriction, including without limitation the 15bb2e14f3Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16bb2e14f3Smrg# sell copies of the Software, and to permit persons to whom the Software is 17bb2e14f3Smrg# furnished to do so, subject to the following conditions: 18bb2e14f3Smrg# 19bb2e14f3Smrg# The above copyright notice and this permission notice shall be included in 20bb2e14f3Smrg# all copies or substantial portions of the Software. 21bb2e14f3Smrg# 22bb2e14f3Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23bb2e14f3Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24bb2e14f3Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25bb2e14f3Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26bb2e14f3Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27bb2e14f3Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28bb2e14f3Smrg# 29bb2e14f3Smrg# Except as contained in this notice, the name of the X Consortium shall not 30bb2e14f3Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 31bb2e14f3Smrg# ings in this Software without prior written authorization from the X Consor- 32bb2e14f3Smrg# tium. 33bb2e14f3Smrg# 34bb2e14f3Smrg# 35bb2e14f3Smrg# FSF changes to this file are in the public domain. 36bb2e14f3Smrg# 37bb2e14f3Smrg# Calling this script install-sh is preferred over install.sh, to prevent 38bb2e14f3Smrg# `make' implicit rules from creating a file called install from it 39bb2e14f3Smrg# when there is no Makefile. 40bb2e14f3Smrg# 41bb2e14f3Smrg# This script is compatible with the BSD install script, but was written 42a5399cb1Smrg# from scratch. 43a5399cb1Smrg 44a5399cb1Smrgnl=' 45a5399cb1Smrg' 46a5399cb1SmrgIFS=" "" $nl" 47bb2e14f3Smrg 48bb2e14f3Smrg# set DOITPROG to echo to test this script 49bb2e14f3Smrg 50bb2e14f3Smrg# Don't use :- since 4.3BSD and earlier shells don't like it. 51a5399cb1Smrgdoit=${DOITPROG-} 52a5399cb1Smrgif test -z "$doit"; then 53a5399cb1Smrg doit_exec=exec 54a5399cb1Smrgelse 55a5399cb1Smrg doit_exec=$doit 56a5399cb1Smrgfi 57bb2e14f3Smrg 58a5399cb1Smrg# Put in absolute file names if you don't have them in your path; 59a5399cb1Smrg# or use environment vars. 60a5399cb1Smrg 61a5399cb1Smrgchgrpprog=${CHGRPPROG-chgrp} 62a5399cb1Smrgchmodprog=${CHMODPROG-chmod} 63a5399cb1Smrgchownprog=${CHOWNPROG-chown} 64a5399cb1Smrgcmpprog=${CMPPROG-cmp} 65a5399cb1Smrgcpprog=${CPPROG-cp} 66a5399cb1Smrgmkdirprog=${MKDIRPROG-mkdir} 67a5399cb1Smrgmvprog=${MVPROG-mv} 68a5399cb1Smrgrmprog=${RMPROG-rm} 69a5399cb1Smrgstripprog=${STRIPPROG-strip} 70a5399cb1Smrg 71a5399cb1Smrgposix_glob='?' 72a5399cb1Smrginitialize_posix_glob=' 73a5399cb1Smrg test "$posix_glob" != "?" || { 74a5399cb1Smrg if (set -f) 2>/dev/null; then 75a5399cb1Smrg posix_glob= 76a5399cb1Smrg else 77a5399cb1Smrg posix_glob=: 78a5399cb1Smrg fi 79a5399cb1Smrg } 80a5399cb1Smrg' 81bb2e14f3Smrg 82a5399cb1Smrgposix_mkdir= 83a5399cb1Smrg 84a5399cb1Smrg# Desired mode of installed file. 85a5399cb1Smrgmode=0755 86bb2e14f3Smrg 87bb2e14f3Smrgchgrpcmd= 88a5399cb1Smrgchmodcmd=$chmodprog 89a5399cb1Smrgchowncmd= 90a5399cb1Smrgmvcmd=$mvprog 91bb2e14f3Smrgrmcmd="$rmprog -f" 92a5399cb1Smrgstripcmd= 93a5399cb1Smrg 94bb2e14f3Smrgsrc= 95bb2e14f3Smrgdst= 96bb2e14f3Smrgdir_arg= 97a5399cb1Smrgdst_arg= 98a5399cb1Smrg 99a5399cb1Smrgcopy_on_change=false 100bb2e14f3Smrgno_target_directory= 101bb2e14f3Smrg 102a5399cb1Smrgusage="\ 103a5399cb1SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104bb2e14f3Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 105bb2e14f3Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106bb2e14f3Smrg or: $0 [OPTION]... -d DIRECTORIES... 107bb2e14f3Smrg 108bb2e14f3SmrgIn the 1st form, copy SRCFILE to DSTFILE. 109bb2e14f3SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110bb2e14f3SmrgIn the 4th, create DIRECTORIES. 111bb2e14f3Smrg 112bb2e14f3SmrgOptions: 113a5399cb1Smrg --help display this help and exit. 114a5399cb1Smrg --version display version info and exit. 115a5399cb1Smrg 116a5399cb1Smrg -c (ignored) 117a5399cb1Smrg -C install only if different (preserve the last data modification time) 118a5399cb1Smrg -d create directories instead of installing files. 119a5399cb1Smrg -g GROUP $chgrpprog installed files to GROUP. 120a5399cb1Smrg -m MODE $chmodprog installed files to MODE. 121a5399cb1Smrg -o USER $chownprog installed files to USER. 122a5399cb1Smrg -s $stripprog installed files. 123a5399cb1Smrg -t DIRECTORY install into DIRECTORY. 124a5399cb1Smrg -T report an error if DSTFILE is a directory. 125bb2e14f3Smrg 126bb2e14f3SmrgEnvironment variables override the default commands: 127a5399cb1Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128a5399cb1Smrg RMPROG STRIPPROG 129bb2e14f3Smrg" 130bb2e14f3Smrg 131a5399cb1Smrgwhile test $# -ne 0; do 132bb2e14f3Smrg case $1 in 133a5399cb1Smrg -c) ;; 134a5399cb1Smrg 135a5399cb1Smrg -C) copy_on_change=true;; 136bb2e14f3Smrg 137a5399cb1Smrg -d) dir_arg=true;; 138bb2e14f3Smrg 139bb2e14f3Smrg -g) chgrpcmd="$chgrpprog $2" 140a5399cb1Smrg shift;; 141bb2e14f3Smrg 142bb2e14f3Smrg --help) echo "$usage"; exit $?;; 143bb2e14f3Smrg 144a5399cb1Smrg -m) mode=$2 145a5399cb1Smrg case $mode in 146a5399cb1Smrg *' '* | *' '* | *' 147a5399cb1Smrg'* | *'*'* | *'?'* | *'['*) 148a5399cb1Smrg echo "$0: invalid mode: $mode" >&2 149a5399cb1Smrg exit 1;; 150a5399cb1Smrg esac 151a5399cb1Smrg shift;; 152bb2e14f3Smrg 153bb2e14f3Smrg -o) chowncmd="$chownprog $2" 154a5399cb1Smrg shift;; 155bb2e14f3Smrg 156a5399cb1Smrg -s) stripcmd=$stripprog;; 157bb2e14f3Smrg 158a5399cb1Smrg -t) dst_arg=$2 159a5399cb1Smrg shift;; 160bb2e14f3Smrg 161a5399cb1Smrg -T) no_target_directory=true;; 162bb2e14f3Smrg 163bb2e14f3Smrg --version) echo "$0 $scriptversion"; exit $?;; 164bb2e14f3Smrg 165a5399cb1Smrg --) shift 166bb2e14f3Smrg break;; 167a5399cb1Smrg 168a5399cb1Smrg -*) echo "$0: invalid option: $1" >&2 169a5399cb1Smrg exit 1;; 170a5399cb1Smrg 171a5399cb1Smrg *) break;; 172bb2e14f3Smrg esac 173a5399cb1Smrg shift 174bb2e14f3Smrgdone 175bb2e14f3Smrg 176a5399cb1Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 177a5399cb1Smrg # When -d is used, all remaining arguments are directories to create. 178a5399cb1Smrg # When -t is used, the destination is already specified. 179a5399cb1Smrg # Otherwise, the last argument is the destination. Remove it from $@. 180a5399cb1Smrg for arg 181a5399cb1Smrg do 182a5399cb1Smrg if test -n "$dst_arg"; then 183a5399cb1Smrg # $@ is not empty: it contains at least $arg. 184a5399cb1Smrg set fnord "$@" "$dst_arg" 185a5399cb1Smrg shift # fnord 186a5399cb1Smrg fi 187a5399cb1Smrg shift # arg 188a5399cb1Smrg dst_arg=$arg 189a5399cb1Smrg done 190a5399cb1Smrgfi 191a5399cb1Smrg 192a5399cb1Smrgif test $# -eq 0; then 193bb2e14f3Smrg if test -z "$dir_arg"; then 194bb2e14f3Smrg echo "$0: no input file specified." >&2 195bb2e14f3Smrg exit 1 196bb2e14f3Smrg fi 197bb2e14f3Smrg # It's OK to call `install-sh -d' without argument. 198bb2e14f3Smrg # This can happen when creating conditional directories. 199bb2e14f3Smrg exit 0 200bb2e14f3Smrgfi 201bb2e14f3Smrg 202a5399cb1Smrgif test -z "$dir_arg"; then 203a5399cb1Smrg trap '(exit $?); exit' 1 2 13 15 204a5399cb1Smrg 205a5399cb1Smrg # Set umask so as not to create temps with too-generous modes. 206a5399cb1Smrg # However, 'strip' requires both read and write access to temps. 207a5399cb1Smrg case $mode in 208a5399cb1Smrg # Optimize common cases. 209a5399cb1Smrg *644) cp_umask=133;; 210a5399cb1Smrg *755) cp_umask=22;; 211a5399cb1Smrg 212a5399cb1Smrg *[0-7]) 213a5399cb1Smrg if test -z "$stripcmd"; then 214a5399cb1Smrg u_plus_rw= 215a5399cb1Smrg else 216a5399cb1Smrg u_plus_rw='% 200' 217a5399cb1Smrg fi 218a5399cb1Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 219a5399cb1Smrg *) 220a5399cb1Smrg if test -z "$stripcmd"; then 221a5399cb1Smrg u_plus_rw= 222a5399cb1Smrg else 223a5399cb1Smrg u_plus_rw=,u+rw 224a5399cb1Smrg fi 225a5399cb1Smrg cp_umask=$mode$u_plus_rw;; 226a5399cb1Smrg esac 227a5399cb1Smrgfi 228a5399cb1Smrg 229bb2e14f3Smrgfor src 230bb2e14f3Smrgdo 231bb2e14f3Smrg # Protect names starting with `-'. 232bb2e14f3Smrg case $src in 233a5399cb1Smrg -*) src=./$src;; 234bb2e14f3Smrg esac 235bb2e14f3Smrg 236bb2e14f3Smrg if test -n "$dir_arg"; then 237bb2e14f3Smrg dst=$src 238a5399cb1Smrg dstdir=$dst 239a5399cb1Smrg test -d "$dstdir" 240a5399cb1Smrg dstdir_status=$? 241bb2e14f3Smrg else 242a5399cb1Smrg 243bb2e14f3Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 244bb2e14f3Smrg # might cause directories to be created, which would be especially bad 245bb2e14f3Smrg # if $src (and thus $dsttmp) contains '*'. 246bb2e14f3Smrg if test ! -f "$src" && test ! -d "$src"; then 247bb2e14f3Smrg echo "$0: $src does not exist." >&2 248bb2e14f3Smrg exit 1 249bb2e14f3Smrg fi 250bb2e14f3Smrg 251a5399cb1Smrg if test -z "$dst_arg"; then 252bb2e14f3Smrg echo "$0: no destination specified." >&2 253bb2e14f3Smrg exit 1 254bb2e14f3Smrg fi 255bb2e14f3Smrg 256a5399cb1Smrg dst=$dst_arg 257bb2e14f3Smrg # Protect names starting with `-'. 258bb2e14f3Smrg case $dst in 259a5399cb1Smrg -*) dst=./$dst;; 260bb2e14f3Smrg esac 261bb2e14f3Smrg 262bb2e14f3Smrg # If destination is a directory, append the input filename; won't work 263bb2e14f3Smrg # if double slashes aren't ignored. 264bb2e14f3Smrg if test -d "$dst"; then 265bb2e14f3Smrg if test -n "$no_target_directory"; then 266a5399cb1Smrg echo "$0: $dst_arg: Is a directory" >&2 267bb2e14f3Smrg exit 1 268bb2e14f3Smrg fi 269a5399cb1Smrg dstdir=$dst 270a5399cb1Smrg dst=$dstdir/`basename "$src"` 271a5399cb1Smrg dstdir_status=0 272a5399cb1Smrg else 273a5399cb1Smrg # Prefer dirname, but fall back on a substitute if dirname fails. 274a5399cb1Smrg dstdir=` 275a5399cb1Smrg (dirname "$dst") 2>/dev/null || 276a5399cb1Smrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 277a5399cb1Smrg X"$dst" : 'X\(//\)[^/]' \| \ 278a5399cb1Smrg X"$dst" : 'X\(//\)$' \| \ 279a5399cb1Smrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 280a5399cb1Smrg echo X"$dst" | 281a5399cb1Smrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 282a5399cb1Smrg s//\1/ 283a5399cb1Smrg q 284a5399cb1Smrg } 285a5399cb1Smrg /^X\(\/\/\)[^/].*/{ 286a5399cb1Smrg s//\1/ 287a5399cb1Smrg q 288a5399cb1Smrg } 289a5399cb1Smrg /^X\(\/\/\)$/{ 290a5399cb1Smrg s//\1/ 291a5399cb1Smrg q 292a5399cb1Smrg } 293a5399cb1Smrg /^X\(\/\).*/{ 294a5399cb1Smrg s//\1/ 295a5399cb1Smrg q 296a5399cb1Smrg } 297a5399cb1Smrg s/.*/./; q' 298a5399cb1Smrg ` 299a5399cb1Smrg 300a5399cb1Smrg test -d "$dstdir" 301a5399cb1Smrg dstdir_status=$? 302bb2e14f3Smrg fi 303bb2e14f3Smrg fi 304bb2e14f3Smrg 305a5399cb1Smrg obsolete_mkdir_used=false 306a5399cb1Smrg 307a5399cb1Smrg if test $dstdir_status != 0; then 308a5399cb1Smrg case $posix_mkdir in 309a5399cb1Smrg '') 310a5399cb1Smrg # Create intermediate dirs using mode 755 as modified by the umask. 311a5399cb1Smrg # This is like FreeBSD 'install' as of 1997-10-28. 312a5399cb1Smrg umask=`umask` 313a5399cb1Smrg case $stripcmd.$umask in 314a5399cb1Smrg # Optimize common cases. 315a5399cb1Smrg *[2367][2367]) mkdir_umask=$umask;; 316a5399cb1Smrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 317a5399cb1Smrg 318a5399cb1Smrg *[0-7]) 319a5399cb1Smrg mkdir_umask=`expr $umask + 22 \ 320a5399cb1Smrg - $umask % 100 % 40 + $umask % 20 \ 321a5399cb1Smrg - $umask % 10 % 4 + $umask % 2 322a5399cb1Smrg `;; 323a5399cb1Smrg *) mkdir_umask=$umask,go-w;; 324a5399cb1Smrg esac 325a5399cb1Smrg 326a5399cb1Smrg # With -d, create the new directory with the user-specified mode. 327a5399cb1Smrg # Otherwise, rely on $mkdir_umask. 328a5399cb1Smrg if test -n "$dir_arg"; then 329a5399cb1Smrg mkdir_mode=-m$mode 330a5399cb1Smrg else 331a5399cb1Smrg mkdir_mode= 332a5399cb1Smrg fi 333a5399cb1Smrg 334a5399cb1Smrg posix_mkdir=false 335a5399cb1Smrg case $umask in 336a5399cb1Smrg *[123567][0-7][0-7]) 337a5399cb1Smrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 338a5399cb1Smrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 339a5399cb1Smrg ;; 340a5399cb1Smrg *) 341a5399cb1Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 342a5399cb1Smrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 343a5399cb1Smrg 344a5399cb1Smrg if (umask $mkdir_umask && 345a5399cb1Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 346a5399cb1Smrg then 347a5399cb1Smrg if test -z "$dir_arg" || { 348a5399cb1Smrg # Check for POSIX incompatibilities with -m. 349a5399cb1Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 350a5399cb1Smrg # other-writeable bit of parent directory when it shouldn't. 351a5399cb1Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 352a5399cb1Smrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 353a5399cb1Smrg case $ls_ld_tmpdir in 354a5399cb1Smrg d????-?r-*) different_mode=700;; 355a5399cb1Smrg d????-?--*) different_mode=755;; 356a5399cb1Smrg *) false;; 357a5399cb1Smrg esac && 358a5399cb1Smrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 359a5399cb1Smrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 360a5399cb1Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 361a5399cb1Smrg } 362a5399cb1Smrg } 363a5399cb1Smrg then posix_mkdir=: 364a5399cb1Smrg fi 365a5399cb1Smrg rmdir "$tmpdir/d" "$tmpdir" 366a5399cb1Smrg else 367a5399cb1Smrg # Remove any dirs left behind by ancient mkdir implementations. 368a5399cb1Smrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 369a5399cb1Smrg fi 370a5399cb1Smrg trap '' 0;; 371a5399cb1Smrg esac;; 372a5399cb1Smrg esac 373bb2e14f3Smrg 374a5399cb1Smrg if 375a5399cb1Smrg $posix_mkdir && ( 376a5399cb1Smrg umask $mkdir_umask && 377a5399cb1Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 378a5399cb1Smrg ) 379a5399cb1Smrg then : 380a5399cb1Smrg else 381bb2e14f3Smrg 382a5399cb1Smrg # The umask is ridiculous, or mkdir does not conform to POSIX, 383a5399cb1Smrg # or it failed possibly due to a race condition. Create the 384a5399cb1Smrg # directory the slow way, step by step, checking for races as we go. 385bb2e14f3Smrg 386a5399cb1Smrg case $dstdir in 387a5399cb1Smrg /*) prefix='/';; 388a5399cb1Smrg -*) prefix='./';; 389a5399cb1Smrg *) prefix='';; 390a5399cb1Smrg esac 391bb2e14f3Smrg 392a5399cb1Smrg eval "$initialize_posix_glob" 393bb2e14f3Smrg 394a5399cb1Smrg oIFS=$IFS 395a5399cb1Smrg IFS=/ 396a5399cb1Smrg $posix_glob set -f 397a5399cb1Smrg set fnord $dstdir 398bb2e14f3Smrg shift 399a5399cb1Smrg $posix_glob set +f 400a5399cb1Smrg IFS=$oIFS 401a5399cb1Smrg 402a5399cb1Smrg prefixes= 403a5399cb1Smrg 404a5399cb1Smrg for d 405a5399cb1Smrg do 406a5399cb1Smrg test -z "$d" && continue 407a5399cb1Smrg 408a5399cb1Smrg prefix=$prefix$d 409a5399cb1Smrg if test -d "$prefix"; then 410a5399cb1Smrg prefixes= 411a5399cb1Smrg else 412a5399cb1Smrg if $posix_mkdir; then 413a5399cb1Smrg (umask=$mkdir_umask && 414a5399cb1Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 415a5399cb1Smrg # Don't fail if two instances are running concurrently. 416a5399cb1Smrg test -d "$prefix" || exit 1 417a5399cb1Smrg else 418a5399cb1Smrg case $prefix in 419a5399cb1Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 420a5399cb1Smrg *) qprefix=$prefix;; 421a5399cb1Smrg esac 422a5399cb1Smrg prefixes="$prefixes '$qprefix'" 423a5399cb1Smrg fi 424a5399cb1Smrg fi 425a5399cb1Smrg prefix=$prefix/ 426a5399cb1Smrg done 427a5399cb1Smrg 428a5399cb1Smrg if test -n "$prefixes"; then 429a5399cb1Smrg # Don't fail if two instances are running concurrently. 430a5399cb1Smrg (umask $mkdir_umask && 431a5399cb1Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 432a5399cb1Smrg test -d "$dstdir" || exit 1 433a5399cb1Smrg obsolete_mkdir_used=true 434bb2e14f3Smrg fi 435a5399cb1Smrg fi 436bb2e14f3Smrg fi 437bb2e14f3Smrg 438bb2e14f3Smrg if test -n "$dir_arg"; then 439a5399cb1Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 440a5399cb1Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 441a5399cb1Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 442a5399cb1Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 443bb2e14f3Smrg else 444bb2e14f3Smrg 445bb2e14f3Smrg # Make a couple of temp file names in the proper directory. 446bb2e14f3Smrg dsttmp=$dstdir/_inst.$$_ 447bb2e14f3Smrg rmtmp=$dstdir/_rm.$$_ 448bb2e14f3Smrg 449bb2e14f3Smrg # Trap to clean up those temp files at exit. 450bb2e14f3Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 451bb2e14f3Smrg 452bb2e14f3Smrg # Copy the file name to the temp name. 453a5399cb1Smrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 454bb2e14f3Smrg 455bb2e14f3Smrg # and set any options; do chmod last to preserve setuid bits. 456bb2e14f3Smrg # 457bb2e14f3Smrg # If any of these fail, we abort the whole thing. If we want to 458bb2e14f3Smrg # ignore errors from any of these, just make sure not to ignore 459bb2e14f3Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 460bb2e14f3Smrg # 461a5399cb1Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 462a5399cb1Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 463a5399cb1Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 464a5399cb1Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 465a5399cb1Smrg 466a5399cb1Smrg # If -C, don't bother to copy if it wouldn't change the file. 467a5399cb1Smrg if $copy_on_change && 468a5399cb1Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 469a5399cb1Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 470a5399cb1Smrg 471a5399cb1Smrg eval "$initialize_posix_glob" && 472a5399cb1Smrg $posix_glob set -f && 473a5399cb1Smrg set X $old && old=:$2:$4:$5:$6 && 474a5399cb1Smrg set X $new && new=:$2:$4:$5:$6 && 475a5399cb1Smrg $posix_glob set +f && 476a5399cb1Smrg 477a5399cb1Smrg test "$old" = "$new" && 478a5399cb1Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 479a5399cb1Smrg then 480a5399cb1Smrg rm -f "$dsttmp" 481a5399cb1Smrg else 482a5399cb1Smrg # Rename the file to the real destination. 483a5399cb1Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 484a5399cb1Smrg 485a5399cb1Smrg # The rename failed, perhaps because mv can't rename something else 486a5399cb1Smrg # to itself, or perhaps because mv is so ancient that it does not 487a5399cb1Smrg # support -f. 488a5399cb1Smrg { 489a5399cb1Smrg # Now remove or move aside any old file at destination location. 490a5399cb1Smrg # We try this two ways since rm can't unlink itself on some 491a5399cb1Smrg # systems and the destination file might be busy for other 492a5399cb1Smrg # reasons. In this case, the final cleanup might fail but the new 493a5399cb1Smrg # file should still install successfully. 494a5399cb1Smrg { 495a5399cb1Smrg test ! -f "$dst" || 496a5399cb1Smrg $doit $rmcmd -f "$dst" 2>/dev/null || 497a5399cb1Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 498a5399cb1Smrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 499a5399cb1Smrg } || 500a5399cb1Smrg { echo "$0: cannot unlink or rename $dst" >&2 501a5399cb1Smrg (exit 1); exit 1 502a5399cb1Smrg } 503a5399cb1Smrg } && 504a5399cb1Smrg 505a5399cb1Smrg # Now rename the file to the real destination. 506a5399cb1Smrg $doit $mvcmd "$dsttmp" "$dst" 507a5399cb1Smrg } 508a5399cb1Smrg fi || exit 1 509a5399cb1Smrg 510a5399cb1Smrg trap '' 0 511a5399cb1Smrg fi 512bb2e14f3Smrgdone 513bb2e14f3Smrg 514bb2e14f3Smrg# Local variables: 515bb2e14f3Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 516bb2e14f3Smrg# time-stamp-start: "scriptversion=" 517bb2e14f3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 518a5399cb1Smrg# time-stamp-time-zone: "UTC" 519a5399cb1Smrg# time-stamp-end: "; # UTC" 520bb2e14f3Smrg# End: 521