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