install-sh revision 8b22bf3f
18b22bf3fSmrg#!/bin/sh 28b22bf3fSmrg# install - install a program, script, or datafile 38b22bf3fSmrg 48b22bf3fSmrgscriptversion=2006-10-14.15 58b22bf3fSmrg 68b22bf3fSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 78b22bf3fSmrg# later released in X11R6 (xc/config/util/install.sh) with the 88b22bf3fSmrg# following copyright and license. 98b22bf3fSmrg# 108b22bf3fSmrg# Copyright (C) 1994 X Consortium 118b22bf3fSmrg# 128b22bf3fSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 138b22bf3fSmrg# of this software and associated documentation files (the "Software"), to 148b22bf3fSmrg# deal in the Software without restriction, including without limitation the 158b22bf3fSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 168b22bf3fSmrg# sell copies of the Software, and to permit persons to whom the Software is 178b22bf3fSmrg# furnished to do so, subject to the following conditions: 188b22bf3fSmrg# 198b22bf3fSmrg# The above copyright notice and this permission notice shall be included in 208b22bf3fSmrg# all copies or substantial portions of the Software. 218b22bf3fSmrg# 228b22bf3fSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 238b22bf3fSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 248b22bf3fSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 258b22bf3fSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 268b22bf3fSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 278b22bf3fSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 288b22bf3fSmrg# 298b22bf3fSmrg# Except as contained in this notice, the name of the X Consortium shall not 308b22bf3fSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 318b22bf3fSmrg# ings in this Software without prior written authorization from the X Consor- 328b22bf3fSmrg# tium. 338b22bf3fSmrg# 348b22bf3fSmrg# 358b22bf3fSmrg# FSF changes to this file are in the public domain. 368b22bf3fSmrg# 378b22bf3fSmrg# Calling this script install-sh is preferred over install.sh, to prevent 388b22bf3fSmrg# `make' implicit rules from creating a file called install from it 398b22bf3fSmrg# when there is no Makefile. 408b22bf3fSmrg# 418b22bf3fSmrg# This script is compatible with the BSD install script, but was written 428b22bf3fSmrg# from scratch. 438b22bf3fSmrg 448b22bf3fSmrgnl=' 458b22bf3fSmrg' 468b22bf3fSmrgIFS=" "" $nl" 478b22bf3fSmrg 488b22bf3fSmrg# set DOITPROG to echo to test this script 498b22bf3fSmrg 508b22bf3fSmrg# Don't use :- since 4.3BSD and earlier shells don't like it. 518b22bf3fSmrgdoit="${DOITPROG-}" 528b22bf3fSmrgif test -z "$doit"; then 538b22bf3fSmrg doit_exec=exec 548b22bf3fSmrgelse 558b22bf3fSmrg doit_exec=$doit 568b22bf3fSmrgfi 578b22bf3fSmrg 588b22bf3fSmrg# Put in absolute file names if you don't have them in your path; 598b22bf3fSmrg# or use environment vars. 608b22bf3fSmrg 618b22bf3fSmrgmvprog="${MVPROG-mv}" 628b22bf3fSmrgcpprog="${CPPROG-cp}" 638b22bf3fSmrgchmodprog="${CHMODPROG-chmod}" 648b22bf3fSmrgchownprog="${CHOWNPROG-chown}" 658b22bf3fSmrgchgrpprog="${CHGRPPROG-chgrp}" 668b22bf3fSmrgstripprog="${STRIPPROG-strip}" 678b22bf3fSmrgrmprog="${RMPROG-rm}" 688b22bf3fSmrgmkdirprog="${MKDIRPROG-mkdir}" 698b22bf3fSmrg 708b22bf3fSmrgposix_glob= 718b22bf3fSmrgposix_mkdir= 728b22bf3fSmrg 738b22bf3fSmrg# Desired mode of installed file. 748b22bf3fSmrgmode=0755 758b22bf3fSmrg 768b22bf3fSmrgchmodcmd=$chmodprog 778b22bf3fSmrgchowncmd= 788b22bf3fSmrgchgrpcmd= 798b22bf3fSmrgstripcmd= 808b22bf3fSmrgrmcmd="$rmprog -f" 818b22bf3fSmrgmvcmd="$mvprog" 828b22bf3fSmrgsrc= 838b22bf3fSmrgdst= 848b22bf3fSmrgdir_arg= 858b22bf3fSmrgdstarg= 868b22bf3fSmrgno_target_directory= 878b22bf3fSmrg 888b22bf3fSmrgusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 898b22bf3fSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 908b22bf3fSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 918b22bf3fSmrg or: $0 [OPTION]... -d DIRECTORIES... 928b22bf3fSmrg 938b22bf3fSmrgIn the 1st form, copy SRCFILE to DSTFILE. 948b22bf3fSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 958b22bf3fSmrgIn the 4th, create DIRECTORIES. 968b22bf3fSmrg 978b22bf3fSmrgOptions: 988b22bf3fSmrg-c (ignored) 998b22bf3fSmrg-d create directories instead of installing files. 1008b22bf3fSmrg-g GROUP $chgrpprog installed files to GROUP. 1018b22bf3fSmrg-m MODE $chmodprog installed files to MODE. 1028b22bf3fSmrg-o USER $chownprog installed files to USER. 1038b22bf3fSmrg-s $stripprog installed files. 1048b22bf3fSmrg-t DIRECTORY install into DIRECTORY. 1058b22bf3fSmrg-T report an error if DSTFILE is a directory. 1068b22bf3fSmrg--help display this help and exit. 1078b22bf3fSmrg--version display version info and exit. 1088b22bf3fSmrg 1098b22bf3fSmrgEnvironment variables override the default commands: 1108b22bf3fSmrg CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG 1118b22bf3fSmrg" 1128b22bf3fSmrg 1138b22bf3fSmrgwhile test $# -ne 0; do 1148b22bf3fSmrg case $1 in 1158b22bf3fSmrg -c) shift 1168b22bf3fSmrg continue;; 1178b22bf3fSmrg 1188b22bf3fSmrg -d) dir_arg=true 1198b22bf3fSmrg shift 1208b22bf3fSmrg continue;; 1218b22bf3fSmrg 1228b22bf3fSmrg -g) chgrpcmd="$chgrpprog $2" 1238b22bf3fSmrg shift 1248b22bf3fSmrg shift 1258b22bf3fSmrg continue;; 1268b22bf3fSmrg 1278b22bf3fSmrg --help) echo "$usage"; exit $?;; 1288b22bf3fSmrg 1298b22bf3fSmrg -m) mode=$2 1308b22bf3fSmrg shift 1318b22bf3fSmrg shift 1328b22bf3fSmrg case $mode in 1338b22bf3fSmrg *' '* | *' '* | *' 1348b22bf3fSmrg'* | *'*'* | *'?'* | *'['*) 1358b22bf3fSmrg echo "$0: invalid mode: $mode" >&2 1368b22bf3fSmrg exit 1;; 1378b22bf3fSmrg esac 1388b22bf3fSmrg continue;; 1398b22bf3fSmrg 1408b22bf3fSmrg -o) chowncmd="$chownprog $2" 1418b22bf3fSmrg shift 1428b22bf3fSmrg shift 1438b22bf3fSmrg continue;; 1448b22bf3fSmrg 1458b22bf3fSmrg -s) stripcmd=$stripprog 1468b22bf3fSmrg shift 1478b22bf3fSmrg continue;; 1488b22bf3fSmrg 1498b22bf3fSmrg -t) dstarg=$2 1508b22bf3fSmrg shift 1518b22bf3fSmrg shift 1528b22bf3fSmrg continue;; 1538b22bf3fSmrg 1548b22bf3fSmrg -T) no_target_directory=true 1558b22bf3fSmrg shift 1568b22bf3fSmrg continue;; 1578b22bf3fSmrg 1588b22bf3fSmrg --version) echo "$0 $scriptversion"; exit $?;; 1598b22bf3fSmrg 1608b22bf3fSmrg --) shift 1618b22bf3fSmrg break;; 1628b22bf3fSmrg 1638b22bf3fSmrg -*) echo "$0: invalid option: $1" >&2 1648b22bf3fSmrg exit 1;; 1658b22bf3fSmrg 1668b22bf3fSmrg *) break;; 1678b22bf3fSmrg esac 1688b22bf3fSmrgdone 1698b22bf3fSmrg 1708b22bf3fSmrgif test $# -ne 0 && test -z "$dir_arg$dstarg"; then 1718b22bf3fSmrg # When -d is used, all remaining arguments are directories to create. 1728b22bf3fSmrg # When -t is used, the destination is already specified. 1738b22bf3fSmrg # Otherwise, the last argument is the destination. Remove it from $@. 1748b22bf3fSmrg for arg 1758b22bf3fSmrg do 1768b22bf3fSmrg if test -n "$dstarg"; then 1778b22bf3fSmrg # $@ is not empty: it contains at least $arg. 1788b22bf3fSmrg set fnord "$@" "$dstarg" 1798b22bf3fSmrg shift # fnord 1808b22bf3fSmrg fi 1818b22bf3fSmrg shift # arg 1828b22bf3fSmrg dstarg=$arg 1838b22bf3fSmrg done 1848b22bf3fSmrgfi 1858b22bf3fSmrg 1868b22bf3fSmrgif test $# -eq 0; then 1878b22bf3fSmrg if test -z "$dir_arg"; then 1888b22bf3fSmrg echo "$0: no input file specified." >&2 1898b22bf3fSmrg exit 1 1908b22bf3fSmrg fi 1918b22bf3fSmrg # It's OK to call `install-sh -d' without argument. 1928b22bf3fSmrg # This can happen when creating conditional directories. 1938b22bf3fSmrg exit 0 1948b22bf3fSmrgfi 1958b22bf3fSmrg 1968b22bf3fSmrgif test -z "$dir_arg"; then 1978b22bf3fSmrg trap '(exit $?); exit' 1 2 13 15 1988b22bf3fSmrg 1998b22bf3fSmrg # Set umask so as not to create temps with too-generous modes. 2008b22bf3fSmrg # However, 'strip' requires both read and write access to temps. 2018b22bf3fSmrg case $mode in 2028b22bf3fSmrg # Optimize common cases. 2038b22bf3fSmrg *644) cp_umask=133;; 2048b22bf3fSmrg *755) cp_umask=22;; 2058b22bf3fSmrg 2068b22bf3fSmrg *[0-7]) 2078b22bf3fSmrg if test -z "$stripcmd"; then 2088b22bf3fSmrg u_plus_rw= 2098b22bf3fSmrg else 2108b22bf3fSmrg u_plus_rw='% 200' 2118b22bf3fSmrg fi 2128b22bf3fSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2138b22bf3fSmrg *) 2148b22bf3fSmrg if test -z "$stripcmd"; then 2158b22bf3fSmrg u_plus_rw= 2168b22bf3fSmrg else 2178b22bf3fSmrg u_plus_rw=,u+rw 2188b22bf3fSmrg fi 2198b22bf3fSmrg cp_umask=$mode$u_plus_rw;; 2208b22bf3fSmrg esac 2218b22bf3fSmrgfi 2228b22bf3fSmrg 2238b22bf3fSmrgfor src 2248b22bf3fSmrgdo 2258b22bf3fSmrg # Protect names starting with `-'. 2268b22bf3fSmrg case $src in 2278b22bf3fSmrg -*) src=./$src ;; 2288b22bf3fSmrg esac 2298b22bf3fSmrg 2308b22bf3fSmrg if test -n "$dir_arg"; then 2318b22bf3fSmrg dst=$src 2328b22bf3fSmrg dstdir=$dst 2338b22bf3fSmrg test -d "$dstdir" 2348b22bf3fSmrg dstdir_status=$? 2358b22bf3fSmrg else 2368b22bf3fSmrg 2378b22bf3fSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 2388b22bf3fSmrg # might cause directories to be created, which would be especially bad 2398b22bf3fSmrg # if $src (and thus $dsttmp) contains '*'. 2408b22bf3fSmrg if test ! -f "$src" && test ! -d "$src"; then 2418b22bf3fSmrg echo "$0: $src does not exist." >&2 2428b22bf3fSmrg exit 1 2438b22bf3fSmrg fi 2448b22bf3fSmrg 2458b22bf3fSmrg if test -z "$dstarg"; then 2468b22bf3fSmrg echo "$0: no destination specified." >&2 2478b22bf3fSmrg exit 1 2488b22bf3fSmrg fi 2498b22bf3fSmrg 2508b22bf3fSmrg dst=$dstarg 2518b22bf3fSmrg # Protect names starting with `-'. 2528b22bf3fSmrg case $dst in 2538b22bf3fSmrg -*) dst=./$dst ;; 2548b22bf3fSmrg esac 2558b22bf3fSmrg 2568b22bf3fSmrg # If destination is a directory, append the input filename; won't work 2578b22bf3fSmrg # if double slashes aren't ignored. 2588b22bf3fSmrg if test -d "$dst"; then 2598b22bf3fSmrg if test -n "$no_target_directory"; then 2608b22bf3fSmrg echo "$0: $dstarg: Is a directory" >&2 2618b22bf3fSmrg exit 1 2628b22bf3fSmrg fi 2638b22bf3fSmrg dstdir=$dst 2648b22bf3fSmrg dst=$dstdir/`basename "$src"` 2658b22bf3fSmrg dstdir_status=0 2668b22bf3fSmrg else 2678b22bf3fSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 2688b22bf3fSmrg dstdir=` 2698b22bf3fSmrg (dirname "$dst") 2>/dev/null || 2708b22bf3fSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 2718b22bf3fSmrg X"$dst" : 'X\(//\)[^/]' \| \ 2728b22bf3fSmrg X"$dst" : 'X\(//\)$' \| \ 2738b22bf3fSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 2748b22bf3fSmrg echo X"$dst" | 2758b22bf3fSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 2768b22bf3fSmrg s//\1/ 2778b22bf3fSmrg q 2788b22bf3fSmrg } 2798b22bf3fSmrg /^X\(\/\/\)[^/].*/{ 2808b22bf3fSmrg s//\1/ 2818b22bf3fSmrg q 2828b22bf3fSmrg } 2838b22bf3fSmrg /^X\(\/\/\)$/{ 2848b22bf3fSmrg s//\1/ 2858b22bf3fSmrg q 2868b22bf3fSmrg } 2878b22bf3fSmrg /^X\(\/\).*/{ 2888b22bf3fSmrg s//\1/ 2898b22bf3fSmrg q 2908b22bf3fSmrg } 2918b22bf3fSmrg s/.*/./; q' 2928b22bf3fSmrg ` 2938b22bf3fSmrg 2948b22bf3fSmrg test -d "$dstdir" 2958b22bf3fSmrg dstdir_status=$? 2968b22bf3fSmrg fi 2978b22bf3fSmrg fi 2988b22bf3fSmrg 2998b22bf3fSmrg obsolete_mkdir_used=false 3008b22bf3fSmrg 3018b22bf3fSmrg if test $dstdir_status != 0; then 3028b22bf3fSmrg case $posix_mkdir in 3038b22bf3fSmrg '') 3048b22bf3fSmrg # Create intermediate dirs using mode 755 as modified by the umask. 3058b22bf3fSmrg # This is like FreeBSD 'install' as of 1997-10-28. 3068b22bf3fSmrg umask=`umask` 3078b22bf3fSmrg case $stripcmd.$umask in 3088b22bf3fSmrg # Optimize common cases. 3098b22bf3fSmrg *[2367][2367]) mkdir_umask=$umask;; 3108b22bf3fSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 3118b22bf3fSmrg 3128b22bf3fSmrg *[0-7]) 3138b22bf3fSmrg mkdir_umask=`expr $umask + 22 \ 3148b22bf3fSmrg - $umask % 100 % 40 + $umask % 20 \ 3158b22bf3fSmrg - $umask % 10 % 4 + $umask % 2 3168b22bf3fSmrg `;; 3178b22bf3fSmrg *) mkdir_umask=$umask,go-w;; 3188b22bf3fSmrg esac 3198b22bf3fSmrg 3208b22bf3fSmrg # With -d, create the new directory with the user-specified mode. 3218b22bf3fSmrg # Otherwise, rely on $mkdir_umask. 3228b22bf3fSmrg if test -n "$dir_arg"; then 3238b22bf3fSmrg mkdir_mode=-m$mode 3248b22bf3fSmrg else 3258b22bf3fSmrg mkdir_mode= 3268b22bf3fSmrg fi 3278b22bf3fSmrg 3288b22bf3fSmrg posix_mkdir=false 3298b22bf3fSmrg case $umask in 3308b22bf3fSmrg *[123567][0-7][0-7]) 3318b22bf3fSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 3328b22bf3fSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 3338b22bf3fSmrg ;; 3348b22bf3fSmrg *) 3358b22bf3fSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3368b22bf3fSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 3378b22bf3fSmrg 3388b22bf3fSmrg if (umask $mkdir_umask && 3398b22bf3fSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 3408b22bf3fSmrg then 3418b22bf3fSmrg if test -z "$dir_arg" || { 3428b22bf3fSmrg # Check for POSIX incompatibilities with -m. 3438b22bf3fSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 3448b22bf3fSmrg # other-writeable bit of parent directory when it shouldn't. 3458b22bf3fSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3468b22bf3fSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 3478b22bf3fSmrg case $ls_ld_tmpdir in 3488b22bf3fSmrg d????-?r-*) different_mode=700;; 3498b22bf3fSmrg d????-?--*) different_mode=755;; 3508b22bf3fSmrg *) false;; 3518b22bf3fSmrg esac && 3528b22bf3fSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 3538b22bf3fSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 3548b22bf3fSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3558b22bf3fSmrg } 3568b22bf3fSmrg } 3578b22bf3fSmrg then posix_mkdir=: 3588b22bf3fSmrg fi 3598b22bf3fSmrg rmdir "$tmpdir/d" "$tmpdir" 3608b22bf3fSmrg else 3618b22bf3fSmrg # Remove any dirs left behind by ancient mkdir implementations. 3628b22bf3fSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 3638b22bf3fSmrg fi 3648b22bf3fSmrg trap '' 0;; 3658b22bf3fSmrg esac;; 3668b22bf3fSmrg esac 3678b22bf3fSmrg 3688b22bf3fSmrg if 3698b22bf3fSmrg $posix_mkdir && ( 3708b22bf3fSmrg umask $mkdir_umask && 3718b22bf3fSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3728b22bf3fSmrg ) 3738b22bf3fSmrg then : 3748b22bf3fSmrg else 3758b22bf3fSmrg 3768b22bf3fSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 3778b22bf3fSmrg # or it failed possibly due to a race condition. Create the 3788b22bf3fSmrg # directory the slow way, step by step, checking for races as we go. 3798b22bf3fSmrg 3808b22bf3fSmrg case $dstdir in 3818b22bf3fSmrg /*) prefix=/ ;; 3828b22bf3fSmrg -*) prefix=./ ;; 3838b22bf3fSmrg *) prefix= ;; 3848b22bf3fSmrg esac 3858b22bf3fSmrg 3868b22bf3fSmrg case $posix_glob in 3878b22bf3fSmrg '') 3888b22bf3fSmrg if (set -f) 2>/dev/null; then 3898b22bf3fSmrg posix_glob=true 3908b22bf3fSmrg else 3918b22bf3fSmrg posix_glob=false 3928b22bf3fSmrg fi ;; 3938b22bf3fSmrg esac 3948b22bf3fSmrg 3958b22bf3fSmrg oIFS=$IFS 3968b22bf3fSmrg IFS=/ 3978b22bf3fSmrg $posix_glob && set -f 3988b22bf3fSmrg set fnord $dstdir 3998b22bf3fSmrg shift 4008b22bf3fSmrg $posix_glob && set +f 4018b22bf3fSmrg IFS=$oIFS 4028b22bf3fSmrg 4038b22bf3fSmrg prefixes= 4048b22bf3fSmrg 4058b22bf3fSmrg for d 4068b22bf3fSmrg do 4078b22bf3fSmrg test -z "$d" && continue 4088b22bf3fSmrg 4098b22bf3fSmrg prefix=$prefix$d 4108b22bf3fSmrg if test -d "$prefix"; then 4118b22bf3fSmrg prefixes= 4128b22bf3fSmrg else 4138b22bf3fSmrg if $posix_mkdir; then 4148b22bf3fSmrg (umask=$mkdir_umask && 4158b22bf3fSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 4168b22bf3fSmrg # Don't fail if two instances are running concurrently. 4178b22bf3fSmrg test -d "$prefix" || exit 1 4188b22bf3fSmrg else 4198b22bf3fSmrg case $prefix in 4208b22bf3fSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 4218b22bf3fSmrg *) qprefix=$prefix;; 4228b22bf3fSmrg esac 4238b22bf3fSmrg prefixes="$prefixes '$qprefix'" 4248b22bf3fSmrg fi 4258b22bf3fSmrg fi 4268b22bf3fSmrg prefix=$prefix/ 4278b22bf3fSmrg done 4288b22bf3fSmrg 4298b22bf3fSmrg if test -n "$prefixes"; then 4308b22bf3fSmrg # Don't fail if two instances are running concurrently. 4318b22bf3fSmrg (umask $mkdir_umask && 4328b22bf3fSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 4338b22bf3fSmrg test -d "$dstdir" || exit 1 4348b22bf3fSmrg obsolete_mkdir_used=true 4358b22bf3fSmrg fi 4368b22bf3fSmrg fi 4378b22bf3fSmrg fi 4388b22bf3fSmrg 4398b22bf3fSmrg if test -n "$dir_arg"; then 4408b22bf3fSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4418b22bf3fSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4428b22bf3fSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4438b22bf3fSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 4448b22bf3fSmrg else 4458b22bf3fSmrg 4468b22bf3fSmrg # Make a couple of temp file names in the proper directory. 4478b22bf3fSmrg dsttmp=$dstdir/_inst.$$_ 4488b22bf3fSmrg rmtmp=$dstdir/_rm.$$_ 4498b22bf3fSmrg 4508b22bf3fSmrg # Trap to clean up those temp files at exit. 4518b22bf3fSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 4528b22bf3fSmrg 4538b22bf3fSmrg # Copy the file name to the temp name. 4548b22bf3fSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 4558b22bf3fSmrg 4568b22bf3fSmrg # and set any options; do chmod last to preserve setuid bits. 4578b22bf3fSmrg # 4588b22bf3fSmrg # If any of these fail, we abort the whole thing. If we want to 4598b22bf3fSmrg # ignore errors from any of these, just make sure not to ignore 4608b22bf3fSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 4618b22bf3fSmrg # 4628b22bf3fSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ 4638b22bf3fSmrg && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ 4648b22bf3fSmrg && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ 4658b22bf3fSmrg && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 4668b22bf3fSmrg 4678b22bf3fSmrg # Now rename the file to the real destination. 4688b22bf3fSmrg { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ 4698b22bf3fSmrg || { 4708b22bf3fSmrg # The rename failed, perhaps because mv can't rename something else 4718b22bf3fSmrg # to itself, or perhaps because mv is so ancient that it does not 4728b22bf3fSmrg # support -f. 4738b22bf3fSmrg 4748b22bf3fSmrg # Now remove or move aside any old file at destination location. 4758b22bf3fSmrg # We try this two ways since rm can't unlink itself on some 4768b22bf3fSmrg # systems and the destination file might be busy for other 4778b22bf3fSmrg # reasons. In this case, the final cleanup might fail but the new 4788b22bf3fSmrg # file should still install successfully. 4798b22bf3fSmrg { 4808b22bf3fSmrg if test -f "$dst"; then 4818b22bf3fSmrg $doit $rmcmd -f "$dst" 2>/dev/null \ 4828b22bf3fSmrg || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ 4838b22bf3fSmrg && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ 4848b22bf3fSmrg || { 4858b22bf3fSmrg echo "$0: cannot unlink or rename $dst" >&2 4868b22bf3fSmrg (exit 1); exit 1 4878b22bf3fSmrg } 4888b22bf3fSmrg else 4898b22bf3fSmrg : 4908b22bf3fSmrg fi 4918b22bf3fSmrg } && 4928b22bf3fSmrg 4938b22bf3fSmrg # Now rename the file to the real destination. 4948b22bf3fSmrg $doit $mvcmd "$dsttmp" "$dst" 4958b22bf3fSmrg } 4968b22bf3fSmrg } || exit 1 4978b22bf3fSmrg 4988b22bf3fSmrg trap '' 0 4998b22bf3fSmrg fi 5008b22bf3fSmrgdone 5018b22bf3fSmrg 5028b22bf3fSmrg# Local variables: 5038b22bf3fSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 5048b22bf3fSmrg# time-stamp-start: "scriptversion=" 5058b22bf3fSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 5068b22bf3fSmrg# time-stamp-end: "$" 5078b22bf3fSmrg# End: 508