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