install-sh revision 55de1df9
155de1df9Smrg#!/bin/sh 255de1df9Smrg# install - install a program, script, or datafile 355de1df9Smrg 455de1df9Smrgscriptversion=2009-04-28.21; # UTC 555de1df9Smrg 655de1df9Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 755de1df9Smrg# later released in X11R6 (xc/config/util/install.sh) with the 855de1df9Smrg# following copyright and license. 955de1df9Smrg# 1055de1df9Smrg# Copyright (C) 1994 X Consortium 1155de1df9Smrg# 1255de1df9Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 1355de1df9Smrg# of this software and associated documentation files (the "Software"), to 1455de1df9Smrg# deal in the Software without restriction, including without limitation the 1555de1df9Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1655de1df9Smrg# sell copies of the Software, and to permit persons to whom the Software is 1755de1df9Smrg# furnished to do so, subject to the following conditions: 1855de1df9Smrg# 1955de1df9Smrg# The above copyright notice and this permission notice shall be included in 2055de1df9Smrg# all copies or substantial portions of the Software. 2155de1df9Smrg# 2255de1df9Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2355de1df9Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2455de1df9Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2555de1df9Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2655de1df9Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2755de1df9Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2855de1df9Smrg# 2955de1df9Smrg# Except as contained in this notice, the name of the X Consortium shall not 3055de1df9Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 3155de1df9Smrg# ings in this Software without prior written authorization from the X Consor- 3255de1df9Smrg# tium. 3355de1df9Smrg# 3455de1df9Smrg# 3555de1df9Smrg# FSF changes to this file are in the public domain. 3655de1df9Smrg# 3755de1df9Smrg# Calling this script install-sh is preferred over install.sh, to prevent 3855de1df9Smrg# `make' implicit rules from creating a file called install from it 3955de1df9Smrg# when there is no Makefile. 4055de1df9Smrg# 4155de1df9Smrg# This script is compatible with the BSD install script, but was written 4255de1df9Smrg# from scratch. 4355de1df9Smrg 4455de1df9Smrgnl=' 4555de1df9Smrg' 4655de1df9SmrgIFS=" "" $nl" 4755de1df9Smrg 4855de1df9Smrg# set DOITPROG to echo to test this script 4955de1df9Smrg 5055de1df9Smrg# Don't use :- since 4.3BSD and earlier shells don't like it. 5155de1df9Smrgdoit=${DOITPROG-} 5255de1df9Smrgif test -z "$doit"; then 5355de1df9Smrg doit_exec=exec 5455de1df9Smrgelse 5555de1df9Smrg doit_exec=$doit 5655de1df9Smrgfi 5755de1df9Smrg 5855de1df9Smrg# Put in absolute file names if you don't have them in your path; 5955de1df9Smrg# or use environment vars. 6055de1df9Smrg 6155de1df9Smrgchgrpprog=${CHGRPPROG-chgrp} 6255de1df9Smrgchmodprog=${CHMODPROG-chmod} 6355de1df9Smrgchownprog=${CHOWNPROG-chown} 6455de1df9Smrgcmpprog=${CMPPROG-cmp} 6555de1df9Smrgcpprog=${CPPROG-cp} 6655de1df9Smrgmkdirprog=${MKDIRPROG-mkdir} 6755de1df9Smrgmvprog=${MVPROG-mv} 6855de1df9Smrgrmprog=${RMPROG-rm} 6955de1df9Smrgstripprog=${STRIPPROG-strip} 7055de1df9Smrg 7155de1df9Smrgposix_glob='?' 7255de1df9Smrginitialize_posix_glob=' 7355de1df9Smrg test "$posix_glob" != "?" || { 7455de1df9Smrg if (set -f) 2>/dev/null; then 7555de1df9Smrg posix_glob= 7655de1df9Smrg else 7755de1df9Smrg posix_glob=: 7855de1df9Smrg fi 7955de1df9Smrg } 8055de1df9Smrg' 8155de1df9Smrg 8255de1df9Smrgposix_mkdir= 8355de1df9Smrg 8455de1df9Smrg# Desired mode of installed file. 8555de1df9Smrgmode=0755 8655de1df9Smrg 8755de1df9Smrgchgrpcmd= 8855de1df9Smrgchmodcmd=$chmodprog 8955de1df9Smrgchowncmd= 9055de1df9Smrgmvcmd=$mvprog 9155de1df9Smrgrmcmd="$rmprog -f" 9255de1df9Smrgstripcmd= 9355de1df9Smrg 9455de1df9Smrgsrc= 9555de1df9Smrgdst= 9655de1df9Smrgdir_arg= 9755de1df9Smrgdst_arg= 9855de1df9Smrg 9955de1df9Smrgcopy_on_change=false 10055de1df9Smrgno_target_directory= 10155de1df9Smrg 10255de1df9Smrgusage="\ 10355de1df9SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 10455de1df9Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 10555de1df9Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 10655de1df9Smrg or: $0 [OPTION]... -d DIRECTORIES... 10755de1df9Smrg 10855de1df9SmrgIn the 1st form, copy SRCFILE to DSTFILE. 10955de1df9SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 11055de1df9SmrgIn the 4th, create DIRECTORIES. 11155de1df9Smrg 11255de1df9SmrgOptions: 11355de1df9Smrg --help display this help and exit. 11455de1df9Smrg --version display version info and exit. 11555de1df9Smrg 11655de1df9Smrg -c (ignored) 11755de1df9Smrg -C install only if different (preserve the last data modification time) 11855de1df9Smrg -d create directories instead of installing files. 11955de1df9Smrg -g GROUP $chgrpprog installed files to GROUP. 12055de1df9Smrg -m MODE $chmodprog installed files to MODE. 12155de1df9Smrg -o USER $chownprog installed files to USER. 12255de1df9Smrg -s $stripprog installed files. 12355de1df9Smrg -t DIRECTORY install into DIRECTORY. 12455de1df9Smrg -T report an error if DSTFILE is a directory. 12555de1df9Smrg 12655de1df9SmrgEnvironment variables override the default commands: 12755de1df9Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12855de1df9Smrg RMPROG STRIPPROG 12955de1df9Smrg" 13055de1df9Smrg 13155de1df9Smrgwhile test $# -ne 0; do 13255de1df9Smrg case $1 in 13355de1df9Smrg -c) ;; 13455de1df9Smrg 13555de1df9Smrg -C) copy_on_change=true;; 13655de1df9Smrg 13755de1df9Smrg -d) dir_arg=true;; 13855de1df9Smrg 13955de1df9Smrg -g) chgrpcmd="$chgrpprog $2" 14055de1df9Smrg shift;; 14155de1df9Smrg 14255de1df9Smrg --help) echo "$usage"; exit $?;; 14355de1df9Smrg 14455de1df9Smrg -m) mode=$2 14555de1df9Smrg case $mode in 14655de1df9Smrg *' '* | *' '* | *' 14755de1df9Smrg'* | *'*'* | *'?'* | *'['*) 14855de1df9Smrg echo "$0: invalid mode: $mode" >&2 14955de1df9Smrg exit 1;; 15055de1df9Smrg esac 15155de1df9Smrg shift;; 15255de1df9Smrg 15355de1df9Smrg -o) chowncmd="$chownprog $2" 15455de1df9Smrg shift;; 15555de1df9Smrg 15655de1df9Smrg -s) stripcmd=$stripprog;; 15755de1df9Smrg 15855de1df9Smrg -t) dst_arg=$2 15955de1df9Smrg shift;; 16055de1df9Smrg 16155de1df9Smrg -T) no_target_directory=true;; 16255de1df9Smrg 16355de1df9Smrg --version) echo "$0 $scriptversion"; exit $?;; 16455de1df9Smrg 16555de1df9Smrg --) shift 16655de1df9Smrg break;; 16755de1df9Smrg 16855de1df9Smrg -*) echo "$0: invalid option: $1" >&2 16955de1df9Smrg exit 1;; 17055de1df9Smrg 17155de1df9Smrg *) break;; 17255de1df9Smrg esac 17355de1df9Smrg shift 17455de1df9Smrgdone 17555de1df9Smrg 17655de1df9Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 17755de1df9Smrg # When -d is used, all remaining arguments are directories to create. 17855de1df9Smrg # When -t is used, the destination is already specified. 17955de1df9Smrg # Otherwise, the last argument is the destination. Remove it from $@. 18055de1df9Smrg for arg 18155de1df9Smrg do 18255de1df9Smrg if test -n "$dst_arg"; then 18355de1df9Smrg # $@ is not empty: it contains at least $arg. 18455de1df9Smrg set fnord "$@" "$dst_arg" 18555de1df9Smrg shift # fnord 18655de1df9Smrg fi 18755de1df9Smrg shift # arg 18855de1df9Smrg dst_arg=$arg 18955de1df9Smrg done 19055de1df9Smrgfi 19155de1df9Smrg 19255de1df9Smrgif test $# -eq 0; then 19355de1df9Smrg if test -z "$dir_arg"; then 19455de1df9Smrg echo "$0: no input file specified." >&2 19555de1df9Smrg exit 1 19655de1df9Smrg fi 19755de1df9Smrg # It's OK to call `install-sh -d' without argument. 19855de1df9Smrg # This can happen when creating conditional directories. 19955de1df9Smrg exit 0 20055de1df9Smrgfi 20155de1df9Smrg 20255de1df9Smrgif test -z "$dir_arg"; then 20355de1df9Smrg trap '(exit $?); exit' 1 2 13 15 20455de1df9Smrg 20555de1df9Smrg # Set umask so as not to create temps with too-generous modes. 20655de1df9Smrg # However, 'strip' requires both read and write access to temps. 20755de1df9Smrg case $mode in 20855de1df9Smrg # Optimize common cases. 20955de1df9Smrg *644) cp_umask=133;; 21055de1df9Smrg *755) cp_umask=22;; 21155de1df9Smrg 21255de1df9Smrg *[0-7]) 21355de1df9Smrg if test -z "$stripcmd"; then 21455de1df9Smrg u_plus_rw= 21555de1df9Smrg else 21655de1df9Smrg u_plus_rw='% 200' 21755de1df9Smrg fi 21855de1df9Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 21955de1df9Smrg *) 22055de1df9Smrg if test -z "$stripcmd"; then 22155de1df9Smrg u_plus_rw= 22255de1df9Smrg else 22355de1df9Smrg u_plus_rw=,u+rw 22455de1df9Smrg fi 22555de1df9Smrg cp_umask=$mode$u_plus_rw;; 22655de1df9Smrg esac 22755de1df9Smrgfi 22855de1df9Smrg 22955de1df9Smrgfor src 23055de1df9Smrgdo 23155de1df9Smrg # Protect names starting with `-'. 23255de1df9Smrg case $src in 23355de1df9Smrg -*) src=./$src;; 23455de1df9Smrg esac 23555de1df9Smrg 23655de1df9Smrg if test -n "$dir_arg"; then 23755de1df9Smrg dst=$src 23855de1df9Smrg dstdir=$dst 23955de1df9Smrg test -d "$dstdir" 24055de1df9Smrg dstdir_status=$? 24155de1df9Smrg else 24255de1df9Smrg 24355de1df9Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 24455de1df9Smrg # might cause directories to be created, which would be especially bad 24555de1df9Smrg # if $src (and thus $dsttmp) contains '*'. 24655de1df9Smrg if test ! -f "$src" && test ! -d "$src"; then 24755de1df9Smrg echo "$0: $src does not exist." >&2 24855de1df9Smrg exit 1 24955de1df9Smrg fi 25055de1df9Smrg 25155de1df9Smrg if test -z "$dst_arg"; then 25255de1df9Smrg echo "$0: no destination specified." >&2 25355de1df9Smrg exit 1 25455de1df9Smrg fi 25555de1df9Smrg 25655de1df9Smrg dst=$dst_arg 25755de1df9Smrg # Protect names starting with `-'. 25855de1df9Smrg case $dst in 25955de1df9Smrg -*) dst=./$dst;; 26055de1df9Smrg esac 26155de1df9Smrg 26255de1df9Smrg # If destination is a directory, append the input filename; won't work 26355de1df9Smrg # if double slashes aren't ignored. 26455de1df9Smrg if test -d "$dst"; then 26555de1df9Smrg if test -n "$no_target_directory"; then 26655de1df9Smrg echo "$0: $dst_arg: Is a directory" >&2 26755de1df9Smrg exit 1 26855de1df9Smrg fi 26955de1df9Smrg dstdir=$dst 27055de1df9Smrg dst=$dstdir/`basename "$src"` 27155de1df9Smrg dstdir_status=0 27255de1df9Smrg else 27355de1df9Smrg # Prefer dirname, but fall back on a substitute if dirname fails. 27455de1df9Smrg dstdir=` 27555de1df9Smrg (dirname "$dst") 2>/dev/null || 27655de1df9Smrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 27755de1df9Smrg X"$dst" : 'X\(//\)[^/]' \| \ 27855de1df9Smrg X"$dst" : 'X\(//\)$' \| \ 27955de1df9Smrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28055de1df9Smrg echo X"$dst" | 28155de1df9Smrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28255de1df9Smrg s//\1/ 28355de1df9Smrg q 28455de1df9Smrg } 28555de1df9Smrg /^X\(\/\/\)[^/].*/{ 28655de1df9Smrg s//\1/ 28755de1df9Smrg q 28855de1df9Smrg } 28955de1df9Smrg /^X\(\/\/\)$/{ 29055de1df9Smrg s//\1/ 29155de1df9Smrg q 29255de1df9Smrg } 29355de1df9Smrg /^X\(\/\).*/{ 29455de1df9Smrg s//\1/ 29555de1df9Smrg q 29655de1df9Smrg } 29755de1df9Smrg s/.*/./; q' 29855de1df9Smrg ` 29955de1df9Smrg 30055de1df9Smrg test -d "$dstdir" 30155de1df9Smrg dstdir_status=$? 30255de1df9Smrg fi 30355de1df9Smrg fi 30455de1df9Smrg 30555de1df9Smrg obsolete_mkdir_used=false 30655de1df9Smrg 30755de1df9Smrg if test $dstdir_status != 0; then 30855de1df9Smrg case $posix_mkdir in 30955de1df9Smrg '') 31055de1df9Smrg # Create intermediate dirs using mode 755 as modified by the umask. 31155de1df9Smrg # This is like FreeBSD 'install' as of 1997-10-28. 31255de1df9Smrg umask=`umask` 31355de1df9Smrg case $stripcmd.$umask in 31455de1df9Smrg # Optimize common cases. 31555de1df9Smrg *[2367][2367]) mkdir_umask=$umask;; 31655de1df9Smrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 31755de1df9Smrg 31855de1df9Smrg *[0-7]) 31955de1df9Smrg mkdir_umask=`expr $umask + 22 \ 32055de1df9Smrg - $umask % 100 % 40 + $umask % 20 \ 32155de1df9Smrg - $umask % 10 % 4 + $umask % 2 32255de1df9Smrg `;; 32355de1df9Smrg *) mkdir_umask=$umask,go-w;; 32455de1df9Smrg esac 32555de1df9Smrg 32655de1df9Smrg # With -d, create the new directory with the user-specified mode. 32755de1df9Smrg # Otherwise, rely on $mkdir_umask. 32855de1df9Smrg if test -n "$dir_arg"; then 32955de1df9Smrg mkdir_mode=-m$mode 33055de1df9Smrg else 33155de1df9Smrg mkdir_mode= 33255de1df9Smrg fi 33355de1df9Smrg 33455de1df9Smrg posix_mkdir=false 33555de1df9Smrg case $umask in 33655de1df9Smrg *[123567][0-7][0-7]) 33755de1df9Smrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 33855de1df9Smrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 33955de1df9Smrg ;; 34055de1df9Smrg *) 34155de1df9Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34255de1df9Smrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 34355de1df9Smrg 34455de1df9Smrg if (umask $mkdir_umask && 34555de1df9Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 34655de1df9Smrg then 34755de1df9Smrg if test -z "$dir_arg" || { 34855de1df9Smrg # Check for POSIX incompatibilities with -m. 34955de1df9Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35055de1df9Smrg # other-writeable bit of parent directory when it shouldn't. 35155de1df9Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35255de1df9Smrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 35355de1df9Smrg case $ls_ld_tmpdir in 35455de1df9Smrg d????-?r-*) different_mode=700;; 35555de1df9Smrg d????-?--*) different_mode=755;; 35655de1df9Smrg *) false;; 35755de1df9Smrg esac && 35855de1df9Smrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 35955de1df9Smrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36055de1df9Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36155de1df9Smrg } 36255de1df9Smrg } 36355de1df9Smrg then posix_mkdir=: 36455de1df9Smrg fi 36555de1df9Smrg rmdir "$tmpdir/d" "$tmpdir" 36655de1df9Smrg else 36755de1df9Smrg # Remove any dirs left behind by ancient mkdir implementations. 36855de1df9Smrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 36955de1df9Smrg fi 37055de1df9Smrg trap '' 0;; 37155de1df9Smrg esac;; 37255de1df9Smrg esac 37355de1df9Smrg 37455de1df9Smrg if 37555de1df9Smrg $posix_mkdir && ( 37655de1df9Smrg umask $mkdir_umask && 37755de1df9Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 37855de1df9Smrg ) 37955de1df9Smrg then : 38055de1df9Smrg else 38155de1df9Smrg 38255de1df9Smrg # The umask is ridiculous, or mkdir does not conform to POSIX, 38355de1df9Smrg # or it failed possibly due to a race condition. Create the 38455de1df9Smrg # directory the slow way, step by step, checking for races as we go. 38555de1df9Smrg 38655de1df9Smrg case $dstdir in 38755de1df9Smrg /*) prefix='/';; 38855de1df9Smrg -*) prefix='./';; 38955de1df9Smrg *) prefix='';; 39055de1df9Smrg esac 39155de1df9Smrg 39255de1df9Smrg eval "$initialize_posix_glob" 39355de1df9Smrg 39455de1df9Smrg oIFS=$IFS 39555de1df9Smrg IFS=/ 39655de1df9Smrg $posix_glob set -f 39755de1df9Smrg set fnord $dstdir 39855de1df9Smrg shift 39955de1df9Smrg $posix_glob set +f 40055de1df9Smrg IFS=$oIFS 40155de1df9Smrg 40255de1df9Smrg prefixes= 40355de1df9Smrg 40455de1df9Smrg for d 40555de1df9Smrg do 40655de1df9Smrg test -z "$d" && continue 40755de1df9Smrg 40855de1df9Smrg prefix=$prefix$d 40955de1df9Smrg if test -d "$prefix"; then 41055de1df9Smrg prefixes= 41155de1df9Smrg else 41255de1df9Smrg if $posix_mkdir; then 41355de1df9Smrg (umask=$mkdir_umask && 41455de1df9Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 41555de1df9Smrg # Don't fail if two instances are running concurrently. 41655de1df9Smrg test -d "$prefix" || exit 1 41755de1df9Smrg else 41855de1df9Smrg case $prefix in 41955de1df9Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42055de1df9Smrg *) qprefix=$prefix;; 42155de1df9Smrg esac 42255de1df9Smrg prefixes="$prefixes '$qprefix'" 42355de1df9Smrg fi 42455de1df9Smrg fi 42555de1df9Smrg prefix=$prefix/ 42655de1df9Smrg done 42755de1df9Smrg 42855de1df9Smrg if test -n "$prefixes"; then 42955de1df9Smrg # Don't fail if two instances are running concurrently. 43055de1df9Smrg (umask $mkdir_umask && 43155de1df9Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 43255de1df9Smrg test -d "$dstdir" || exit 1 43355de1df9Smrg obsolete_mkdir_used=true 43455de1df9Smrg fi 43555de1df9Smrg fi 43655de1df9Smrg fi 43755de1df9Smrg 43855de1df9Smrg if test -n "$dir_arg"; then 43955de1df9Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44055de1df9Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44155de1df9Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44255de1df9Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44355de1df9Smrg else 44455de1df9Smrg 44555de1df9Smrg # Make a couple of temp file names in the proper directory. 44655de1df9Smrg dsttmp=$dstdir/_inst.$$_ 44755de1df9Smrg rmtmp=$dstdir/_rm.$$_ 44855de1df9Smrg 44955de1df9Smrg # Trap to clean up those temp files at exit. 45055de1df9Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45155de1df9Smrg 45255de1df9Smrg # Copy the file name to the temp name. 45355de1df9Smrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 45455de1df9Smrg 45555de1df9Smrg # and set any options; do chmod last to preserve setuid bits. 45655de1df9Smrg # 45755de1df9Smrg # If any of these fail, we abort the whole thing. If we want to 45855de1df9Smrg # ignore errors from any of these, just make sure not to ignore 45955de1df9Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 46055de1df9Smrg # 46155de1df9Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46255de1df9Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 46355de1df9Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 46455de1df9Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 46555de1df9Smrg 46655de1df9Smrg # If -C, don't bother to copy if it wouldn't change the file. 46755de1df9Smrg if $copy_on_change && 46855de1df9Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 46955de1df9Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47055de1df9Smrg 47155de1df9Smrg eval "$initialize_posix_glob" && 47255de1df9Smrg $posix_glob set -f && 47355de1df9Smrg set X $old && old=:$2:$4:$5:$6 && 47455de1df9Smrg set X $new && new=:$2:$4:$5:$6 && 47555de1df9Smrg $posix_glob set +f && 47655de1df9Smrg 47755de1df9Smrg test "$old" = "$new" && 47855de1df9Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 47955de1df9Smrg then 48055de1df9Smrg rm -f "$dsttmp" 48155de1df9Smrg else 48255de1df9Smrg # Rename the file to the real destination. 48355de1df9Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 48455de1df9Smrg 48555de1df9Smrg # The rename failed, perhaps because mv can't rename something else 48655de1df9Smrg # to itself, or perhaps because mv is so ancient that it does not 48755de1df9Smrg # support -f. 48855de1df9Smrg { 48955de1df9Smrg # Now remove or move aside any old file at destination location. 49055de1df9Smrg # We try this two ways since rm can't unlink itself on some 49155de1df9Smrg # systems and the destination file might be busy for other 49255de1df9Smrg # reasons. In this case, the final cleanup might fail but the new 49355de1df9Smrg # file should still install successfully. 49455de1df9Smrg { 49555de1df9Smrg test ! -f "$dst" || 49655de1df9Smrg $doit $rmcmd -f "$dst" 2>/dev/null || 49755de1df9Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 49855de1df9Smrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 49955de1df9Smrg } || 50055de1df9Smrg { echo "$0: cannot unlink or rename $dst" >&2 50155de1df9Smrg (exit 1); exit 1 50255de1df9Smrg } 50355de1df9Smrg } && 50455de1df9Smrg 50555de1df9Smrg # Now rename the file to the real destination. 50655de1df9Smrg $doit $mvcmd "$dsttmp" "$dst" 50755de1df9Smrg } 50855de1df9Smrg fi || exit 1 50955de1df9Smrg 51055de1df9Smrg trap '' 0 51155de1df9Smrg fi 51255de1df9Smrgdone 51355de1df9Smrg 51455de1df9Smrg# Local variables: 51555de1df9Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 51655de1df9Smrg# time-stamp-start: "scriptversion=" 51755de1df9Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 51855de1df9Smrg# time-stamp-time-zone: "UTC" 51955de1df9Smrg# time-stamp-end: "; # UTC" 52055de1df9Smrg# End: 521