install-sh revision 516e9f99
108f3b10eSmrg#!/bin/sh 208f3b10eSmrg# install - install a program, script, or datafile 3516e9f99Smrg 4516e9f99Smrgscriptversion=2009-04-28.21; # UTC 5516e9f99Smrg 608f3b10eSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 708f3b10eSmrg# later released in X11R6 (xc/config/util/install.sh) with the 808f3b10eSmrg# following copyright and license. 908f3b10eSmrg# 1008f3b10eSmrg# Copyright (C) 1994 X Consortium 1108f3b10eSmrg# 1208f3b10eSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 1308f3b10eSmrg# of this software and associated documentation files (the "Software"), to 1408f3b10eSmrg# deal in the Software without restriction, including without limitation the 1508f3b10eSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1608f3b10eSmrg# sell copies of the Software, and to permit persons to whom the Software is 1708f3b10eSmrg# furnished to do so, subject to the following conditions: 1808f3b10eSmrg# 1908f3b10eSmrg# The above copyright notice and this permission notice shall be included in 2008f3b10eSmrg# all copies or substantial portions of the Software. 2108f3b10eSmrg# 2208f3b10eSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2308f3b10eSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2408f3b10eSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2508f3b10eSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2608f3b10eSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2708f3b10eSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2808f3b10eSmrg# 2908f3b10eSmrg# Except as contained in this notice, the name of the X Consortium shall not 3008f3b10eSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 3108f3b10eSmrg# ings in this Software without prior written authorization from the X Consor- 3208f3b10eSmrg# tium. 3308f3b10eSmrg# 3408f3b10eSmrg# 3508f3b10eSmrg# FSF changes to this file are in the public domain. 3608f3b10eSmrg# 3708f3b10eSmrg# Calling this script install-sh is preferred over install.sh, to prevent 3808f3b10eSmrg# `make' implicit rules from creating a file called install from it 3908f3b10eSmrg# when there is no Makefile. 4008f3b10eSmrg# 4108f3b10eSmrg# This script is compatible with the BSD install script, but was written 42516e9f99Smrg# from scratch. 4308f3b10eSmrg 44516e9f99Smrgnl=' 45516e9f99Smrg' 46516e9f99SmrgIFS=" "" $nl" 4708f3b10eSmrg 4808f3b10eSmrg# set DOITPROG to echo to test this script 4908f3b10eSmrg 5008f3b10eSmrg# Don't use :- since 4.3BSD and earlier shells don't like it. 51516e9f99Smrgdoit=${DOITPROG-} 52516e9f99Smrgif test -z "$doit"; then 53516e9f99Smrg doit_exec=exec 5408f3b10eSmrgelse 55516e9f99Smrg doit_exec=$doit 5608f3b10eSmrgfi 5708f3b10eSmrg 58516e9f99Smrg# Put in absolute file names if you don't have them in your path; 59516e9f99Smrg# or use environment vars. 60516e9f99Smrg 61516e9f99Smrgchgrpprog=${CHGRPPROG-chgrp} 62516e9f99Smrgchmodprog=${CHMODPROG-chmod} 63516e9f99Smrgchownprog=${CHOWNPROG-chown} 64516e9f99Smrgcmpprog=${CMPPROG-cmp} 65516e9f99Smrgcpprog=${CPPROG-cp} 66516e9f99Smrgmkdirprog=${MKDIRPROG-mkdir} 67516e9f99Smrgmvprog=${MVPROG-mv} 68516e9f99Smrgrmprog=${RMPROG-rm} 69516e9f99Smrgstripprog=${STRIPPROG-strip} 70516e9f99Smrg 71516e9f99Smrgposix_glob='?' 72516e9f99Smrginitialize_posix_glob=' 73516e9f99Smrg test "$posix_glob" != "?" || { 74516e9f99Smrg if (set -f) 2>/dev/null; then 75516e9f99Smrg posix_glob= 76516e9f99Smrg else 77516e9f99Smrg posix_glob=: 78516e9f99Smrg fi 79516e9f99Smrg } 80516e9f99Smrg' 81516e9f99Smrg 82516e9f99Smrgposix_mkdir= 83516e9f99Smrg 84516e9f99Smrg# Desired mode of installed file. 85516e9f99Smrgmode=0755 86516e9f99Smrg 87516e9f99Smrgchgrpcmd= 88516e9f99Smrgchmodcmd=$chmodprog 89516e9f99Smrgchowncmd= 90516e9f99Smrgmvcmd=$mvprog 91516e9f99Smrgrmcmd="$rmprog -f" 92516e9f99Smrgstripcmd= 9308f3b10eSmrg 94516e9f99Smrgsrc= 95516e9f99Smrgdst= 96516e9f99Smrgdir_arg= 97516e9f99Smrgdst_arg= 9808f3b10eSmrg 99516e9f99Smrgcopy_on_change=false 100516e9f99Smrgno_target_directory= 10108f3b10eSmrg 102516e9f99Smrgusage="\ 103516e9f99SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104516e9f99Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 105516e9f99Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106516e9f99Smrg or: $0 [OPTION]... -d DIRECTORIES... 10708f3b10eSmrg 108516e9f99SmrgIn the 1st form, copy SRCFILE to DSTFILE. 109516e9f99SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110516e9f99SmrgIn the 4th, create DIRECTORIES. 11108f3b10eSmrg 112516e9f99SmrgOptions: 113516e9f99Smrg --help display this help and exit. 114516e9f99Smrg --version display version info and exit. 11508f3b10eSmrg 116516e9f99Smrg -c (ignored) 117516e9f99Smrg -C install only if different (preserve the last data modification time) 118516e9f99Smrg -d create directories instead of installing files. 119516e9f99Smrg -g GROUP $chgrpprog installed files to GROUP. 120516e9f99Smrg -m MODE $chmodprog installed files to MODE. 121516e9f99Smrg -o USER $chownprog installed files to USER. 122516e9f99Smrg -s $stripprog installed files. 123516e9f99Smrg -t DIRECTORY install into DIRECTORY. 124516e9f99Smrg -T report an error if DSTFILE is a directory. 12508f3b10eSmrg 126516e9f99SmrgEnvironment variables override the default commands: 127516e9f99Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128516e9f99Smrg RMPROG STRIPPROG 129516e9f99Smrg" 13008f3b10eSmrg 131516e9f99Smrgwhile test $# -ne 0; do 132516e9f99Smrg case $1 in 133516e9f99Smrg -c) ;; 13408f3b10eSmrg 135516e9f99Smrg -C) copy_on_change=true;; 13608f3b10eSmrg 137516e9f99Smrg -d) dir_arg=true;; 13808f3b10eSmrg 139516e9f99Smrg -g) chgrpcmd="$chgrpprog $2" 140516e9f99Smrg shift;; 14108f3b10eSmrg 142516e9f99Smrg --help) echo "$usage"; exit $?;; 14308f3b10eSmrg 144516e9f99Smrg -m) mode=$2 145516e9f99Smrg case $mode in 146516e9f99Smrg *' '* | *' '* | *' 147516e9f99Smrg'* | *'*'* | *'?'* | *'['*) 148516e9f99Smrg echo "$0: invalid mode: $mode" >&2 149516e9f99Smrg exit 1;; 150516e9f99Smrg esac 151516e9f99Smrg shift;; 15208f3b10eSmrg 153516e9f99Smrg -o) chowncmd="$chownprog $2" 154516e9f99Smrg shift;; 15508f3b10eSmrg 156516e9f99Smrg -s) stripcmd=$stripprog;; 15708f3b10eSmrg 158516e9f99Smrg -t) dst_arg=$2 159516e9f99Smrg shift;; 16008f3b10eSmrg 161516e9f99Smrg -T) no_target_directory=true;; 16208f3b10eSmrg 163516e9f99Smrg --version) echo "$0 $scriptversion"; exit $?;; 16408f3b10eSmrg 165516e9f99Smrg --) shift 166516e9f99Smrg break;; 16708f3b10eSmrg 168516e9f99Smrg -*) echo "$0: invalid option: $1" >&2 169516e9f99Smrg exit 1;; 17008f3b10eSmrg 171516e9f99Smrg *) break;; 172516e9f99Smrg esac 173516e9f99Smrg shift 174516e9f99Smrgdone 17508f3b10eSmrg 176516e9f99Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 177516e9f99Smrg # When -d is used, all remaining arguments are directories to create. 178516e9f99Smrg # When -t is used, the destination is already specified. 179516e9f99Smrg # Otherwise, the last argument is the destination. Remove it from $@. 180516e9f99Smrg for arg 181516e9f99Smrg do 182516e9f99Smrg if test -n "$dst_arg"; then 183516e9f99Smrg # $@ is not empty: it contains at least $arg. 184516e9f99Smrg set fnord "$@" "$dst_arg" 185516e9f99Smrg shift # fnord 186516e9f99Smrg fi 187516e9f99Smrg shift # arg 188516e9f99Smrg dst_arg=$arg 189516e9f99Smrg done 190516e9f99Smrgfi 19108f3b10eSmrg 192516e9f99Smrgif test $# -eq 0; then 193516e9f99Smrg if test -z "$dir_arg"; then 194516e9f99Smrg echo "$0: no input file specified." >&2 195516e9f99Smrg exit 1 196516e9f99Smrg fi 197516e9f99Smrg # It's OK to call `install-sh -d' without argument. 198516e9f99Smrg # This can happen when creating conditional directories. 199516e9f99Smrg exit 0 200516e9f99Smrgfi 20108f3b10eSmrg 202516e9f99Smrgif test -z "$dir_arg"; then 203516e9f99Smrg trap '(exit $?); exit' 1 2 13 15 204516e9f99Smrg 205516e9f99Smrg # Set umask so as not to create temps with too-generous modes. 206516e9f99Smrg # However, 'strip' requires both read and write access to temps. 207516e9f99Smrg case $mode in 208516e9f99Smrg # Optimize common cases. 209516e9f99Smrg *644) cp_umask=133;; 210516e9f99Smrg *755) cp_umask=22;; 211516e9f99Smrg 212516e9f99Smrg *[0-7]) 213516e9f99Smrg if test -z "$stripcmd"; then 214516e9f99Smrg u_plus_rw= 215516e9f99Smrg else 216516e9f99Smrg u_plus_rw='% 200' 217516e9f99Smrg fi 218516e9f99Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 219516e9f99Smrg *) 220516e9f99Smrg if test -z "$stripcmd"; then 221516e9f99Smrg u_plus_rw= 222516e9f99Smrg else 223516e9f99Smrg u_plus_rw=,u+rw 224516e9f99Smrg fi 225516e9f99Smrg cp_umask=$mode$u_plus_rw;; 226516e9f99Smrg esac 227516e9f99Smrgfi 22808f3b10eSmrg 229516e9f99Smrgfor src 230516e9f99Smrgdo 231516e9f99Smrg # Protect names starting with `-'. 232516e9f99Smrg case $src in 233516e9f99Smrg -*) src=./$src;; 234516e9f99Smrg esac 235516e9f99Smrg 236516e9f99Smrg if test -n "$dir_arg"; then 237516e9f99Smrg dst=$src 238516e9f99Smrg dstdir=$dst 239516e9f99Smrg test -d "$dstdir" 240516e9f99Smrg dstdir_status=$? 241516e9f99Smrg else 242516e9f99Smrg 243516e9f99Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 244516e9f99Smrg # might cause directories to be created, which would be especially bad 245516e9f99Smrg # if $src (and thus $dsttmp) contains '*'. 246516e9f99Smrg if test ! -f "$src" && test ! -d "$src"; then 247516e9f99Smrg echo "$0: $src does not exist." >&2 248516e9f99Smrg exit 1 249516e9f99Smrg fi 250516e9f99Smrg 251516e9f99Smrg if test -z "$dst_arg"; then 252516e9f99Smrg echo "$0: no destination specified." >&2 253516e9f99Smrg exit 1 254516e9f99Smrg fi 255516e9f99Smrg 256516e9f99Smrg dst=$dst_arg 257516e9f99Smrg # Protect names starting with `-'. 258516e9f99Smrg case $dst in 259516e9f99Smrg -*) dst=./$dst;; 260516e9f99Smrg esac 26108f3b10eSmrg 262516e9f99Smrg # If destination is a directory, append the input filename; won't work 263516e9f99Smrg # if double slashes aren't ignored. 264516e9f99Smrg if test -d "$dst"; then 265516e9f99Smrg if test -n "$no_target_directory"; then 266516e9f99Smrg echo "$0: $dst_arg: Is a directory" >&2 267516e9f99Smrg exit 1 268516e9f99Smrg fi 269516e9f99Smrg dstdir=$dst 270516e9f99Smrg dst=$dstdir/`basename "$src"` 271516e9f99Smrg dstdir_status=0 272516e9f99Smrg else 273516e9f99Smrg # Prefer dirname, but fall back on a substitute if dirname fails. 274516e9f99Smrg dstdir=` 275516e9f99Smrg (dirname "$dst") 2>/dev/null || 276516e9f99Smrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 277516e9f99Smrg X"$dst" : 'X\(//\)[^/]' \| \ 278516e9f99Smrg X"$dst" : 'X\(//\)$' \| \ 279516e9f99Smrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 280516e9f99Smrg echo X"$dst" | 281516e9f99Smrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 282516e9f99Smrg s//\1/ 283516e9f99Smrg q 284516e9f99Smrg } 285516e9f99Smrg /^X\(\/\/\)[^/].*/{ 286516e9f99Smrg s//\1/ 287516e9f99Smrg q 288516e9f99Smrg } 289516e9f99Smrg /^X\(\/\/\)$/{ 290516e9f99Smrg s//\1/ 291516e9f99Smrg q 292516e9f99Smrg } 293516e9f99Smrg /^X\(\/\).*/{ 294516e9f99Smrg s//\1/ 295516e9f99Smrg q 296516e9f99Smrg } 297516e9f99Smrg s/.*/./; q' 298516e9f99Smrg ` 299516e9f99Smrg 300516e9f99Smrg test -d "$dstdir" 301516e9f99Smrg dstdir_status=$? 302516e9f99Smrg fi 303516e9f99Smrg fi 304516e9f99Smrg 305516e9f99Smrg obsolete_mkdir_used=false 306516e9f99Smrg 307516e9f99Smrg if test $dstdir_status != 0; then 308516e9f99Smrg case $posix_mkdir in 309516e9f99Smrg '') 310516e9f99Smrg # Create intermediate dirs using mode 755 as modified by the umask. 311516e9f99Smrg # This is like FreeBSD 'install' as of 1997-10-28. 312516e9f99Smrg umask=`umask` 313516e9f99Smrg case $stripcmd.$umask in 314516e9f99Smrg # Optimize common cases. 315516e9f99Smrg *[2367][2367]) mkdir_umask=$umask;; 316516e9f99Smrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 317516e9f99Smrg 318516e9f99Smrg *[0-7]) 319516e9f99Smrg mkdir_umask=`expr $umask + 22 \ 320516e9f99Smrg - $umask % 100 % 40 + $umask % 20 \ 321516e9f99Smrg - $umask % 10 % 4 + $umask % 2 322516e9f99Smrg `;; 323516e9f99Smrg *) mkdir_umask=$umask,go-w;; 324516e9f99Smrg esac 325516e9f99Smrg 326516e9f99Smrg # With -d, create the new directory with the user-specified mode. 327516e9f99Smrg # Otherwise, rely on $mkdir_umask. 328516e9f99Smrg if test -n "$dir_arg"; then 329516e9f99Smrg mkdir_mode=-m$mode 33008f3b10eSmrg else 331516e9f99Smrg mkdir_mode= 33208f3b10eSmrg fi 33308f3b10eSmrg 334516e9f99Smrg posix_mkdir=false 335516e9f99Smrg case $umask in 336516e9f99Smrg *[123567][0-7][0-7]) 337516e9f99Smrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 338516e9f99Smrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 339516e9f99Smrg ;; 340516e9f99Smrg *) 341516e9f99Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 342516e9f99Smrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 343516e9f99Smrg 344516e9f99Smrg if (umask $mkdir_umask && 345516e9f99Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 346516e9f99Smrg then 347516e9f99Smrg if test -z "$dir_arg" || { 348516e9f99Smrg # Check for POSIX incompatibilities with -m. 349516e9f99Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 350516e9f99Smrg # other-writeable bit of parent directory when it shouldn't. 351516e9f99Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 352516e9f99Smrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 353516e9f99Smrg case $ls_ld_tmpdir in 354516e9f99Smrg d????-?r-*) different_mode=700;; 355516e9f99Smrg d????-?--*) different_mode=755;; 356516e9f99Smrg *) false;; 357516e9f99Smrg esac && 358516e9f99Smrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 359516e9f99Smrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 360516e9f99Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 361516e9f99Smrg } 362516e9f99Smrg } 363516e9f99Smrg then posix_mkdir=: 364516e9f99Smrg fi 365516e9f99Smrg rmdir "$tmpdir/d" "$tmpdir" 366516e9f99Smrg else 367516e9f99Smrg # Remove any dirs left behind by ancient mkdir implementations. 368516e9f99Smrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 369516e9f99Smrg fi 370516e9f99Smrg trap '' 0;; 371516e9f99Smrg esac;; 372516e9f99Smrg esac 37308f3b10eSmrg 374516e9f99Smrg if 375516e9f99Smrg $posix_mkdir && ( 376516e9f99Smrg umask $mkdir_umask && 377516e9f99Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 378516e9f99Smrg ) 379516e9f99Smrg then : 380516e9f99Smrg else 381516e9f99Smrg 382516e9f99Smrg # The umask is ridiculous, or mkdir does not conform to POSIX, 383516e9f99Smrg # or it failed possibly due to a race condition. Create the 384516e9f99Smrg # directory the slow way, step by step, checking for races as we go. 385516e9f99Smrg 386516e9f99Smrg case $dstdir in 387516e9f99Smrg /*) prefix='/';; 388516e9f99Smrg -*) prefix='./';; 389516e9f99Smrg *) prefix='';; 390516e9f99Smrg esac 391516e9f99Smrg 392516e9f99Smrg eval "$initialize_posix_glob" 393516e9f99Smrg 394516e9f99Smrg oIFS=$IFS 395516e9f99Smrg IFS=/ 396516e9f99Smrg $posix_glob set -f 397516e9f99Smrg set fnord $dstdir 398516e9f99Smrg shift 399516e9f99Smrg $posix_glob set +f 400516e9f99Smrg IFS=$oIFS 401516e9f99Smrg 402516e9f99Smrg prefixes= 403516e9f99Smrg 404516e9f99Smrg for d 405516e9f99Smrg do 406516e9f99Smrg test -z "$d" && continue 407516e9f99Smrg 408516e9f99Smrg prefix=$prefix$d 409516e9f99Smrg if test -d "$prefix"; then 410516e9f99Smrg prefixes= 411516e9f99Smrg else 412516e9f99Smrg if $posix_mkdir; then 413516e9f99Smrg (umask=$mkdir_umask && 414516e9f99Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 415516e9f99Smrg # Don't fail if two instances are running concurrently. 416516e9f99Smrg test -d "$prefix" || exit 1 417516e9f99Smrg else 418516e9f99Smrg case $prefix in 419516e9f99Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 420516e9f99Smrg *) qprefix=$prefix;; 421516e9f99Smrg esac 422516e9f99Smrg prefixes="$prefixes '$qprefix'" 423516e9f99Smrg fi 424516e9f99Smrg fi 425516e9f99Smrg prefix=$prefix/ 426516e9f99Smrg done 427516e9f99Smrg 428516e9f99Smrg if test -n "$prefixes"; then 429516e9f99Smrg # Don't fail if two instances are running concurrently. 430516e9f99Smrg (umask $mkdir_umask && 431516e9f99Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 432516e9f99Smrg test -d "$dstdir" || exit 1 433516e9f99Smrg obsolete_mkdir_used=true 434516e9f99Smrg fi 435516e9f99Smrg fi 436516e9f99Smrg fi 437516e9f99Smrg 438516e9f99Smrg if test -n "$dir_arg"; then 439516e9f99Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 440516e9f99Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 441516e9f99Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 442516e9f99Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 443516e9f99Smrg else 444516e9f99Smrg 445516e9f99Smrg # Make a couple of temp file names in the proper directory. 446516e9f99Smrg dsttmp=$dstdir/_inst.$$_ 447516e9f99Smrg rmtmp=$dstdir/_rm.$$_ 448516e9f99Smrg 449516e9f99Smrg # Trap to clean up those temp files at exit. 450516e9f99Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 451516e9f99Smrg 452516e9f99Smrg # Copy the file name to the temp name. 453516e9f99Smrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 454516e9f99Smrg 455516e9f99Smrg # and set any options; do chmod last to preserve setuid bits. 456516e9f99Smrg # 457516e9f99Smrg # If any of these fail, we abort the whole thing. If we want to 458516e9f99Smrg # ignore errors from any of these, just make sure not to ignore 459516e9f99Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 460516e9f99Smrg # 461516e9f99Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 462516e9f99Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 463516e9f99Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 464516e9f99Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 465516e9f99Smrg 466516e9f99Smrg # If -C, don't bother to copy if it wouldn't change the file. 467516e9f99Smrg if $copy_on_change && 468516e9f99Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 469516e9f99Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 470516e9f99Smrg 471516e9f99Smrg eval "$initialize_posix_glob" && 472516e9f99Smrg $posix_glob set -f && 473516e9f99Smrg set X $old && old=:$2:$4:$5:$6 && 474516e9f99Smrg set X $new && new=:$2:$4:$5:$6 && 475516e9f99Smrg $posix_glob set +f && 476516e9f99Smrg 477516e9f99Smrg test "$old" = "$new" && 478516e9f99Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 479516e9f99Smrg then 480516e9f99Smrg rm -f "$dsttmp" 481516e9f99Smrg else 482516e9f99Smrg # Rename the file to the real destination. 483516e9f99Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 484516e9f99Smrg 485516e9f99Smrg # The rename failed, perhaps because mv can't rename something else 486516e9f99Smrg # to itself, or perhaps because mv is so ancient that it does not 487516e9f99Smrg # support -f. 488516e9f99Smrg { 489516e9f99Smrg # Now remove or move aside any old file at destination location. 490516e9f99Smrg # We try this two ways since rm can't unlink itself on some 491516e9f99Smrg # systems and the destination file might be busy for other 492516e9f99Smrg # reasons. In this case, the final cleanup might fail but the new 493516e9f99Smrg # file should still install successfully. 494516e9f99Smrg { 495516e9f99Smrg test ! -f "$dst" || 496516e9f99Smrg $doit $rmcmd -f "$dst" 2>/dev/null || 497516e9f99Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 498516e9f99Smrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 499516e9f99Smrg } || 500516e9f99Smrg { echo "$0: cannot unlink or rename $dst" >&2 501516e9f99Smrg (exit 1); exit 1 502516e9f99Smrg } 503516e9f99Smrg } && 504516e9f99Smrg 505516e9f99Smrg # Now rename the file to the real destination. 506516e9f99Smrg $doit $mvcmd "$dsttmp" "$dst" 507516e9f99Smrg } 508516e9f99Smrg fi || exit 1 509516e9f99Smrg 510516e9f99Smrg trap '' 0 511516e9f99Smrg fi 512516e9f99Smrgdone 51308f3b10eSmrg 514516e9f99Smrg# Local variables: 515516e9f99Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 516516e9f99Smrg# time-stamp-start: "scriptversion=" 517516e9f99Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 518516e9f99Smrg# time-stamp-time-zone: "UTC" 519516e9f99Smrg# time-stamp-end: "; # UTC" 520516e9f99Smrg# End: 521