install-sh revision 5b944e2a
1b1297603Smrg#!/bin/sh 2b1297603Smrg# install - install a program, script, or datafile 3b1297603Smrg 45b944e2aSmrgscriptversion=2006-10-14.15 5b1297603Smrg 6b1297603Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 7b1297603Smrg# later released in X11R6 (xc/config/util/install.sh) with the 8b1297603Smrg# following copyright and license. 9b1297603Smrg# 10b1297603Smrg# Copyright (C) 1994 X Consortium 11b1297603Smrg# 12b1297603Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 13b1297603Smrg# of this software and associated documentation files (the "Software"), to 14b1297603Smrg# deal in the Software without restriction, including without limitation the 15b1297603Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16b1297603Smrg# sell copies of the Software, and to permit persons to whom the Software is 17b1297603Smrg# furnished to do so, subject to the following conditions: 18b1297603Smrg# 19b1297603Smrg# The above copyright notice and this permission notice shall be included in 20b1297603Smrg# all copies or substantial portions of the Software. 21b1297603Smrg# 22b1297603Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23b1297603Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24b1297603Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25b1297603Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26b1297603Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27b1297603Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28b1297603Smrg# 29b1297603Smrg# Except as contained in this notice, the name of the X Consortium shall not 30b1297603Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 31b1297603Smrg# ings in this Software without prior written authorization from the X Consor- 32b1297603Smrg# tium. 33b1297603Smrg# 34b1297603Smrg# 35b1297603Smrg# FSF changes to this file are in the public domain. 36b1297603Smrg# 37b1297603Smrg# Calling this script install-sh is preferred over install.sh, to prevent 38b1297603Smrg# `make' implicit rules from creating a file called install from it 39b1297603Smrg# when there is no Makefile. 40b1297603Smrg# 41b1297603Smrg# This script is compatible with the BSD install script, but was written 425b944e2aSmrg# from scratch. 435b944e2aSmrg 445b944e2aSmrgnl=' 455b944e2aSmrg' 465b944e2aSmrgIFS=" "" $nl" 47b1297603Smrg 48b1297603Smrg# set DOITPROG to echo to test this script 49b1297603Smrg 50b1297603Smrg# Don't use :- since 4.3BSD and earlier shells don't like it. 51b1297603Smrgdoit="${DOITPROG-}" 525b944e2aSmrgif test -z "$doit"; then 535b944e2aSmrg doit_exec=exec 545b944e2aSmrgelse 555b944e2aSmrg doit_exec=$doit 565b944e2aSmrgfi 57b1297603Smrg 585b944e2aSmrg# Put in absolute file names if you don't have them in your path; 595b944e2aSmrg# or use environment vars. 60b1297603Smrg 61b1297603Smrgmvprog="${MVPROG-mv}" 62b1297603Smrgcpprog="${CPPROG-cp}" 63b1297603Smrgchmodprog="${CHMODPROG-chmod}" 64b1297603Smrgchownprog="${CHOWNPROG-chown}" 65b1297603Smrgchgrpprog="${CHGRPPROG-chgrp}" 66b1297603Smrgstripprog="${STRIPPROG-strip}" 67b1297603Smrgrmprog="${RMPROG-rm}" 68b1297603Smrgmkdirprog="${MKDIRPROG-mkdir}" 69b1297603Smrg 705b944e2aSmrgposix_glob= 715b944e2aSmrgposix_mkdir= 725b944e2aSmrg 735b944e2aSmrg# Desired mode of installed file. 745b944e2aSmrgmode=0755 755b944e2aSmrg 765b944e2aSmrgchmodcmd=$chmodprog 77b1297603Smrgchowncmd= 78b1297603Smrgchgrpcmd= 79b1297603Smrgstripcmd= 80b1297603Smrgrmcmd="$rmprog -f" 81b1297603Smrgmvcmd="$mvprog" 82b1297603Smrgsrc= 83b1297603Smrgdst= 84b1297603Smrgdir_arg= 85b1297603Smrgdstarg= 86b1297603Smrgno_target_directory= 87b1297603Smrg 88b1297603Smrgusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 89b1297603Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 90b1297603Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 91b1297603Smrg or: $0 [OPTION]... -d DIRECTORIES... 92b1297603Smrg 93b1297603SmrgIn the 1st form, copy SRCFILE to DSTFILE. 94b1297603SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 95b1297603SmrgIn the 4th, create DIRECTORIES. 96b1297603Smrg 97b1297603SmrgOptions: 98b1297603Smrg-c (ignored) 99b1297603Smrg-d create directories instead of installing files. 100b1297603Smrg-g GROUP $chgrpprog installed files to GROUP. 101b1297603Smrg-m MODE $chmodprog installed files to MODE. 102b1297603Smrg-o USER $chownprog installed files to USER. 103b1297603Smrg-s $stripprog installed files. 104b1297603Smrg-t DIRECTORY install into DIRECTORY. 105b1297603Smrg-T report an error if DSTFILE is a directory. 106b1297603Smrg--help display this help and exit. 107b1297603Smrg--version display version info and exit. 108b1297603Smrg 109b1297603SmrgEnvironment variables override the default commands: 110b1297603Smrg CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG 111b1297603Smrg" 112b1297603Smrg 1135b944e2aSmrgwhile test $# -ne 0; do 114b1297603Smrg case $1 in 115b1297603Smrg -c) shift 116b1297603Smrg continue;; 117b1297603Smrg 118b1297603Smrg -d) dir_arg=true 119b1297603Smrg shift 120b1297603Smrg continue;; 121b1297603Smrg 122b1297603Smrg -g) chgrpcmd="$chgrpprog $2" 123b1297603Smrg shift 124b1297603Smrg shift 125b1297603Smrg continue;; 126b1297603Smrg 127b1297603Smrg --help) echo "$usage"; exit $?;; 128b1297603Smrg 1295b944e2aSmrg -m) mode=$2 130b1297603Smrg shift 131b1297603Smrg shift 1325b944e2aSmrg case $mode in 1335b944e2aSmrg *' '* | *' '* | *' 1345b944e2aSmrg'* | *'*'* | *'?'* | *'['*) 1355b944e2aSmrg echo "$0: invalid mode: $mode" >&2 1365b944e2aSmrg exit 1;; 1375b944e2aSmrg esac 138b1297603Smrg continue;; 139b1297603Smrg 140b1297603Smrg -o) chowncmd="$chownprog $2" 141b1297603Smrg shift 142b1297603Smrg shift 143b1297603Smrg continue;; 144b1297603Smrg 145b1297603Smrg -s) stripcmd=$stripprog 146b1297603Smrg shift 147b1297603Smrg continue;; 148b1297603Smrg 149b1297603Smrg -t) dstarg=$2 150b1297603Smrg shift 151b1297603Smrg shift 152b1297603Smrg continue;; 153b1297603Smrg 154b1297603Smrg -T) no_target_directory=true 155b1297603Smrg shift 156b1297603Smrg continue;; 157b1297603Smrg 158b1297603Smrg --version) echo "$0 $scriptversion"; exit $?;; 159b1297603Smrg 1605b944e2aSmrg --) shift 161b1297603Smrg break;; 1625b944e2aSmrg 1635b944e2aSmrg -*) echo "$0: invalid option: $1" >&2 1645b944e2aSmrg exit 1;; 1655b944e2aSmrg 1665b944e2aSmrg *) break;; 167b1297603Smrg esac 168b1297603Smrgdone 169b1297603Smrg 1705b944e2aSmrgif test $# -ne 0 && test -z "$dir_arg$dstarg"; then 1715b944e2aSmrg # When -d is used, all remaining arguments are directories to create. 1725b944e2aSmrg # When -t is used, the destination is already specified. 1735b944e2aSmrg # Otherwise, the last argument is the destination. Remove it from $@. 1745b944e2aSmrg for arg 1755b944e2aSmrg do 1765b944e2aSmrg if test -n "$dstarg"; then 1775b944e2aSmrg # $@ is not empty: it contains at least $arg. 1785b944e2aSmrg set fnord "$@" "$dstarg" 1795b944e2aSmrg shift # fnord 1805b944e2aSmrg fi 1815b944e2aSmrg shift # arg 1825b944e2aSmrg dstarg=$arg 1835b944e2aSmrg done 1845b944e2aSmrgfi 1855b944e2aSmrg 1865b944e2aSmrgif test $# -eq 0; then 187b1297603Smrg if test -z "$dir_arg"; then 188b1297603Smrg echo "$0: no input file specified." >&2 189b1297603Smrg exit 1 190b1297603Smrg fi 191b1297603Smrg # It's OK to call `install-sh -d' without argument. 192b1297603Smrg # This can happen when creating conditional directories. 193b1297603Smrg exit 0 194b1297603Smrgfi 195b1297603Smrg 1965b944e2aSmrgif test -z "$dir_arg"; then 1975b944e2aSmrg trap '(exit $?); exit' 1 2 13 15 1985b944e2aSmrg 1995b944e2aSmrg # Set umask so as not to create temps with too-generous modes. 2005b944e2aSmrg # However, 'strip' requires both read and write access to temps. 2015b944e2aSmrg case $mode in 2025b944e2aSmrg # Optimize common cases. 2035b944e2aSmrg *644) cp_umask=133;; 2045b944e2aSmrg *755) cp_umask=22;; 2055b944e2aSmrg 2065b944e2aSmrg *[0-7]) 2075b944e2aSmrg if test -z "$stripcmd"; then 2085b944e2aSmrg u_plus_rw= 2095b944e2aSmrg else 2105b944e2aSmrg u_plus_rw='% 200' 2115b944e2aSmrg fi 2125b944e2aSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2135b944e2aSmrg *) 2145b944e2aSmrg if test -z "$stripcmd"; then 2155b944e2aSmrg u_plus_rw= 2165b944e2aSmrg else 2175b944e2aSmrg u_plus_rw=,u+rw 2185b944e2aSmrg fi 2195b944e2aSmrg cp_umask=$mode$u_plus_rw;; 2205b944e2aSmrg esac 2215b944e2aSmrgfi 2225b944e2aSmrg 223b1297603Smrgfor src 224b1297603Smrgdo 225b1297603Smrg # Protect names starting with `-'. 226b1297603Smrg case $src in 227b1297603Smrg -*) src=./$src ;; 228b1297603Smrg esac 229b1297603Smrg 230b1297603Smrg if test -n "$dir_arg"; then 231b1297603Smrg dst=$src 2325b944e2aSmrg dstdir=$dst 2335b944e2aSmrg test -d "$dstdir" 2345b944e2aSmrg dstdir_status=$? 235b1297603Smrg else 2365b944e2aSmrg 237b1297603Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 238b1297603Smrg # might cause directories to be created, which would be especially bad 239b1297603Smrg # if $src (and thus $dsttmp) contains '*'. 240b1297603Smrg if test ! -f "$src" && test ! -d "$src"; then 241b1297603Smrg echo "$0: $src does not exist." >&2 242b1297603Smrg exit 1 243b1297603Smrg fi 244b1297603Smrg 245b1297603Smrg if test -z "$dstarg"; then 246b1297603Smrg echo "$0: no destination specified." >&2 247b1297603Smrg exit 1 248b1297603Smrg fi 249b1297603Smrg 250b1297603Smrg dst=$dstarg 251b1297603Smrg # Protect names starting with `-'. 252b1297603Smrg case $dst in 253b1297603Smrg -*) dst=./$dst ;; 254b1297603Smrg esac 255b1297603Smrg 256b1297603Smrg # If destination is a directory, append the input filename; won't work 257b1297603Smrg # if double slashes aren't ignored. 258b1297603Smrg if test -d "$dst"; then 259b1297603Smrg if test -n "$no_target_directory"; then 260b1297603Smrg echo "$0: $dstarg: Is a directory" >&2 261b1297603Smrg exit 1 262b1297603Smrg fi 2635b944e2aSmrg dstdir=$dst 2645b944e2aSmrg dst=$dstdir/`basename "$src"` 2655b944e2aSmrg dstdir_status=0 2665b944e2aSmrg else 2675b944e2aSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 2685b944e2aSmrg dstdir=` 2695b944e2aSmrg (dirname "$dst") 2>/dev/null || 2705b944e2aSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 2715b944e2aSmrg X"$dst" : 'X\(//\)[^/]' \| \ 2725b944e2aSmrg X"$dst" : 'X\(//\)$' \| \ 2735b944e2aSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 2745b944e2aSmrg echo X"$dst" | 2755b944e2aSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 2765b944e2aSmrg s//\1/ 2775b944e2aSmrg q 2785b944e2aSmrg } 2795b944e2aSmrg /^X\(\/\/\)[^/].*/{ 2805b944e2aSmrg s//\1/ 2815b944e2aSmrg q 2825b944e2aSmrg } 2835b944e2aSmrg /^X\(\/\/\)$/{ 2845b944e2aSmrg s//\1/ 2855b944e2aSmrg q 2865b944e2aSmrg } 2875b944e2aSmrg /^X\(\/\).*/{ 2885b944e2aSmrg s//\1/ 2895b944e2aSmrg q 2905b944e2aSmrg } 2915b944e2aSmrg s/.*/./; q' 2925b944e2aSmrg ` 2935b944e2aSmrg 2945b944e2aSmrg test -d "$dstdir" 2955b944e2aSmrg dstdir_status=$? 296b1297603Smrg fi 297b1297603Smrg fi 298b1297603Smrg 2995b944e2aSmrg obsolete_mkdir_used=false 3005b944e2aSmrg 3015b944e2aSmrg if test $dstdir_status != 0; then 3025b944e2aSmrg case $posix_mkdir in 3035b944e2aSmrg '') 3045b944e2aSmrg # Create intermediate dirs using mode 755 as modified by the umask. 3055b944e2aSmrg # This is like FreeBSD 'install' as of 1997-10-28. 3065b944e2aSmrg umask=`umask` 3075b944e2aSmrg case $stripcmd.$umask in 3085b944e2aSmrg # Optimize common cases. 3095b944e2aSmrg *[2367][2367]) mkdir_umask=$umask;; 3105b944e2aSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 3115b944e2aSmrg 3125b944e2aSmrg *[0-7]) 3135b944e2aSmrg mkdir_umask=`expr $umask + 22 \ 3145b944e2aSmrg - $umask % 100 % 40 + $umask % 20 \ 3155b944e2aSmrg - $umask % 10 % 4 + $umask % 2 3165b944e2aSmrg `;; 3175b944e2aSmrg *) mkdir_umask=$umask,go-w;; 3185b944e2aSmrg esac 3195b944e2aSmrg 3205b944e2aSmrg # With -d, create the new directory with the user-specified mode. 3215b944e2aSmrg # Otherwise, rely on $mkdir_umask. 3225b944e2aSmrg if test -n "$dir_arg"; then 3235b944e2aSmrg mkdir_mode=-m$mode 3245b944e2aSmrg else 3255b944e2aSmrg mkdir_mode= 3265b944e2aSmrg fi 3275b944e2aSmrg 3285b944e2aSmrg posix_mkdir=false 3295b944e2aSmrg case $umask in 3305b944e2aSmrg *[123567][0-7][0-7]) 3315b944e2aSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 3325b944e2aSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 3335b944e2aSmrg ;; 3345b944e2aSmrg *) 3355b944e2aSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3365b944e2aSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 3375b944e2aSmrg 3385b944e2aSmrg if (umask $mkdir_umask && 3395b944e2aSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 3405b944e2aSmrg then 3415b944e2aSmrg if test -z "$dir_arg" || { 3425b944e2aSmrg # Check for POSIX incompatibilities with -m. 3435b944e2aSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 3445b944e2aSmrg # other-writeable bit of parent directory when it shouldn't. 3455b944e2aSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3465b944e2aSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 3475b944e2aSmrg case $ls_ld_tmpdir in 3485b944e2aSmrg d????-?r-*) different_mode=700;; 3495b944e2aSmrg d????-?--*) different_mode=755;; 3505b944e2aSmrg *) false;; 3515b944e2aSmrg esac && 3525b944e2aSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 3535b944e2aSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 3545b944e2aSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3555b944e2aSmrg } 3565b944e2aSmrg } 3575b944e2aSmrg then posix_mkdir=: 3585b944e2aSmrg fi 3595b944e2aSmrg rmdir "$tmpdir/d" "$tmpdir" 3605b944e2aSmrg else 3615b944e2aSmrg # Remove any dirs left behind by ancient mkdir implementations. 3625b944e2aSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 3635b944e2aSmrg fi 3645b944e2aSmrg trap '' 0;; 3655b944e2aSmrg esac;; 3665b944e2aSmrg esac 367b1297603Smrg 3685b944e2aSmrg if 3695b944e2aSmrg $posix_mkdir && ( 3705b944e2aSmrg umask $mkdir_umask && 3715b944e2aSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3725b944e2aSmrg ) 3735b944e2aSmrg then : 3745b944e2aSmrg else 375b1297603Smrg 3765b944e2aSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 3775b944e2aSmrg # or it failed possibly due to a race condition. Create the 3785b944e2aSmrg # directory the slow way, step by step, checking for races as we go. 3795b944e2aSmrg 3805b944e2aSmrg case $dstdir in 3815b944e2aSmrg /*) prefix=/ ;; 3825b944e2aSmrg -*) prefix=./ ;; 3835b944e2aSmrg *) prefix= ;; 3845b944e2aSmrg esac 3855b944e2aSmrg 3865b944e2aSmrg case $posix_glob in 3875b944e2aSmrg '') 3885b944e2aSmrg if (set -f) 2>/dev/null; then 3895b944e2aSmrg posix_glob=true 3905b944e2aSmrg else 3915b944e2aSmrg posix_glob=false 3925b944e2aSmrg fi ;; 3935b944e2aSmrg esac 3945b944e2aSmrg 3955b944e2aSmrg oIFS=$IFS 3965b944e2aSmrg IFS=/ 3975b944e2aSmrg $posix_glob && set -f 3985b944e2aSmrg set fnord $dstdir 399b1297603Smrg shift 4005b944e2aSmrg $posix_glob && set +f 4015b944e2aSmrg IFS=$oIFS 4025b944e2aSmrg 4035b944e2aSmrg prefixes= 4045b944e2aSmrg 4055b944e2aSmrg for d 4065b944e2aSmrg do 4075b944e2aSmrg test -z "$d" && continue 4085b944e2aSmrg 4095b944e2aSmrg prefix=$prefix$d 4105b944e2aSmrg if test -d "$prefix"; then 4115b944e2aSmrg prefixes= 4125b944e2aSmrg else 4135b944e2aSmrg if $posix_mkdir; then 4145b944e2aSmrg (umask=$mkdir_umask && 4155b944e2aSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 4165b944e2aSmrg # Don't fail if two instances are running concurrently. 4175b944e2aSmrg test -d "$prefix" || exit 1 4185b944e2aSmrg else 4195b944e2aSmrg case $prefix in 4205b944e2aSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 4215b944e2aSmrg *) qprefix=$prefix;; 4225b944e2aSmrg esac 4235b944e2aSmrg prefixes="$prefixes '$qprefix'" 4245b944e2aSmrg fi 4255b944e2aSmrg fi 4265b944e2aSmrg prefix=$prefix/ 4275b944e2aSmrg done 4285b944e2aSmrg 4295b944e2aSmrg if test -n "$prefixes"; then 4305b944e2aSmrg # Don't fail if two instances are running concurrently. 4315b944e2aSmrg (umask $mkdir_umask && 4325b944e2aSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 4335b944e2aSmrg test -d "$dstdir" || exit 1 4345b944e2aSmrg obsolete_mkdir_used=true 435b1297603Smrg fi 4365b944e2aSmrg fi 437b1297603Smrg fi 438b1297603Smrg 439b1297603Smrg if test -n "$dir_arg"; then 4405b944e2aSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4415b944e2aSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4425b944e2aSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4435b944e2aSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 444b1297603Smrg else 445b1297603Smrg 446b1297603Smrg # Make a couple of temp file names in the proper directory. 447b1297603Smrg dsttmp=$dstdir/_inst.$$_ 448b1297603Smrg rmtmp=$dstdir/_rm.$$_ 449b1297603Smrg 450b1297603Smrg # Trap to clean up those temp files at exit. 451b1297603Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 452b1297603Smrg 453b1297603Smrg # Copy the file name to the temp name. 4545b944e2aSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 455b1297603Smrg 456b1297603Smrg # and set any options; do chmod last to preserve setuid bits. 457b1297603Smrg # 458b1297603Smrg # If any of these fail, we abort the whole thing. If we want to 459b1297603Smrg # ignore errors from any of these, just make sure not to ignore 460b1297603Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 461b1297603Smrg # 462b1297603Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ 463b1297603Smrg && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ 464b1297603Smrg && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ 4655b944e2aSmrg && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 466b1297603Smrg 467b1297603Smrg # Now rename the file to the real destination. 4685b944e2aSmrg { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ 469b1297603Smrg || { 470b1297603Smrg # The rename failed, perhaps because mv can't rename something else 471b1297603Smrg # to itself, or perhaps because mv is so ancient that it does not 472b1297603Smrg # support -f. 473b1297603Smrg 474b1297603Smrg # Now remove or move aside any old file at destination location. 475b1297603Smrg # We try this two ways since rm can't unlink itself on some 476b1297603Smrg # systems and the destination file might be busy for other 477b1297603Smrg # reasons. In this case, the final cleanup might fail but the new 478b1297603Smrg # file should still install successfully. 479b1297603Smrg { 4805b944e2aSmrg if test -f "$dst"; then 4815b944e2aSmrg $doit $rmcmd -f "$dst" 2>/dev/null \ 4825b944e2aSmrg || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ 4835b944e2aSmrg && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ 484b1297603Smrg || { 4855b944e2aSmrg echo "$0: cannot unlink or rename $dst" >&2 486b1297603Smrg (exit 1); exit 1 487b1297603Smrg } 488b1297603Smrg else 489b1297603Smrg : 490b1297603Smrg fi 491b1297603Smrg } && 492b1297603Smrg 493b1297603Smrg # Now rename the file to the real destination. 4945b944e2aSmrg $doit $mvcmd "$dsttmp" "$dst" 495b1297603Smrg } 4965b944e2aSmrg } || exit 1 497b1297603Smrg 4985b944e2aSmrg trap '' 0 4995b944e2aSmrg fi 5005b944e2aSmrgdone 501b1297603Smrg 502b1297603Smrg# Local variables: 503b1297603Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 504b1297603Smrg# time-stamp-start: "scriptversion=" 505b1297603Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 506b1297603Smrg# time-stamp-end: "$" 507b1297603Smrg# End: 508