install-sh revision 39f9c979
1bb2e14f3Smrg#!/bin/sh 2bb2e14f3Smrg# install - install a program, script, or datafile 3bb2e14f3Smrg 439f9c979Smrgscriptversion=2011-11-20.07; # 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 3839f9c979Smrg# '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 15939f9c979Smrg # Protect names problematic for 'test' and other utilities. 16039f9c979Smrg case $dst_arg in 16139f9c979Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 16239f9c979Smrg esac 163a5399cb1Smrg shift;; 164bb2e14f3Smrg 165a5399cb1Smrg -T) no_target_directory=true;; 166bb2e14f3Smrg 167bb2e14f3Smrg --version) echo "$0 $scriptversion"; exit $?;; 168bb2e14f3Smrg 169a5399cb1Smrg --) shift 170bb2e14f3Smrg break;; 171a5399cb1Smrg 172a5399cb1Smrg -*) echo "$0: invalid option: $1" >&2 173a5399cb1Smrg exit 1;; 174a5399cb1Smrg 175a5399cb1Smrg *) break;; 176bb2e14f3Smrg esac 177a5399cb1Smrg shift 178bb2e14f3Smrgdone 179bb2e14f3Smrg 180a5399cb1Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 181a5399cb1Smrg # When -d is used, all remaining arguments are directories to create. 182a5399cb1Smrg # When -t is used, the destination is already specified. 183a5399cb1Smrg # Otherwise, the last argument is the destination. Remove it from $@. 184a5399cb1Smrg for arg 185a5399cb1Smrg do 186a5399cb1Smrg if test -n "$dst_arg"; then 187a5399cb1Smrg # $@ is not empty: it contains at least $arg. 188a5399cb1Smrg set fnord "$@" "$dst_arg" 189a5399cb1Smrg shift # fnord 190a5399cb1Smrg fi 191a5399cb1Smrg shift # arg 192a5399cb1Smrg dst_arg=$arg 19339f9c979Smrg # Protect names problematic for 'test' and other utilities. 19439f9c979Smrg case $dst_arg in 19539f9c979Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 19639f9c979Smrg esac 197a5399cb1Smrg done 198a5399cb1Smrgfi 199a5399cb1Smrg 200a5399cb1Smrgif test $# -eq 0; then 201bb2e14f3Smrg if test -z "$dir_arg"; then 202bb2e14f3Smrg echo "$0: no input file specified." >&2 203bb2e14f3Smrg exit 1 204bb2e14f3Smrg fi 20539f9c979Smrg # It's OK to call 'install-sh -d' without argument. 206bb2e14f3Smrg # This can happen when creating conditional directories. 207bb2e14f3Smrg exit 0 208bb2e14f3Smrgfi 209bb2e14f3Smrg 210a5399cb1Smrgif test -z "$dir_arg"; then 21139f9c979Smrg do_exit='(exit $ret); exit $ret' 21239f9c979Smrg trap "ret=129; $do_exit" 1 21339f9c979Smrg trap "ret=130; $do_exit" 2 21439f9c979Smrg trap "ret=141; $do_exit" 13 21539f9c979Smrg trap "ret=143; $do_exit" 15 216a5399cb1Smrg 217a5399cb1Smrg # Set umask so as not to create temps with too-generous modes. 218a5399cb1Smrg # However, 'strip' requires both read and write access to temps. 219a5399cb1Smrg case $mode in 220a5399cb1Smrg # Optimize common cases. 221a5399cb1Smrg *644) cp_umask=133;; 222a5399cb1Smrg *755) cp_umask=22;; 223a5399cb1Smrg 224a5399cb1Smrg *[0-7]) 225a5399cb1Smrg if test -z "$stripcmd"; then 226a5399cb1Smrg u_plus_rw= 227a5399cb1Smrg else 228a5399cb1Smrg u_plus_rw='% 200' 229a5399cb1Smrg fi 230a5399cb1Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 231a5399cb1Smrg *) 232a5399cb1Smrg if test -z "$stripcmd"; then 233a5399cb1Smrg u_plus_rw= 234a5399cb1Smrg else 235a5399cb1Smrg u_plus_rw=,u+rw 236a5399cb1Smrg fi 237a5399cb1Smrg cp_umask=$mode$u_plus_rw;; 238a5399cb1Smrg esac 239a5399cb1Smrgfi 240a5399cb1Smrg 241bb2e14f3Smrgfor src 242bb2e14f3Smrgdo 24339f9c979Smrg # Protect names problematic for 'test' and other utilities. 244bb2e14f3Smrg case $src in 24539f9c979Smrg -* | [=\(\)!]) src=./$src;; 246bb2e14f3Smrg esac 247bb2e14f3Smrg 248bb2e14f3Smrg if test -n "$dir_arg"; then 249bb2e14f3Smrg dst=$src 250a5399cb1Smrg dstdir=$dst 251a5399cb1Smrg test -d "$dstdir" 252a5399cb1Smrg dstdir_status=$? 253bb2e14f3Smrg else 254a5399cb1Smrg 255bb2e14f3Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 256bb2e14f3Smrg # might cause directories to be created, which would be especially bad 257bb2e14f3Smrg # if $src (and thus $dsttmp) contains '*'. 258bb2e14f3Smrg if test ! -f "$src" && test ! -d "$src"; then 259bb2e14f3Smrg echo "$0: $src does not exist." >&2 260bb2e14f3Smrg exit 1 261bb2e14f3Smrg fi 262bb2e14f3Smrg 263a5399cb1Smrg if test -z "$dst_arg"; then 264bb2e14f3Smrg echo "$0: no destination specified." >&2 265bb2e14f3Smrg exit 1 266bb2e14f3Smrg fi 267a5399cb1Smrg dst=$dst_arg 268bb2e14f3Smrg 269bb2e14f3Smrg # If destination is a directory, append the input filename; won't work 270bb2e14f3Smrg # if double slashes aren't ignored. 271bb2e14f3Smrg if test -d "$dst"; then 272bb2e14f3Smrg if test -n "$no_target_directory"; then 273a5399cb1Smrg echo "$0: $dst_arg: Is a directory" >&2 274bb2e14f3Smrg exit 1 275bb2e14f3Smrg fi 276a5399cb1Smrg dstdir=$dst 277a5399cb1Smrg dst=$dstdir/`basename "$src"` 278a5399cb1Smrg dstdir_status=0 279a5399cb1Smrg else 280a5399cb1Smrg # Prefer dirname, but fall back on a substitute if dirname fails. 281a5399cb1Smrg dstdir=` 282a5399cb1Smrg (dirname "$dst") 2>/dev/null || 283a5399cb1Smrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 284a5399cb1Smrg X"$dst" : 'X\(//\)[^/]' \| \ 285a5399cb1Smrg X"$dst" : 'X\(//\)$' \| \ 286a5399cb1Smrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 287a5399cb1Smrg echo X"$dst" | 288a5399cb1Smrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 289a5399cb1Smrg s//\1/ 290a5399cb1Smrg q 291a5399cb1Smrg } 292a5399cb1Smrg /^X\(\/\/\)[^/].*/{ 293a5399cb1Smrg s//\1/ 294a5399cb1Smrg q 295a5399cb1Smrg } 296a5399cb1Smrg /^X\(\/\/\)$/{ 297a5399cb1Smrg s//\1/ 298a5399cb1Smrg q 299a5399cb1Smrg } 300a5399cb1Smrg /^X\(\/\).*/{ 301a5399cb1Smrg s//\1/ 302a5399cb1Smrg q 303a5399cb1Smrg } 304a5399cb1Smrg s/.*/./; q' 305a5399cb1Smrg ` 306a5399cb1Smrg 307a5399cb1Smrg test -d "$dstdir" 308a5399cb1Smrg dstdir_status=$? 309bb2e14f3Smrg fi 310bb2e14f3Smrg fi 311bb2e14f3Smrg 312a5399cb1Smrg obsolete_mkdir_used=false 313a5399cb1Smrg 314a5399cb1Smrg if test $dstdir_status != 0; then 315a5399cb1Smrg case $posix_mkdir in 316a5399cb1Smrg '') 317a5399cb1Smrg # Create intermediate dirs using mode 755 as modified by the umask. 318a5399cb1Smrg # This is like FreeBSD 'install' as of 1997-10-28. 319a5399cb1Smrg umask=`umask` 320a5399cb1Smrg case $stripcmd.$umask in 321a5399cb1Smrg # Optimize common cases. 322a5399cb1Smrg *[2367][2367]) mkdir_umask=$umask;; 323a5399cb1Smrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 324a5399cb1Smrg 325a5399cb1Smrg *[0-7]) 326a5399cb1Smrg mkdir_umask=`expr $umask + 22 \ 327a5399cb1Smrg - $umask % 100 % 40 + $umask % 20 \ 328a5399cb1Smrg - $umask % 10 % 4 + $umask % 2 329a5399cb1Smrg `;; 330a5399cb1Smrg *) mkdir_umask=$umask,go-w;; 331a5399cb1Smrg esac 332a5399cb1Smrg 333a5399cb1Smrg # With -d, create the new directory with the user-specified mode. 334a5399cb1Smrg # Otherwise, rely on $mkdir_umask. 335a5399cb1Smrg if test -n "$dir_arg"; then 336a5399cb1Smrg mkdir_mode=-m$mode 337a5399cb1Smrg else 338a5399cb1Smrg mkdir_mode= 339a5399cb1Smrg fi 340a5399cb1Smrg 341a5399cb1Smrg posix_mkdir=false 342a5399cb1Smrg case $umask in 343a5399cb1Smrg *[123567][0-7][0-7]) 344a5399cb1Smrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 345a5399cb1Smrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 346a5399cb1Smrg ;; 347a5399cb1Smrg *) 348a5399cb1Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 349a5399cb1Smrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 350a5399cb1Smrg 351a5399cb1Smrg if (umask $mkdir_umask && 352a5399cb1Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 353a5399cb1Smrg then 354a5399cb1Smrg if test -z "$dir_arg" || { 355a5399cb1Smrg # Check for POSIX incompatibilities with -m. 356a5399cb1Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35739f9c979Smrg # other-writable bit of parent directory when it shouldn't. 358a5399cb1Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 359a5399cb1Smrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 360a5399cb1Smrg case $ls_ld_tmpdir in 361a5399cb1Smrg d????-?r-*) different_mode=700;; 362a5399cb1Smrg d????-?--*) different_mode=755;; 363a5399cb1Smrg *) false;; 364a5399cb1Smrg esac && 365a5399cb1Smrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 366a5399cb1Smrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 367a5399cb1Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 368a5399cb1Smrg } 369a5399cb1Smrg } 370a5399cb1Smrg then posix_mkdir=: 371a5399cb1Smrg fi 372a5399cb1Smrg rmdir "$tmpdir/d" "$tmpdir" 373a5399cb1Smrg else 374a5399cb1Smrg # Remove any dirs left behind by ancient mkdir implementations. 375a5399cb1Smrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 376a5399cb1Smrg fi 377a5399cb1Smrg trap '' 0;; 378a5399cb1Smrg esac;; 379a5399cb1Smrg esac 380bb2e14f3Smrg 381a5399cb1Smrg if 382a5399cb1Smrg $posix_mkdir && ( 383a5399cb1Smrg umask $mkdir_umask && 384a5399cb1Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 385a5399cb1Smrg ) 386a5399cb1Smrg then : 387a5399cb1Smrg else 388bb2e14f3Smrg 389a5399cb1Smrg # The umask is ridiculous, or mkdir does not conform to POSIX, 390a5399cb1Smrg # or it failed possibly due to a race condition. Create the 391a5399cb1Smrg # directory the slow way, step by step, checking for races as we go. 392bb2e14f3Smrg 393a5399cb1Smrg case $dstdir in 394a5399cb1Smrg /*) prefix='/';; 39539f9c979Smrg [-=\(\)!]*) prefix='./';; 396a5399cb1Smrg *) prefix='';; 397a5399cb1Smrg esac 398bb2e14f3Smrg 399a5399cb1Smrg eval "$initialize_posix_glob" 400bb2e14f3Smrg 401a5399cb1Smrg oIFS=$IFS 402a5399cb1Smrg IFS=/ 403a5399cb1Smrg $posix_glob set -f 404a5399cb1Smrg set fnord $dstdir 405bb2e14f3Smrg shift 406a5399cb1Smrg $posix_glob set +f 407a5399cb1Smrg IFS=$oIFS 408a5399cb1Smrg 409a5399cb1Smrg prefixes= 410a5399cb1Smrg 411a5399cb1Smrg for d 412a5399cb1Smrg do 41339f9c979Smrg test X"$d" = X && continue 414a5399cb1Smrg 415a5399cb1Smrg prefix=$prefix$d 416a5399cb1Smrg if test -d "$prefix"; then 417a5399cb1Smrg prefixes= 418a5399cb1Smrg else 419a5399cb1Smrg if $posix_mkdir; then 420a5399cb1Smrg (umask=$mkdir_umask && 421a5399cb1Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 422a5399cb1Smrg # Don't fail if two instances are running concurrently. 423a5399cb1Smrg test -d "$prefix" || exit 1 424a5399cb1Smrg else 425a5399cb1Smrg case $prefix in 426a5399cb1Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 427a5399cb1Smrg *) qprefix=$prefix;; 428a5399cb1Smrg esac 429a5399cb1Smrg prefixes="$prefixes '$qprefix'" 430a5399cb1Smrg fi 431a5399cb1Smrg fi 432a5399cb1Smrg prefix=$prefix/ 433a5399cb1Smrg done 434a5399cb1Smrg 435a5399cb1Smrg if test -n "$prefixes"; then 436a5399cb1Smrg # Don't fail if two instances are running concurrently. 437a5399cb1Smrg (umask $mkdir_umask && 438a5399cb1Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 439a5399cb1Smrg test -d "$dstdir" || exit 1 440a5399cb1Smrg obsolete_mkdir_used=true 441bb2e14f3Smrg fi 442a5399cb1Smrg fi 443bb2e14f3Smrg fi 444bb2e14f3Smrg 445bb2e14f3Smrg if test -n "$dir_arg"; then 446a5399cb1Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 447a5399cb1Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 448a5399cb1Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 449a5399cb1Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 450bb2e14f3Smrg else 451bb2e14f3Smrg 452bb2e14f3Smrg # Make a couple of temp file names in the proper directory. 453bb2e14f3Smrg dsttmp=$dstdir/_inst.$$_ 454bb2e14f3Smrg rmtmp=$dstdir/_rm.$$_ 455bb2e14f3Smrg 456bb2e14f3Smrg # Trap to clean up those temp files at exit. 457bb2e14f3Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 458bb2e14f3Smrg 459bb2e14f3Smrg # Copy the file name to the temp name. 460a5399cb1Smrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 461bb2e14f3Smrg 462bb2e14f3Smrg # and set any options; do chmod last to preserve setuid bits. 463bb2e14f3Smrg # 464bb2e14f3Smrg # If any of these fail, we abort the whole thing. If we want to 465bb2e14f3Smrg # ignore errors from any of these, just make sure not to ignore 466bb2e14f3Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 467bb2e14f3Smrg # 468a5399cb1Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 469a5399cb1Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 470a5399cb1Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 471a5399cb1Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 472a5399cb1Smrg 473a5399cb1Smrg # If -C, don't bother to copy if it wouldn't change the file. 474a5399cb1Smrg if $copy_on_change && 475a5399cb1Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 476a5399cb1Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 477a5399cb1Smrg 478a5399cb1Smrg eval "$initialize_posix_glob" && 479a5399cb1Smrg $posix_glob set -f && 480a5399cb1Smrg set X $old && old=:$2:$4:$5:$6 && 481a5399cb1Smrg set X $new && new=:$2:$4:$5:$6 && 482a5399cb1Smrg $posix_glob set +f && 483a5399cb1Smrg 484a5399cb1Smrg test "$old" = "$new" && 485a5399cb1Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 486a5399cb1Smrg then 487a5399cb1Smrg rm -f "$dsttmp" 488a5399cb1Smrg else 489a5399cb1Smrg # Rename the file to the real destination. 490a5399cb1Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 491a5399cb1Smrg 492a5399cb1Smrg # The rename failed, perhaps because mv can't rename something else 493a5399cb1Smrg # to itself, or perhaps because mv is so ancient that it does not 494a5399cb1Smrg # support -f. 495a5399cb1Smrg { 496a5399cb1Smrg # Now remove or move aside any old file at destination location. 497a5399cb1Smrg # We try this two ways since rm can't unlink itself on some 498a5399cb1Smrg # systems and the destination file might be busy for other 499a5399cb1Smrg # reasons. In this case, the final cleanup might fail but the new 500a5399cb1Smrg # file should still install successfully. 501a5399cb1Smrg { 502a5399cb1Smrg test ! -f "$dst" || 503a5399cb1Smrg $doit $rmcmd -f "$dst" 2>/dev/null || 504a5399cb1Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 505a5399cb1Smrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 506a5399cb1Smrg } || 507a5399cb1Smrg { echo "$0: cannot unlink or rename $dst" >&2 508a5399cb1Smrg (exit 1); exit 1 509a5399cb1Smrg } 510a5399cb1Smrg } && 511a5399cb1Smrg 512a5399cb1Smrg # Now rename the file to the real destination. 513a5399cb1Smrg $doit $mvcmd "$dsttmp" "$dst" 514a5399cb1Smrg } 515a5399cb1Smrg fi || exit 1 516a5399cb1Smrg 517a5399cb1Smrg trap '' 0 518a5399cb1Smrg fi 519bb2e14f3Smrgdone 520bb2e14f3Smrg 521bb2e14f3Smrg# Local variables: 522bb2e14f3Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 523bb2e14f3Smrg# time-stamp-start: "scriptversion=" 524bb2e14f3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 525a5399cb1Smrg# time-stamp-time-zone: "UTC" 526a5399cb1Smrg# time-stamp-end: "; # UTC" 527bb2e14f3Smrg# End: 528