install-sh revision 72313efb
1bdcaa8d0Smrg#!/bin/sh 2bdcaa8d0Smrg# install - install a program, script, or datafile 3bdcaa8d0Smrg 472313efbSmrgscriptversion=2006-12-25.00 5bdcaa8d0Smrg 6bdcaa8d0Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 7bdcaa8d0Smrg# later released in X11R6 (xc/config/util/install.sh) with the 8bdcaa8d0Smrg# following copyright and license. 9bdcaa8d0Smrg# 10bdcaa8d0Smrg# Copyright (C) 1994 X Consortium 11bdcaa8d0Smrg# 12bdcaa8d0Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 13bdcaa8d0Smrg# of this software and associated documentation files (the "Software"), to 14bdcaa8d0Smrg# deal in the Software without restriction, including without limitation the 15bdcaa8d0Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16bdcaa8d0Smrg# sell copies of the Software, and to permit persons to whom the Software is 17bdcaa8d0Smrg# furnished to do so, subject to the following conditions: 18bdcaa8d0Smrg# 19bdcaa8d0Smrg# The above copyright notice and this permission notice shall be included in 20bdcaa8d0Smrg# all copies or substantial portions of the Software. 21bdcaa8d0Smrg# 22bdcaa8d0Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23bdcaa8d0Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24bdcaa8d0Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25bdcaa8d0Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26bdcaa8d0Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27bdcaa8d0Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28bdcaa8d0Smrg# 29bdcaa8d0Smrg# Except as contained in this notice, the name of the X Consortium shall not 30bdcaa8d0Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 31bdcaa8d0Smrg# ings in this Software without prior written authorization from the X Consor- 32bdcaa8d0Smrg# tium. 33bdcaa8d0Smrg# 34bdcaa8d0Smrg# 35bdcaa8d0Smrg# FSF changes to this file are in the public domain. 36bdcaa8d0Smrg# 37bdcaa8d0Smrg# Calling this script install-sh is preferred over install.sh, to prevent 38bdcaa8d0Smrg# `make' implicit rules from creating a file called install from it 39bdcaa8d0Smrg# when there is no Makefile. 40bdcaa8d0Smrg# 41bdcaa8d0Smrg# This script is compatible with the BSD install script, but was written 4272313efbSmrg# from scratch. 4372313efbSmrg 4472313efbSmrgnl=' 4572313efbSmrg' 4672313efbSmrgIFS=" "" $nl" 47bdcaa8d0Smrg 48bdcaa8d0Smrg# set DOITPROG to echo to test this script 49bdcaa8d0Smrg 50bdcaa8d0Smrg# Don't use :- since 4.3BSD and earlier shells don't like it. 5172313efbSmrgdoit=${DOITPROG-} 5272313efbSmrgif test -z "$doit"; then 5372313efbSmrg doit_exec=exec 5472313efbSmrgelse 5572313efbSmrg doit_exec=$doit 5672313efbSmrgfi 57bdcaa8d0Smrg 5872313efbSmrg# Put in absolute file names if you don't have them in your path; 5972313efbSmrg# or use environment vars. 6072313efbSmrg 6172313efbSmrgchgrpprog=${CHGRPPROG-chgrp} 6272313efbSmrgchmodprog=${CHMODPROG-chmod} 6372313efbSmrgchownprog=${CHOWNPROG-chown} 6472313efbSmrgcmpprog=${CMPPROG-cmp} 6572313efbSmrgcpprog=${CPPROG-cp} 6672313efbSmrgmkdirprog=${MKDIRPROG-mkdir} 6772313efbSmrgmvprog=${MVPROG-mv} 6872313efbSmrgrmprog=${RMPROG-rm} 6972313efbSmrgstripprog=${STRIPPROG-strip} 7072313efbSmrg 7172313efbSmrgposix_glob='?' 7272313efbSmrginitialize_posix_glob=' 7372313efbSmrg test "$posix_glob" != "?" || { 7472313efbSmrg if (set -f) 2>/dev/null; then 7572313efbSmrg posix_glob= 7672313efbSmrg else 7772313efbSmrg posix_glob=: 7872313efbSmrg fi 7972313efbSmrg } 8072313efbSmrg' 81bdcaa8d0Smrg 8272313efbSmrgposix_mkdir= 8372313efbSmrg 8472313efbSmrg# Desired mode of installed file. 8572313efbSmrgmode=0755 86bdcaa8d0Smrg 87bdcaa8d0Smrgchgrpcmd= 8872313efbSmrgchmodcmd=$chmodprog 8972313efbSmrgchowncmd= 9072313efbSmrgmvcmd=$mvprog 91bdcaa8d0Smrgrmcmd="$rmprog -f" 9272313efbSmrgstripcmd= 9372313efbSmrg 94bdcaa8d0Smrgsrc= 95bdcaa8d0Smrgdst= 96bdcaa8d0Smrgdir_arg= 9772313efbSmrgdst_arg= 9872313efbSmrg 9972313efbSmrgcopy_on_change=false 100bdcaa8d0Smrgno_target_directory= 101bdcaa8d0Smrg 10272313efbSmrgusage="\ 10372313efbSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104bdcaa8d0Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 105bdcaa8d0Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106bdcaa8d0Smrg or: $0 [OPTION]... -d DIRECTORIES... 107bdcaa8d0Smrg 108bdcaa8d0SmrgIn the 1st form, copy SRCFILE to DSTFILE. 109bdcaa8d0SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110bdcaa8d0SmrgIn the 4th, create DIRECTORIES. 111bdcaa8d0Smrg 112bdcaa8d0SmrgOptions: 11372313efbSmrg --help display this help and exit. 11472313efbSmrg --version display version info and exit. 11572313efbSmrg 11672313efbSmrg -c (ignored) 11772313efbSmrg -C install only if different (preserve the last data modification time) 11872313efbSmrg -d create directories instead of installing files. 11972313efbSmrg -g GROUP $chgrpprog installed files to GROUP. 12072313efbSmrg -m MODE $chmodprog installed files to MODE. 12172313efbSmrg -o USER $chownprog installed files to USER. 12272313efbSmrg -s $stripprog installed files. 12372313efbSmrg -t DIRECTORY install into DIRECTORY. 12472313efbSmrg -T report an error if DSTFILE is a directory. 125bdcaa8d0Smrg 126bdcaa8d0SmrgEnvironment variables override the default commands: 12772313efbSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12872313efbSmrg RMPROG STRIPPROG 129bdcaa8d0Smrg" 130bdcaa8d0Smrg 13172313efbSmrgwhile test $# -ne 0; do 132bdcaa8d0Smrg case $1 in 13372313efbSmrg -c) ;; 13472313efbSmrg 13572313efbSmrg -C) copy_on_change=true;; 136bdcaa8d0Smrg 13772313efbSmrg -d) dir_arg=true;; 138bdcaa8d0Smrg 139bdcaa8d0Smrg -g) chgrpcmd="$chgrpprog $2" 14072313efbSmrg shift;; 141bdcaa8d0Smrg 142bdcaa8d0Smrg --help) echo "$usage"; exit $?;; 143bdcaa8d0Smrg 14472313efbSmrg -m) mode=$2 14572313efbSmrg case $mode in 14672313efbSmrg *' '* | *' '* | *' 14772313efbSmrg'* | *'*'* | *'?'* | *'['*) 14872313efbSmrg echo "$0: invalid mode: $mode" >&2 14972313efbSmrg exit 1;; 15072313efbSmrg esac 15172313efbSmrg shift;; 152bdcaa8d0Smrg 153bdcaa8d0Smrg -o) chowncmd="$chownprog $2" 15472313efbSmrg shift;; 155bdcaa8d0Smrg 15672313efbSmrg -s) stripcmd=$stripprog;; 157bdcaa8d0Smrg 15872313efbSmrg -t) dst_arg=$2 15972313efbSmrg shift;; 160bdcaa8d0Smrg 16172313efbSmrg -T) no_target_directory=true;; 162bdcaa8d0Smrg 163bdcaa8d0Smrg --version) echo "$0 $scriptversion"; exit $?;; 164bdcaa8d0Smrg 16572313efbSmrg --) shift 166bdcaa8d0Smrg break;; 16772313efbSmrg 16872313efbSmrg -*) echo "$0: invalid option: $1" >&2 16972313efbSmrg exit 1;; 17072313efbSmrg 17172313efbSmrg *) break;; 172bdcaa8d0Smrg esac 17372313efbSmrg shift 174bdcaa8d0Smrgdone 175bdcaa8d0Smrg 17672313efbSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 17772313efbSmrg # When -d is used, all remaining arguments are directories to create. 17872313efbSmrg # When -t is used, the destination is already specified. 17972313efbSmrg # Otherwise, the last argument is the destination. Remove it from $@. 18072313efbSmrg for arg 18172313efbSmrg do 18272313efbSmrg if test -n "$dst_arg"; then 18372313efbSmrg # $@ is not empty: it contains at least $arg. 18472313efbSmrg set fnord "$@" "$dst_arg" 18572313efbSmrg shift # fnord 18672313efbSmrg fi 18772313efbSmrg shift # arg 18872313efbSmrg dst_arg=$arg 18972313efbSmrg done 19072313efbSmrgfi 19172313efbSmrg 19272313efbSmrgif test $# -eq 0; then 193bdcaa8d0Smrg if test -z "$dir_arg"; then 194bdcaa8d0Smrg echo "$0: no input file specified." >&2 195bdcaa8d0Smrg exit 1 196bdcaa8d0Smrg fi 197bdcaa8d0Smrg # It's OK to call `install-sh -d' without argument. 198bdcaa8d0Smrg # This can happen when creating conditional directories. 199bdcaa8d0Smrg exit 0 200bdcaa8d0Smrgfi 201bdcaa8d0Smrg 20272313efbSmrgif test -z "$dir_arg"; then 20372313efbSmrg trap '(exit $?); exit' 1 2 13 15 20472313efbSmrg 20572313efbSmrg # Set umask so as not to create temps with too-generous modes. 20672313efbSmrg # However, 'strip' requires both read and write access to temps. 20772313efbSmrg case $mode in 20872313efbSmrg # Optimize common cases. 20972313efbSmrg *644) cp_umask=133;; 21072313efbSmrg *755) cp_umask=22;; 21172313efbSmrg 21272313efbSmrg *[0-7]) 21372313efbSmrg if test -z "$stripcmd"; then 21472313efbSmrg u_plus_rw= 21572313efbSmrg else 21672313efbSmrg u_plus_rw='% 200' 21772313efbSmrg fi 21872313efbSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 21972313efbSmrg *) 22072313efbSmrg if test -z "$stripcmd"; then 22172313efbSmrg u_plus_rw= 22272313efbSmrg else 22372313efbSmrg u_plus_rw=,u+rw 22472313efbSmrg fi 22572313efbSmrg cp_umask=$mode$u_plus_rw;; 22672313efbSmrg esac 22772313efbSmrgfi 22872313efbSmrg 229bdcaa8d0Smrgfor src 230bdcaa8d0Smrgdo 231bdcaa8d0Smrg # Protect names starting with `-'. 232bdcaa8d0Smrg case $src in 23372313efbSmrg -*) src=./$src;; 234bdcaa8d0Smrg esac 235bdcaa8d0Smrg 236bdcaa8d0Smrg if test -n "$dir_arg"; then 237bdcaa8d0Smrg dst=$src 23872313efbSmrg dstdir=$dst 23972313efbSmrg test -d "$dstdir" 24072313efbSmrg dstdir_status=$? 241bdcaa8d0Smrg else 24272313efbSmrg 243bdcaa8d0Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 244bdcaa8d0Smrg # might cause directories to be created, which would be especially bad 245bdcaa8d0Smrg # if $src (and thus $dsttmp) contains '*'. 246bdcaa8d0Smrg if test ! -f "$src" && test ! -d "$src"; then 247bdcaa8d0Smrg echo "$0: $src does not exist." >&2 248bdcaa8d0Smrg exit 1 249bdcaa8d0Smrg fi 250bdcaa8d0Smrg 25172313efbSmrg if test -z "$dst_arg"; then 252bdcaa8d0Smrg echo "$0: no destination specified." >&2 253bdcaa8d0Smrg exit 1 254bdcaa8d0Smrg fi 255bdcaa8d0Smrg 25672313efbSmrg dst=$dst_arg 257bdcaa8d0Smrg # Protect names starting with `-'. 258bdcaa8d0Smrg case $dst in 25972313efbSmrg -*) dst=./$dst;; 260bdcaa8d0Smrg esac 261bdcaa8d0Smrg 262bdcaa8d0Smrg # If destination is a directory, append the input filename; won't work 263bdcaa8d0Smrg # if double slashes aren't ignored. 264bdcaa8d0Smrg if test -d "$dst"; then 265bdcaa8d0Smrg if test -n "$no_target_directory"; then 26672313efbSmrg echo "$0: $dst_arg: Is a directory" >&2 267bdcaa8d0Smrg exit 1 268bdcaa8d0Smrg fi 26972313efbSmrg dstdir=$dst 27072313efbSmrg dst=$dstdir/`basename "$src"` 27172313efbSmrg dstdir_status=0 27272313efbSmrg else 27372313efbSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 27472313efbSmrg dstdir=` 27572313efbSmrg (dirname "$dst") 2>/dev/null || 27672313efbSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 27772313efbSmrg X"$dst" : 'X\(//\)[^/]' \| \ 27872313efbSmrg X"$dst" : 'X\(//\)$' \| \ 27972313efbSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28072313efbSmrg echo X"$dst" | 28172313efbSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28272313efbSmrg s//\1/ 28372313efbSmrg q 28472313efbSmrg } 28572313efbSmrg /^X\(\/\/\)[^/].*/{ 28672313efbSmrg s//\1/ 28772313efbSmrg q 28872313efbSmrg } 28972313efbSmrg /^X\(\/\/\)$/{ 29072313efbSmrg s//\1/ 29172313efbSmrg q 29272313efbSmrg } 29372313efbSmrg /^X\(\/\).*/{ 29472313efbSmrg s//\1/ 29572313efbSmrg q 29672313efbSmrg } 29772313efbSmrg s/.*/./; q' 29872313efbSmrg ` 29972313efbSmrg 30072313efbSmrg test -d "$dstdir" 30172313efbSmrg dstdir_status=$? 302bdcaa8d0Smrg fi 303bdcaa8d0Smrg fi 304bdcaa8d0Smrg 30572313efbSmrg obsolete_mkdir_used=false 30672313efbSmrg 30772313efbSmrg if test $dstdir_status != 0; then 30872313efbSmrg case $posix_mkdir in 30972313efbSmrg '') 31072313efbSmrg # Create intermediate dirs using mode 755 as modified by the umask. 31172313efbSmrg # This is like FreeBSD 'install' as of 1997-10-28. 31272313efbSmrg umask=`umask` 31372313efbSmrg case $stripcmd.$umask in 31472313efbSmrg # Optimize common cases. 31572313efbSmrg *[2367][2367]) mkdir_umask=$umask;; 31672313efbSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 31772313efbSmrg 31872313efbSmrg *[0-7]) 31972313efbSmrg mkdir_umask=`expr $umask + 22 \ 32072313efbSmrg - $umask % 100 % 40 + $umask % 20 \ 32172313efbSmrg - $umask % 10 % 4 + $umask % 2 32272313efbSmrg `;; 32372313efbSmrg *) mkdir_umask=$umask,go-w;; 32472313efbSmrg esac 32572313efbSmrg 32672313efbSmrg # With -d, create the new directory with the user-specified mode. 32772313efbSmrg # Otherwise, rely on $mkdir_umask. 32872313efbSmrg if test -n "$dir_arg"; then 32972313efbSmrg mkdir_mode=-m$mode 33072313efbSmrg else 33172313efbSmrg mkdir_mode= 33272313efbSmrg fi 33372313efbSmrg 33472313efbSmrg posix_mkdir=false 33572313efbSmrg case $umask in 33672313efbSmrg *[123567][0-7][0-7]) 33772313efbSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 33872313efbSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 33972313efbSmrg ;; 34072313efbSmrg *) 34172313efbSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34272313efbSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 34372313efbSmrg 34472313efbSmrg if (umask $mkdir_umask && 34572313efbSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 34672313efbSmrg then 34772313efbSmrg if test -z "$dir_arg" || { 34872313efbSmrg # Check for POSIX incompatibilities with -m. 34972313efbSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35072313efbSmrg # other-writeable bit of parent directory when it shouldn't. 35172313efbSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35272313efbSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 35372313efbSmrg case $ls_ld_tmpdir in 35472313efbSmrg d????-?r-*) different_mode=700;; 35572313efbSmrg d????-?--*) different_mode=755;; 35672313efbSmrg *) false;; 35772313efbSmrg esac && 35872313efbSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 35972313efbSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36072313efbSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36172313efbSmrg } 36272313efbSmrg } 36372313efbSmrg then posix_mkdir=: 36472313efbSmrg fi 36572313efbSmrg rmdir "$tmpdir/d" "$tmpdir" 36672313efbSmrg else 36772313efbSmrg # Remove any dirs left behind by ancient mkdir implementations. 36872313efbSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 36972313efbSmrg fi 37072313efbSmrg trap '' 0;; 37172313efbSmrg esac;; 37272313efbSmrg esac 373bdcaa8d0Smrg 37472313efbSmrg if 37572313efbSmrg $posix_mkdir && ( 37672313efbSmrg umask $mkdir_umask && 37772313efbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 37872313efbSmrg ) 37972313efbSmrg then : 38072313efbSmrg else 381bdcaa8d0Smrg 38272313efbSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 38372313efbSmrg # or it failed possibly due to a race condition. Create the 38472313efbSmrg # directory the slow way, step by step, checking for races as we go. 385bdcaa8d0Smrg 38672313efbSmrg case $dstdir in 38772313efbSmrg /*) prefix='/';; 38872313efbSmrg -*) prefix='./';; 38972313efbSmrg *) prefix='';; 39072313efbSmrg esac 391bdcaa8d0Smrg 39272313efbSmrg eval "$initialize_posix_glob" 393bdcaa8d0Smrg 39472313efbSmrg oIFS=$IFS 39572313efbSmrg IFS=/ 39672313efbSmrg $posix_glob set -f 39772313efbSmrg set fnord $dstdir 398bdcaa8d0Smrg shift 39972313efbSmrg $posix_glob set +f 40072313efbSmrg IFS=$oIFS 40172313efbSmrg 40272313efbSmrg prefixes= 40372313efbSmrg 40472313efbSmrg for d 40572313efbSmrg do 40672313efbSmrg test -z "$d" && continue 40772313efbSmrg 40872313efbSmrg prefix=$prefix$d 40972313efbSmrg if test -d "$prefix"; then 41072313efbSmrg prefixes= 41172313efbSmrg else 41272313efbSmrg if $posix_mkdir; then 41372313efbSmrg (umask=$mkdir_umask && 41472313efbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 41572313efbSmrg # Don't fail if two instances are running concurrently. 41672313efbSmrg test -d "$prefix" || exit 1 41772313efbSmrg else 41872313efbSmrg case $prefix in 41972313efbSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42072313efbSmrg *) qprefix=$prefix;; 42172313efbSmrg esac 42272313efbSmrg prefixes="$prefixes '$qprefix'" 42372313efbSmrg fi 42472313efbSmrg fi 42572313efbSmrg prefix=$prefix/ 42672313efbSmrg done 42772313efbSmrg 42872313efbSmrg if test -n "$prefixes"; then 42972313efbSmrg # Don't fail if two instances are running concurrently. 43072313efbSmrg (umask $mkdir_umask && 43172313efbSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 43272313efbSmrg test -d "$dstdir" || exit 1 43372313efbSmrg obsolete_mkdir_used=true 434bdcaa8d0Smrg fi 43572313efbSmrg fi 436bdcaa8d0Smrg fi 437bdcaa8d0Smrg 438bdcaa8d0Smrg if test -n "$dir_arg"; then 43972313efbSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44072313efbSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44172313efbSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44272313efbSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 443bdcaa8d0Smrg else 444bdcaa8d0Smrg 445bdcaa8d0Smrg # Make a couple of temp file names in the proper directory. 446bdcaa8d0Smrg dsttmp=$dstdir/_inst.$$_ 447bdcaa8d0Smrg rmtmp=$dstdir/_rm.$$_ 448bdcaa8d0Smrg 449bdcaa8d0Smrg # Trap to clean up those temp files at exit. 450bdcaa8d0Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 451bdcaa8d0Smrg 452bdcaa8d0Smrg # Copy the file name to the temp name. 45372313efbSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 454bdcaa8d0Smrg 455bdcaa8d0Smrg # and set any options; do chmod last to preserve setuid bits. 456bdcaa8d0Smrg # 457bdcaa8d0Smrg # If any of these fail, we abort the whole thing. If we want to 458bdcaa8d0Smrg # ignore errors from any of these, just make sure not to ignore 459bdcaa8d0Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 460bdcaa8d0Smrg # 46172313efbSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46272313efbSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 46372313efbSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 46472313efbSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 46572313efbSmrg 46672313efbSmrg # If -C, don't bother to copy if it wouldn't change the file. 46772313efbSmrg if $copy_on_change && 46872313efbSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 46972313efbSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47072313efbSmrg 47172313efbSmrg eval "$initialize_posix_glob" && 47272313efbSmrg $posix_glob set -f && 47372313efbSmrg set X $old && old=:$2:$4:$5:$6 && 47472313efbSmrg set X $new && new=:$2:$4:$5:$6 && 47572313efbSmrg $posix_glob set +f && 47672313efbSmrg 47772313efbSmrg test "$old" = "$new" && 47872313efbSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 47972313efbSmrg then 48072313efbSmrg rm -f "$dsttmp" 48172313efbSmrg else 48272313efbSmrg # Rename the file to the real destination. 48372313efbSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 48472313efbSmrg 48572313efbSmrg # The rename failed, perhaps because mv can't rename something else 48672313efbSmrg # to itself, or perhaps because mv is so ancient that it does not 48772313efbSmrg # support -f. 48872313efbSmrg { 48972313efbSmrg # Now remove or move aside any old file at destination location. 49072313efbSmrg # We try this two ways since rm can't unlink itself on some 49172313efbSmrg # systems and the destination file might be busy for other 49272313efbSmrg # reasons. In this case, the final cleanup might fail but the new 49372313efbSmrg # file should still install successfully. 49472313efbSmrg { 49572313efbSmrg test ! -f "$dst" || 49672313efbSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 49772313efbSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 49872313efbSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 49972313efbSmrg } || 50072313efbSmrg { echo "$0: cannot unlink or rename $dst" >&2 50172313efbSmrg (exit 1); exit 1 50272313efbSmrg } 50372313efbSmrg } && 50472313efbSmrg 50572313efbSmrg # Now rename the file to the real destination. 50672313efbSmrg $doit $mvcmd "$dsttmp" "$dst" 50772313efbSmrg } 50872313efbSmrg fi || exit 1 50972313efbSmrg 51072313efbSmrg trap '' 0 51172313efbSmrg fi 512bdcaa8d0Smrgdone 513bdcaa8d0Smrg 514bdcaa8d0Smrg# Local variables: 515bdcaa8d0Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 516bdcaa8d0Smrg# time-stamp-start: "scriptversion=" 517bdcaa8d0Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 518bdcaa8d0Smrg# time-stamp-end: "$" 519bdcaa8d0Smrg# End: 520