install-sh revision 880ed95a
102be438aSmrg#!/bin/sh 202be438aSmrg# install - install a program, script, or datafile 302be438aSmrg 4880ed95aSmrgscriptversion=2006-12-25.00 502be438aSmrg 602be438aSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 702be438aSmrg# later released in X11R6 (xc/config/util/install.sh) with the 802be438aSmrg# following copyright and license. 902be438aSmrg# 1002be438aSmrg# Copyright (C) 1994 X Consortium 1102be438aSmrg# 1202be438aSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 1302be438aSmrg# of this software and associated documentation files (the "Software"), to 1402be438aSmrg# deal in the Software without restriction, including without limitation the 1502be438aSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1602be438aSmrg# sell copies of the Software, and to permit persons to whom the Software is 1702be438aSmrg# furnished to do so, subject to the following conditions: 1802be438aSmrg# 1902be438aSmrg# The above copyright notice and this permission notice shall be included in 2002be438aSmrg# all copies or substantial portions of the Software. 2102be438aSmrg# 2202be438aSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2302be438aSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2402be438aSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2502be438aSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2602be438aSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2702be438aSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2802be438aSmrg# 2902be438aSmrg# Except as contained in this notice, the name of the X Consortium shall not 3002be438aSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 3102be438aSmrg# ings in this Software without prior written authorization from the X Consor- 3202be438aSmrg# tium. 3302be438aSmrg# 3402be438aSmrg# 3502be438aSmrg# FSF changes to this file are in the public domain. 3602be438aSmrg# 3702be438aSmrg# Calling this script install-sh is preferred over install.sh, to prevent 3802be438aSmrg# `make' implicit rules from creating a file called install from it 3902be438aSmrg# when there is no Makefile. 4002be438aSmrg# 4102be438aSmrg# This script is compatible with the BSD install script, but was written 42880ed95aSmrg# from scratch. 43880ed95aSmrg 44880ed95aSmrgnl=' 45880ed95aSmrg' 46880ed95aSmrgIFS=" "" $nl" 4702be438aSmrg 4802be438aSmrg# set DOITPROG to echo to test this script 4902be438aSmrg 5002be438aSmrg# Don't use :- since 4.3BSD and earlier shells don't like it. 51880ed95aSmrgdoit=${DOITPROG-} 52880ed95aSmrgif test -z "$doit"; then 53880ed95aSmrg doit_exec=exec 54880ed95aSmrgelse 55880ed95aSmrg doit_exec=$doit 56880ed95aSmrgfi 5702be438aSmrg 58880ed95aSmrg# Put in absolute file names if you don't have them in your path; 59880ed95aSmrg# or use environment vars. 60880ed95aSmrg 61880ed95aSmrgchgrpprog=${CHGRPPROG-chgrp} 62880ed95aSmrgchmodprog=${CHMODPROG-chmod} 63880ed95aSmrgchownprog=${CHOWNPROG-chown} 64880ed95aSmrgcmpprog=${CMPPROG-cmp} 65880ed95aSmrgcpprog=${CPPROG-cp} 66880ed95aSmrgmkdirprog=${MKDIRPROG-mkdir} 67880ed95aSmrgmvprog=${MVPROG-mv} 68880ed95aSmrgrmprog=${RMPROG-rm} 69880ed95aSmrgstripprog=${STRIPPROG-strip} 70880ed95aSmrg 71880ed95aSmrgposix_glob='?' 72880ed95aSmrginitialize_posix_glob=' 73880ed95aSmrg test "$posix_glob" != "?" || { 74880ed95aSmrg if (set -f) 2>/dev/null; then 75880ed95aSmrg posix_glob= 76880ed95aSmrg else 77880ed95aSmrg posix_glob=: 78880ed95aSmrg fi 79880ed95aSmrg } 80880ed95aSmrg' 8102be438aSmrg 82880ed95aSmrgposix_mkdir= 83880ed95aSmrg 84880ed95aSmrg# Desired mode of installed file. 85880ed95aSmrgmode=0755 8602be438aSmrg 8702be438aSmrgchgrpcmd= 88880ed95aSmrgchmodcmd=$chmodprog 89880ed95aSmrgchowncmd= 90880ed95aSmrgmvcmd=$mvprog 9102be438aSmrgrmcmd="$rmprog -f" 92880ed95aSmrgstripcmd= 93880ed95aSmrg 9402be438aSmrgsrc= 9502be438aSmrgdst= 9602be438aSmrgdir_arg= 97880ed95aSmrgdst_arg= 98880ed95aSmrg 99880ed95aSmrgcopy_on_change=false 10002be438aSmrgno_target_directory= 10102be438aSmrg 102880ed95aSmrgusage="\ 103880ed95aSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 10402be438aSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 10502be438aSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 10602be438aSmrg or: $0 [OPTION]... -d DIRECTORIES... 10702be438aSmrg 10802be438aSmrgIn the 1st form, copy SRCFILE to DSTFILE. 10902be438aSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 11002be438aSmrgIn the 4th, create DIRECTORIES. 11102be438aSmrg 11202be438aSmrgOptions: 113880ed95aSmrg --help display this help and exit. 114880ed95aSmrg --version display version info and exit. 115880ed95aSmrg 116880ed95aSmrg -c (ignored) 117880ed95aSmrg -C install only if different (preserve the last data modification time) 118880ed95aSmrg -d create directories instead of installing files. 119880ed95aSmrg -g GROUP $chgrpprog installed files to GROUP. 120880ed95aSmrg -m MODE $chmodprog installed files to MODE. 121880ed95aSmrg -o USER $chownprog installed files to USER. 122880ed95aSmrg -s $stripprog installed files. 123880ed95aSmrg -t DIRECTORY install into DIRECTORY. 124880ed95aSmrg -T report an error if DSTFILE is a directory. 12502be438aSmrg 12602be438aSmrgEnvironment variables override the default commands: 127880ed95aSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128880ed95aSmrg RMPROG STRIPPROG 12902be438aSmrg" 13002be438aSmrg 131880ed95aSmrgwhile test $# -ne 0; do 13202be438aSmrg case $1 in 133880ed95aSmrg -c) ;; 134880ed95aSmrg 135880ed95aSmrg -C) copy_on_change=true;; 13602be438aSmrg 137880ed95aSmrg -d) dir_arg=true;; 13802be438aSmrg 13902be438aSmrg -g) chgrpcmd="$chgrpprog $2" 140880ed95aSmrg shift;; 14102be438aSmrg 14202be438aSmrg --help) echo "$usage"; exit $?;; 14302be438aSmrg 144880ed95aSmrg -m) mode=$2 145880ed95aSmrg case $mode in 146880ed95aSmrg *' '* | *' '* | *' 147880ed95aSmrg'* | *'*'* | *'?'* | *'['*) 148880ed95aSmrg echo "$0: invalid mode: $mode" >&2 149880ed95aSmrg exit 1;; 150880ed95aSmrg esac 151880ed95aSmrg shift;; 15202be438aSmrg 15302be438aSmrg -o) chowncmd="$chownprog $2" 154880ed95aSmrg shift;; 15502be438aSmrg 156880ed95aSmrg -s) stripcmd=$stripprog;; 15702be438aSmrg 158880ed95aSmrg -t) dst_arg=$2 159880ed95aSmrg shift;; 16002be438aSmrg 161880ed95aSmrg -T) no_target_directory=true;; 16202be438aSmrg 16302be438aSmrg --version) echo "$0 $scriptversion"; exit $?;; 16402be438aSmrg 165880ed95aSmrg --) shift 16602be438aSmrg break;; 167880ed95aSmrg 168880ed95aSmrg -*) echo "$0: invalid option: $1" >&2 169880ed95aSmrg exit 1;; 170880ed95aSmrg 171880ed95aSmrg *) break;; 17202be438aSmrg esac 173880ed95aSmrg shift 17402be438aSmrgdone 17502be438aSmrg 176880ed95aSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 177880ed95aSmrg # When -d is used, all remaining arguments are directories to create. 178880ed95aSmrg # When -t is used, the destination is already specified. 179880ed95aSmrg # Otherwise, the last argument is the destination. Remove it from $@. 180880ed95aSmrg for arg 181880ed95aSmrg do 182880ed95aSmrg if test -n "$dst_arg"; then 183880ed95aSmrg # $@ is not empty: it contains at least $arg. 184880ed95aSmrg set fnord "$@" "$dst_arg" 185880ed95aSmrg shift # fnord 186880ed95aSmrg fi 187880ed95aSmrg shift # arg 188880ed95aSmrg dst_arg=$arg 189880ed95aSmrg done 190880ed95aSmrgfi 191880ed95aSmrg 192880ed95aSmrgif test $# -eq 0; then 19302be438aSmrg if test -z "$dir_arg"; then 19402be438aSmrg echo "$0: no input file specified." >&2 19502be438aSmrg exit 1 19602be438aSmrg fi 19702be438aSmrg # It's OK to call `install-sh -d' without argument. 19802be438aSmrg # This can happen when creating conditional directories. 19902be438aSmrg exit 0 20002be438aSmrgfi 20102be438aSmrg 202880ed95aSmrgif test -z "$dir_arg"; then 203880ed95aSmrg trap '(exit $?); exit' 1 2 13 15 204880ed95aSmrg 205880ed95aSmrg # Set umask so as not to create temps with too-generous modes. 206880ed95aSmrg # However, 'strip' requires both read and write access to temps. 207880ed95aSmrg case $mode in 208880ed95aSmrg # Optimize common cases. 209880ed95aSmrg *644) cp_umask=133;; 210880ed95aSmrg *755) cp_umask=22;; 211880ed95aSmrg 212880ed95aSmrg *[0-7]) 213880ed95aSmrg if test -z "$stripcmd"; then 214880ed95aSmrg u_plus_rw= 215880ed95aSmrg else 216880ed95aSmrg u_plus_rw='% 200' 217880ed95aSmrg fi 218880ed95aSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 219880ed95aSmrg *) 220880ed95aSmrg if test -z "$stripcmd"; then 221880ed95aSmrg u_plus_rw= 222880ed95aSmrg else 223880ed95aSmrg u_plus_rw=,u+rw 224880ed95aSmrg fi 225880ed95aSmrg cp_umask=$mode$u_plus_rw;; 226880ed95aSmrg esac 227880ed95aSmrgfi 228880ed95aSmrg 22902be438aSmrgfor src 23002be438aSmrgdo 23102be438aSmrg # Protect names starting with `-'. 23202be438aSmrg case $src in 233880ed95aSmrg -*) src=./$src;; 23402be438aSmrg esac 23502be438aSmrg 23602be438aSmrg if test -n "$dir_arg"; then 23702be438aSmrg dst=$src 238880ed95aSmrg dstdir=$dst 239880ed95aSmrg test -d "$dstdir" 240880ed95aSmrg dstdir_status=$? 24102be438aSmrg else 242880ed95aSmrg 24302be438aSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 24402be438aSmrg # might cause directories to be created, which would be especially bad 24502be438aSmrg # if $src (and thus $dsttmp) contains '*'. 24602be438aSmrg if test ! -f "$src" && test ! -d "$src"; then 24702be438aSmrg echo "$0: $src does not exist." >&2 24802be438aSmrg exit 1 24902be438aSmrg fi 25002be438aSmrg 251880ed95aSmrg if test -z "$dst_arg"; then 25202be438aSmrg echo "$0: no destination specified." >&2 25302be438aSmrg exit 1 25402be438aSmrg fi 25502be438aSmrg 256880ed95aSmrg dst=$dst_arg 25702be438aSmrg # Protect names starting with `-'. 25802be438aSmrg case $dst in 259880ed95aSmrg -*) dst=./$dst;; 26002be438aSmrg esac 26102be438aSmrg 26202be438aSmrg # If destination is a directory, append the input filename; won't work 26302be438aSmrg # if double slashes aren't ignored. 26402be438aSmrg if test -d "$dst"; then 26502be438aSmrg if test -n "$no_target_directory"; then 266880ed95aSmrg echo "$0: $dst_arg: Is a directory" >&2 26702be438aSmrg exit 1 26802be438aSmrg fi 269880ed95aSmrg dstdir=$dst 270880ed95aSmrg dst=$dstdir/`basename "$src"` 271880ed95aSmrg dstdir_status=0 272880ed95aSmrg else 273880ed95aSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 274880ed95aSmrg dstdir=` 275880ed95aSmrg (dirname "$dst") 2>/dev/null || 276880ed95aSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 277880ed95aSmrg X"$dst" : 'X\(//\)[^/]' \| \ 278880ed95aSmrg X"$dst" : 'X\(//\)$' \| \ 279880ed95aSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 280880ed95aSmrg echo X"$dst" | 281880ed95aSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 282880ed95aSmrg s//\1/ 283880ed95aSmrg q 284880ed95aSmrg } 285880ed95aSmrg /^X\(\/\/\)[^/].*/{ 286880ed95aSmrg s//\1/ 287880ed95aSmrg q 288880ed95aSmrg } 289880ed95aSmrg /^X\(\/\/\)$/{ 290880ed95aSmrg s//\1/ 291880ed95aSmrg q 292880ed95aSmrg } 293880ed95aSmrg /^X\(\/\).*/{ 294880ed95aSmrg s//\1/ 295880ed95aSmrg q 296880ed95aSmrg } 297880ed95aSmrg s/.*/./; q' 298880ed95aSmrg ` 299880ed95aSmrg 300880ed95aSmrg test -d "$dstdir" 301880ed95aSmrg dstdir_status=$? 30202be438aSmrg fi 30302be438aSmrg fi 30402be438aSmrg 305880ed95aSmrg obsolete_mkdir_used=false 306880ed95aSmrg 307880ed95aSmrg if test $dstdir_status != 0; then 308880ed95aSmrg case $posix_mkdir in 309880ed95aSmrg '') 310880ed95aSmrg # Create intermediate dirs using mode 755 as modified by the umask. 311880ed95aSmrg # This is like FreeBSD 'install' as of 1997-10-28. 312880ed95aSmrg umask=`umask` 313880ed95aSmrg case $stripcmd.$umask in 314880ed95aSmrg # Optimize common cases. 315880ed95aSmrg *[2367][2367]) mkdir_umask=$umask;; 316880ed95aSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 317880ed95aSmrg 318880ed95aSmrg *[0-7]) 319880ed95aSmrg mkdir_umask=`expr $umask + 22 \ 320880ed95aSmrg - $umask % 100 % 40 + $umask % 20 \ 321880ed95aSmrg - $umask % 10 % 4 + $umask % 2 322880ed95aSmrg `;; 323880ed95aSmrg *) mkdir_umask=$umask,go-w;; 324880ed95aSmrg esac 325880ed95aSmrg 326880ed95aSmrg # With -d, create the new directory with the user-specified mode. 327880ed95aSmrg # Otherwise, rely on $mkdir_umask. 328880ed95aSmrg if test -n "$dir_arg"; then 329880ed95aSmrg mkdir_mode=-m$mode 330880ed95aSmrg else 331880ed95aSmrg mkdir_mode= 332880ed95aSmrg fi 333880ed95aSmrg 334880ed95aSmrg posix_mkdir=false 335880ed95aSmrg case $umask in 336880ed95aSmrg *[123567][0-7][0-7]) 337880ed95aSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 338880ed95aSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 339880ed95aSmrg ;; 340880ed95aSmrg *) 341880ed95aSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 342880ed95aSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 343880ed95aSmrg 344880ed95aSmrg if (umask $mkdir_umask && 345880ed95aSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 346880ed95aSmrg then 347880ed95aSmrg if test -z "$dir_arg" || { 348880ed95aSmrg # Check for POSIX incompatibilities with -m. 349880ed95aSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 350880ed95aSmrg # other-writeable bit of parent directory when it shouldn't. 351880ed95aSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 352880ed95aSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 353880ed95aSmrg case $ls_ld_tmpdir in 354880ed95aSmrg d????-?r-*) different_mode=700;; 355880ed95aSmrg d????-?--*) different_mode=755;; 356880ed95aSmrg *) false;; 357880ed95aSmrg esac && 358880ed95aSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 359880ed95aSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 360880ed95aSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 361880ed95aSmrg } 362880ed95aSmrg } 363880ed95aSmrg then posix_mkdir=: 364880ed95aSmrg fi 365880ed95aSmrg rmdir "$tmpdir/d" "$tmpdir" 366880ed95aSmrg else 367880ed95aSmrg # Remove any dirs left behind by ancient mkdir implementations. 368880ed95aSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 369880ed95aSmrg fi 370880ed95aSmrg trap '' 0;; 371880ed95aSmrg esac;; 372880ed95aSmrg esac 37302be438aSmrg 374880ed95aSmrg if 375880ed95aSmrg $posix_mkdir && ( 376880ed95aSmrg umask $mkdir_umask && 377880ed95aSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 378880ed95aSmrg ) 379880ed95aSmrg then : 380880ed95aSmrg else 38102be438aSmrg 382880ed95aSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 383880ed95aSmrg # or it failed possibly due to a race condition. Create the 384880ed95aSmrg # directory the slow way, step by step, checking for races as we go. 38502be438aSmrg 386880ed95aSmrg case $dstdir in 387880ed95aSmrg /*) prefix='/';; 388880ed95aSmrg -*) prefix='./';; 389880ed95aSmrg *) prefix='';; 390880ed95aSmrg esac 39102be438aSmrg 392880ed95aSmrg eval "$initialize_posix_glob" 39302be438aSmrg 394880ed95aSmrg oIFS=$IFS 395880ed95aSmrg IFS=/ 396880ed95aSmrg $posix_glob set -f 397880ed95aSmrg set fnord $dstdir 39802be438aSmrg shift 399880ed95aSmrg $posix_glob set +f 400880ed95aSmrg IFS=$oIFS 401880ed95aSmrg 402880ed95aSmrg prefixes= 403880ed95aSmrg 404880ed95aSmrg for d 405880ed95aSmrg do 406880ed95aSmrg test -z "$d" && continue 407880ed95aSmrg 408880ed95aSmrg prefix=$prefix$d 409880ed95aSmrg if test -d "$prefix"; then 410880ed95aSmrg prefixes= 411880ed95aSmrg else 412880ed95aSmrg if $posix_mkdir; then 413880ed95aSmrg (umask=$mkdir_umask && 414880ed95aSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 415880ed95aSmrg # Don't fail if two instances are running concurrently. 416880ed95aSmrg test -d "$prefix" || exit 1 417880ed95aSmrg else 418880ed95aSmrg case $prefix in 419880ed95aSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 420880ed95aSmrg *) qprefix=$prefix;; 421880ed95aSmrg esac 422880ed95aSmrg prefixes="$prefixes '$qprefix'" 423880ed95aSmrg fi 424880ed95aSmrg fi 425880ed95aSmrg prefix=$prefix/ 426880ed95aSmrg done 427880ed95aSmrg 428880ed95aSmrg if test -n "$prefixes"; then 429880ed95aSmrg # Don't fail if two instances are running concurrently. 430880ed95aSmrg (umask $mkdir_umask && 431880ed95aSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 432880ed95aSmrg test -d "$dstdir" || exit 1 433880ed95aSmrg obsolete_mkdir_used=true 43402be438aSmrg fi 435880ed95aSmrg fi 43602be438aSmrg fi 43702be438aSmrg 43802be438aSmrg if test -n "$dir_arg"; then 439880ed95aSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 440880ed95aSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 441880ed95aSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 442880ed95aSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44302be438aSmrg else 44402be438aSmrg 44502be438aSmrg # Make a couple of temp file names in the proper directory. 44602be438aSmrg dsttmp=$dstdir/_inst.$$_ 44702be438aSmrg rmtmp=$dstdir/_rm.$$_ 44802be438aSmrg 44902be438aSmrg # Trap to clean up those temp files at exit. 45002be438aSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45102be438aSmrg 45202be438aSmrg # Copy the file name to the temp name. 453880ed95aSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 45402be438aSmrg 45502be438aSmrg # and set any options; do chmod last to preserve setuid bits. 45602be438aSmrg # 45702be438aSmrg # If any of these fail, we abort the whole thing. If we want to 45802be438aSmrg # ignore errors from any of these, just make sure not to ignore 45902be438aSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 46002be438aSmrg # 461880ed95aSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 462880ed95aSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 463880ed95aSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 464880ed95aSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 465880ed95aSmrg 466880ed95aSmrg # If -C, don't bother to copy if it wouldn't change the file. 467880ed95aSmrg if $copy_on_change && 468880ed95aSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 469880ed95aSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 470880ed95aSmrg 471880ed95aSmrg eval "$initialize_posix_glob" && 472880ed95aSmrg $posix_glob set -f && 473880ed95aSmrg set X $old && old=:$2:$4:$5:$6 && 474880ed95aSmrg set X $new && new=:$2:$4:$5:$6 && 475880ed95aSmrg $posix_glob set +f && 476880ed95aSmrg 477880ed95aSmrg test "$old" = "$new" && 478880ed95aSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 479880ed95aSmrg then 480880ed95aSmrg rm -f "$dsttmp" 481880ed95aSmrg else 482880ed95aSmrg # Rename the file to the real destination. 483880ed95aSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 484880ed95aSmrg 485880ed95aSmrg # The rename failed, perhaps because mv can't rename something else 486880ed95aSmrg # to itself, or perhaps because mv is so ancient that it does not 487880ed95aSmrg # support -f. 488880ed95aSmrg { 489880ed95aSmrg # Now remove or move aside any old file at destination location. 490880ed95aSmrg # We try this two ways since rm can't unlink itself on some 491880ed95aSmrg # systems and the destination file might be busy for other 492880ed95aSmrg # reasons. In this case, the final cleanup might fail but the new 493880ed95aSmrg # file should still install successfully. 494880ed95aSmrg { 495880ed95aSmrg test ! -f "$dst" || 496880ed95aSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 497880ed95aSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 498880ed95aSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 499880ed95aSmrg } || 500880ed95aSmrg { echo "$0: cannot unlink or rename $dst" >&2 501880ed95aSmrg (exit 1); exit 1 502880ed95aSmrg } 503880ed95aSmrg } && 504880ed95aSmrg 505880ed95aSmrg # Now rename the file to the real destination. 506880ed95aSmrg $doit $mvcmd "$dsttmp" "$dst" 507880ed95aSmrg } 508880ed95aSmrg fi || exit 1 509880ed95aSmrg 510880ed95aSmrg trap '' 0 511880ed95aSmrg fi 51202be438aSmrgdone 51302be438aSmrg 51402be438aSmrg# Local variables: 51502be438aSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 51602be438aSmrg# time-stamp-start: "scriptversion=" 51702be438aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 51802be438aSmrg# time-stamp-end: "$" 51902be438aSmrg# End: 520