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