install-sh revision 4f00d7e1
1bdcaa8d0Smrg#!/bin/sh 2bdcaa8d0Smrg# install - install a program, script, or datafile 3bdcaa8d0Smrg 44f00d7e1Smrgscriptversion=2011-11-20.07; # UTC 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 384f00d7e1Smrg# '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 1594f00d7e1Smrg # Protect names problematic for 'test' and other utilities. 160880c7e28Smrg case $dst_arg in 161880c7e28Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 162880c7e28Smrg esac 16372313efbSmrg shift;; 164bdcaa8d0Smrg 16572313efbSmrg -T) no_target_directory=true;; 166bdcaa8d0Smrg 167bdcaa8d0Smrg --version) echo "$0 $scriptversion"; exit $?;; 168bdcaa8d0Smrg 16972313efbSmrg --) shift 170bdcaa8d0Smrg break;; 17172313efbSmrg 17272313efbSmrg -*) echo "$0: invalid option: $1" >&2 17372313efbSmrg exit 1;; 17472313efbSmrg 17572313efbSmrg *) break;; 176bdcaa8d0Smrg esac 17772313efbSmrg shift 178bdcaa8d0Smrgdone 179bdcaa8d0Smrg 18072313efbSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 18172313efbSmrg # When -d is used, all remaining arguments are directories to create. 18272313efbSmrg # When -t is used, the destination is already specified. 18372313efbSmrg # Otherwise, the last argument is the destination. Remove it from $@. 18472313efbSmrg for arg 18572313efbSmrg do 18672313efbSmrg if test -n "$dst_arg"; then 18772313efbSmrg # $@ is not empty: it contains at least $arg. 18872313efbSmrg set fnord "$@" "$dst_arg" 18972313efbSmrg shift # fnord 19072313efbSmrg fi 19172313efbSmrg shift # arg 19272313efbSmrg dst_arg=$arg 1934f00d7e1Smrg # Protect names problematic for 'test' and other utilities. 194880c7e28Smrg case $dst_arg in 195880c7e28Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 196880c7e28Smrg esac 19772313efbSmrg done 19872313efbSmrgfi 19972313efbSmrg 20072313efbSmrgif test $# -eq 0; then 201bdcaa8d0Smrg if test -z "$dir_arg"; then 202bdcaa8d0Smrg echo "$0: no input file specified." >&2 203bdcaa8d0Smrg exit 1 204bdcaa8d0Smrg fi 2054f00d7e1Smrg # It's OK to call 'install-sh -d' without argument. 206bdcaa8d0Smrg # This can happen when creating conditional directories. 207bdcaa8d0Smrg exit 0 208bdcaa8d0Smrgfi 209bdcaa8d0Smrg 21072313efbSmrgif test -z "$dir_arg"; then 211880c7e28Smrg do_exit='(exit $ret); exit $ret' 212880c7e28Smrg trap "ret=129; $do_exit" 1 213880c7e28Smrg trap "ret=130; $do_exit" 2 214880c7e28Smrg trap "ret=141; $do_exit" 13 215880c7e28Smrg trap "ret=143; $do_exit" 15 21672313efbSmrg 21772313efbSmrg # Set umask so as not to create temps with too-generous modes. 21872313efbSmrg # However, 'strip' requires both read and write access to temps. 21972313efbSmrg case $mode in 22072313efbSmrg # Optimize common cases. 22172313efbSmrg *644) cp_umask=133;; 22272313efbSmrg *755) cp_umask=22;; 22372313efbSmrg 22472313efbSmrg *[0-7]) 22572313efbSmrg if test -z "$stripcmd"; then 22672313efbSmrg u_plus_rw= 22772313efbSmrg else 22872313efbSmrg u_plus_rw='% 200' 22972313efbSmrg fi 23072313efbSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 23172313efbSmrg *) 23272313efbSmrg if test -z "$stripcmd"; then 23372313efbSmrg u_plus_rw= 23472313efbSmrg else 23572313efbSmrg u_plus_rw=,u+rw 23672313efbSmrg fi 23772313efbSmrg cp_umask=$mode$u_plus_rw;; 23872313efbSmrg esac 23972313efbSmrgfi 24072313efbSmrg 241bdcaa8d0Smrgfor src 242bdcaa8d0Smrgdo 2434f00d7e1Smrg # Protect names problematic for 'test' and other utilities. 244bdcaa8d0Smrg case $src in 245880c7e28Smrg -* | [=\(\)!]) src=./$src;; 246bdcaa8d0Smrg esac 247bdcaa8d0Smrg 248bdcaa8d0Smrg if test -n "$dir_arg"; then 249bdcaa8d0Smrg dst=$src 25072313efbSmrg dstdir=$dst 25172313efbSmrg test -d "$dstdir" 25272313efbSmrg dstdir_status=$? 253bdcaa8d0Smrg else 25472313efbSmrg 255bdcaa8d0Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 256bdcaa8d0Smrg # might cause directories to be created, which would be especially bad 257bdcaa8d0Smrg # if $src (and thus $dsttmp) contains '*'. 258bdcaa8d0Smrg if test ! -f "$src" && test ! -d "$src"; then 259bdcaa8d0Smrg echo "$0: $src does not exist." >&2 260bdcaa8d0Smrg exit 1 261bdcaa8d0Smrg fi 262bdcaa8d0Smrg 26372313efbSmrg if test -z "$dst_arg"; then 264bdcaa8d0Smrg echo "$0: no destination specified." >&2 265bdcaa8d0Smrg exit 1 266bdcaa8d0Smrg fi 26772313efbSmrg dst=$dst_arg 268bdcaa8d0Smrg 269bdcaa8d0Smrg # If destination is a directory, append the input filename; won't work 270bdcaa8d0Smrg # if double slashes aren't ignored. 271bdcaa8d0Smrg if test -d "$dst"; then 272bdcaa8d0Smrg if test -n "$no_target_directory"; then 27372313efbSmrg echo "$0: $dst_arg: Is a directory" >&2 274bdcaa8d0Smrg exit 1 275bdcaa8d0Smrg fi 27672313efbSmrg dstdir=$dst 27772313efbSmrg dst=$dstdir/`basename "$src"` 27872313efbSmrg dstdir_status=0 27972313efbSmrg else 28072313efbSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 28172313efbSmrg dstdir=` 28272313efbSmrg (dirname "$dst") 2>/dev/null || 28372313efbSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 28472313efbSmrg X"$dst" : 'X\(//\)[^/]' \| \ 28572313efbSmrg X"$dst" : 'X\(//\)$' \| \ 28672313efbSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28772313efbSmrg echo X"$dst" | 28872313efbSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28972313efbSmrg s//\1/ 29072313efbSmrg q 29172313efbSmrg } 29272313efbSmrg /^X\(\/\/\)[^/].*/{ 29372313efbSmrg s//\1/ 29472313efbSmrg q 29572313efbSmrg } 29672313efbSmrg /^X\(\/\/\)$/{ 29772313efbSmrg s//\1/ 29872313efbSmrg q 29972313efbSmrg } 30072313efbSmrg /^X\(\/\).*/{ 30172313efbSmrg s//\1/ 30272313efbSmrg q 30372313efbSmrg } 30472313efbSmrg s/.*/./; q' 30572313efbSmrg ` 30672313efbSmrg 30772313efbSmrg test -d "$dstdir" 30872313efbSmrg dstdir_status=$? 309bdcaa8d0Smrg fi 310bdcaa8d0Smrg fi 311bdcaa8d0Smrg 31272313efbSmrg obsolete_mkdir_used=false 31372313efbSmrg 31472313efbSmrg if test $dstdir_status != 0; then 31572313efbSmrg case $posix_mkdir in 31672313efbSmrg '') 31772313efbSmrg # Create intermediate dirs using mode 755 as modified by the umask. 31872313efbSmrg # This is like FreeBSD 'install' as of 1997-10-28. 31972313efbSmrg umask=`umask` 32072313efbSmrg case $stripcmd.$umask in 32172313efbSmrg # Optimize common cases. 32272313efbSmrg *[2367][2367]) mkdir_umask=$umask;; 32372313efbSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 32472313efbSmrg 32572313efbSmrg *[0-7]) 32672313efbSmrg mkdir_umask=`expr $umask + 22 \ 32772313efbSmrg - $umask % 100 % 40 + $umask % 20 \ 32872313efbSmrg - $umask % 10 % 4 + $umask % 2 32972313efbSmrg `;; 33072313efbSmrg *) mkdir_umask=$umask,go-w;; 33172313efbSmrg esac 33272313efbSmrg 33372313efbSmrg # With -d, create the new directory with the user-specified mode. 33472313efbSmrg # Otherwise, rely on $mkdir_umask. 33572313efbSmrg if test -n "$dir_arg"; then 33672313efbSmrg mkdir_mode=-m$mode 33772313efbSmrg else 33872313efbSmrg mkdir_mode= 33972313efbSmrg fi 34072313efbSmrg 34172313efbSmrg posix_mkdir=false 34272313efbSmrg case $umask in 34372313efbSmrg *[123567][0-7][0-7]) 34472313efbSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 34572313efbSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 34672313efbSmrg ;; 34772313efbSmrg *) 34872313efbSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34972313efbSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 35072313efbSmrg 35172313efbSmrg if (umask $mkdir_umask && 35272313efbSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 35372313efbSmrg then 35472313efbSmrg if test -z "$dir_arg" || { 35572313efbSmrg # Check for POSIX incompatibilities with -m. 35672313efbSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 3574f00d7e1Smrg # other-writable bit of parent directory when it shouldn't. 35872313efbSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35972313efbSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 36072313efbSmrg case $ls_ld_tmpdir in 36172313efbSmrg d????-?r-*) different_mode=700;; 36272313efbSmrg d????-?--*) different_mode=755;; 36372313efbSmrg *) false;; 36472313efbSmrg esac && 36572313efbSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 36672313efbSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36772313efbSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36872313efbSmrg } 36972313efbSmrg } 37072313efbSmrg then posix_mkdir=: 37172313efbSmrg fi 37272313efbSmrg rmdir "$tmpdir/d" "$tmpdir" 37372313efbSmrg else 37472313efbSmrg # Remove any dirs left behind by ancient mkdir implementations. 37572313efbSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 37672313efbSmrg fi 37772313efbSmrg trap '' 0;; 37872313efbSmrg esac;; 37972313efbSmrg esac 380bdcaa8d0Smrg 38172313efbSmrg if 38272313efbSmrg $posix_mkdir && ( 38372313efbSmrg umask $mkdir_umask && 38472313efbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38572313efbSmrg ) 38672313efbSmrg then : 38772313efbSmrg else 388bdcaa8d0Smrg 38972313efbSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 39072313efbSmrg # or it failed possibly due to a race condition. Create the 39172313efbSmrg # directory the slow way, step by step, checking for races as we go. 392bdcaa8d0Smrg 39372313efbSmrg case $dstdir in 39472313efbSmrg /*) prefix='/';; 395880c7e28Smrg [-=\(\)!]*) prefix='./';; 39672313efbSmrg *) prefix='';; 39772313efbSmrg esac 398bdcaa8d0Smrg 39972313efbSmrg eval "$initialize_posix_glob" 400bdcaa8d0Smrg 40172313efbSmrg oIFS=$IFS 40272313efbSmrg IFS=/ 40372313efbSmrg $posix_glob set -f 40472313efbSmrg set fnord $dstdir 405bdcaa8d0Smrg shift 40672313efbSmrg $posix_glob set +f 40772313efbSmrg IFS=$oIFS 40872313efbSmrg 40972313efbSmrg prefixes= 41072313efbSmrg 41172313efbSmrg for d 41272313efbSmrg do 413880c7e28Smrg test X"$d" = X && continue 41472313efbSmrg 41572313efbSmrg prefix=$prefix$d 41672313efbSmrg if test -d "$prefix"; then 41772313efbSmrg prefixes= 41872313efbSmrg else 41972313efbSmrg if $posix_mkdir; then 42072313efbSmrg (umask=$mkdir_umask && 42172313efbSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 42272313efbSmrg # Don't fail if two instances are running concurrently. 42372313efbSmrg test -d "$prefix" || exit 1 42472313efbSmrg else 42572313efbSmrg case $prefix in 42672313efbSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42772313efbSmrg *) qprefix=$prefix;; 42872313efbSmrg esac 42972313efbSmrg prefixes="$prefixes '$qprefix'" 43072313efbSmrg fi 43172313efbSmrg fi 43272313efbSmrg prefix=$prefix/ 43372313efbSmrg done 43472313efbSmrg 43572313efbSmrg if test -n "$prefixes"; then 43672313efbSmrg # Don't fail if two instances are running concurrently. 43772313efbSmrg (umask $mkdir_umask && 43872313efbSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 43972313efbSmrg test -d "$dstdir" || exit 1 44072313efbSmrg obsolete_mkdir_used=true 441bdcaa8d0Smrg fi 44272313efbSmrg fi 443bdcaa8d0Smrg fi 444bdcaa8d0Smrg 445bdcaa8d0Smrg if test -n "$dir_arg"; then 44672313efbSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44772313efbSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44872313efbSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44972313efbSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 450bdcaa8d0Smrg else 451bdcaa8d0Smrg 452bdcaa8d0Smrg # Make a couple of temp file names in the proper directory. 453bdcaa8d0Smrg dsttmp=$dstdir/_inst.$$_ 454bdcaa8d0Smrg rmtmp=$dstdir/_rm.$$_ 455bdcaa8d0Smrg 456bdcaa8d0Smrg # Trap to clean up those temp files at exit. 457bdcaa8d0Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 458bdcaa8d0Smrg 459bdcaa8d0Smrg # Copy the file name to the temp name. 46072313efbSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 461bdcaa8d0Smrg 462bdcaa8d0Smrg # and set any options; do chmod last to preserve setuid bits. 463bdcaa8d0Smrg # 464bdcaa8d0Smrg # If any of these fail, we abort the whole thing. If we want to 465bdcaa8d0Smrg # ignore errors from any of these, just make sure not to ignore 466bdcaa8d0Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 467bdcaa8d0Smrg # 46872313efbSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46972313efbSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 47072313efbSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 47172313efbSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 47272313efbSmrg 47372313efbSmrg # If -C, don't bother to copy if it wouldn't change the file. 47472313efbSmrg if $copy_on_change && 47572313efbSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 47672313efbSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47772313efbSmrg 47872313efbSmrg eval "$initialize_posix_glob" && 47972313efbSmrg $posix_glob set -f && 48072313efbSmrg set X $old && old=:$2:$4:$5:$6 && 48172313efbSmrg set X $new && new=:$2:$4:$5:$6 && 48272313efbSmrg $posix_glob set +f && 48372313efbSmrg 48472313efbSmrg test "$old" = "$new" && 48572313efbSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 48672313efbSmrg then 48772313efbSmrg rm -f "$dsttmp" 48872313efbSmrg else 48972313efbSmrg # Rename the file to the real destination. 49072313efbSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 49172313efbSmrg 49272313efbSmrg # The rename failed, perhaps because mv can't rename something else 49372313efbSmrg # to itself, or perhaps because mv is so ancient that it does not 49472313efbSmrg # support -f. 49572313efbSmrg { 49672313efbSmrg # Now remove or move aside any old file at destination location. 49772313efbSmrg # We try this two ways since rm can't unlink itself on some 49872313efbSmrg # systems and the destination file might be busy for other 49972313efbSmrg # reasons. In this case, the final cleanup might fail but the new 50072313efbSmrg # file should still install successfully. 50172313efbSmrg { 50272313efbSmrg test ! -f "$dst" || 50372313efbSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 50472313efbSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 50572313efbSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 50672313efbSmrg } || 50772313efbSmrg { echo "$0: cannot unlink or rename $dst" >&2 50872313efbSmrg (exit 1); exit 1 50972313efbSmrg } 51072313efbSmrg } && 51172313efbSmrg 51272313efbSmrg # Now rename the file to the real destination. 51372313efbSmrg $doit $mvcmd "$dsttmp" "$dst" 51472313efbSmrg } 51572313efbSmrg fi || exit 1 51672313efbSmrg 51772313efbSmrg trap '' 0 51872313efbSmrg fi 519bdcaa8d0Smrgdone 520bdcaa8d0Smrg 521bdcaa8d0Smrg# Local variables: 522bdcaa8d0Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 523bdcaa8d0Smrg# time-stamp-start: "scriptversion=" 524bdcaa8d0Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 52596ce994aSmrg# time-stamp-time-zone: "UTC" 52696ce994aSmrg# time-stamp-end: "; # UTC" 527bdcaa8d0Smrg# End: 528