install-sh revision 4d9b34d9
14d9b34d9Smrg#!/bin/sh 24d9b34d9Smrg# install - install a program, script, or datafile 34d9b34d9Smrg 44d9b34d9Smrgscriptversion=2006-10-14.15 54d9b34d9Smrg 64d9b34d9Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 74d9b34d9Smrg# later released in X11R6 (xc/config/util/install.sh) with the 84d9b34d9Smrg# following copyright and license. 94d9b34d9Smrg# 104d9b34d9Smrg# Copyright (C) 1994 X Consortium 114d9b34d9Smrg# 124d9b34d9Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 134d9b34d9Smrg# of this software and associated documentation files (the "Software"), to 144d9b34d9Smrg# deal in the Software without restriction, including without limitation the 154d9b34d9Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 164d9b34d9Smrg# sell copies of the Software, and to permit persons to whom the Software is 174d9b34d9Smrg# furnished to do so, subject to the following conditions: 184d9b34d9Smrg# 194d9b34d9Smrg# The above copyright notice and this permission notice shall be included in 204d9b34d9Smrg# all copies or substantial portions of the Software. 214d9b34d9Smrg# 224d9b34d9Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 234d9b34d9Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 244d9b34d9Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 254d9b34d9Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 264d9b34d9Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 274d9b34d9Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 284d9b34d9Smrg# 294d9b34d9Smrg# Except as contained in this notice, the name of the X Consortium shall not 304d9b34d9Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 314d9b34d9Smrg# ings in this Software without prior written authorization from the X Consor- 324d9b34d9Smrg# tium. 334d9b34d9Smrg# 344d9b34d9Smrg# 354d9b34d9Smrg# FSF changes to this file are in the public domain. 364d9b34d9Smrg# 374d9b34d9Smrg# Calling this script install-sh is preferred over install.sh, to prevent 384d9b34d9Smrg# `make' implicit rules from creating a file called install from it 394d9b34d9Smrg# when there is no Makefile. 404d9b34d9Smrg# 414d9b34d9Smrg# This script is compatible with the BSD install script, but was written 424d9b34d9Smrg# from scratch. 434d9b34d9Smrg 444d9b34d9Smrgnl=' 454d9b34d9Smrg' 464d9b34d9SmrgIFS=" "" $nl" 474d9b34d9Smrg 484d9b34d9Smrg# set DOITPROG to echo to test this script 494d9b34d9Smrg 504d9b34d9Smrg# Don't use :- since 4.3BSD and earlier shells don't like it. 514d9b34d9Smrgdoit="${DOITPROG-}" 524d9b34d9Smrgif test -z "$doit"; then 534d9b34d9Smrg doit_exec=exec 544d9b34d9Smrgelse 554d9b34d9Smrg doit_exec=$doit 564d9b34d9Smrgfi 574d9b34d9Smrg 584d9b34d9Smrg# Put in absolute file names if you don't have them in your path; 594d9b34d9Smrg# or use environment vars. 604d9b34d9Smrg 614d9b34d9Smrgmvprog="${MVPROG-mv}" 624d9b34d9Smrgcpprog="${CPPROG-cp}" 634d9b34d9Smrgchmodprog="${CHMODPROG-chmod}" 644d9b34d9Smrgchownprog="${CHOWNPROG-chown}" 654d9b34d9Smrgchgrpprog="${CHGRPPROG-chgrp}" 664d9b34d9Smrgstripprog="${STRIPPROG-strip}" 674d9b34d9Smrgrmprog="${RMPROG-rm}" 684d9b34d9Smrgmkdirprog="${MKDIRPROG-mkdir}" 694d9b34d9Smrg 704d9b34d9Smrgposix_glob= 714d9b34d9Smrgposix_mkdir= 724d9b34d9Smrg 734d9b34d9Smrg# Desired mode of installed file. 744d9b34d9Smrgmode=0755 754d9b34d9Smrg 764d9b34d9Smrgchmodcmd=$chmodprog 774d9b34d9Smrgchowncmd= 784d9b34d9Smrgchgrpcmd= 794d9b34d9Smrgstripcmd= 804d9b34d9Smrgrmcmd="$rmprog -f" 814d9b34d9Smrgmvcmd="$mvprog" 824d9b34d9Smrgsrc= 834d9b34d9Smrgdst= 844d9b34d9Smrgdir_arg= 854d9b34d9Smrgdstarg= 864d9b34d9Smrgno_target_directory= 874d9b34d9Smrg 884d9b34d9Smrgusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 894d9b34d9Smrg or: $0 [OPTION]... SRCFILES... DIRECTORY 904d9b34d9Smrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 914d9b34d9Smrg or: $0 [OPTION]... -d DIRECTORIES... 924d9b34d9Smrg 934d9b34d9SmrgIn the 1st form, copy SRCFILE to DSTFILE. 944d9b34d9SmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 954d9b34d9SmrgIn the 4th, create DIRECTORIES. 964d9b34d9Smrg 974d9b34d9SmrgOptions: 984d9b34d9Smrg-c (ignored) 994d9b34d9Smrg-d create directories instead of installing files. 1004d9b34d9Smrg-g GROUP $chgrpprog installed files to GROUP. 1014d9b34d9Smrg-m MODE $chmodprog installed files to MODE. 1024d9b34d9Smrg-o USER $chownprog installed files to USER. 1034d9b34d9Smrg-s $stripprog installed files. 1044d9b34d9Smrg-t DIRECTORY install into DIRECTORY. 1054d9b34d9Smrg-T report an error if DSTFILE is a directory. 1064d9b34d9Smrg--help display this help and exit. 1074d9b34d9Smrg--version display version info and exit. 1084d9b34d9Smrg 1094d9b34d9SmrgEnvironment variables override the default commands: 1104d9b34d9Smrg CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG 1114d9b34d9Smrg" 1124d9b34d9Smrg 1134d9b34d9Smrgwhile test $# -ne 0; do 1144d9b34d9Smrg case $1 in 1154d9b34d9Smrg -c) shift 1164d9b34d9Smrg continue;; 1174d9b34d9Smrg 1184d9b34d9Smrg -d) dir_arg=true 1194d9b34d9Smrg shift 1204d9b34d9Smrg continue;; 1214d9b34d9Smrg 1224d9b34d9Smrg -g) chgrpcmd="$chgrpprog $2" 1234d9b34d9Smrg shift 1244d9b34d9Smrg shift 1254d9b34d9Smrg continue;; 1264d9b34d9Smrg 1274d9b34d9Smrg --help) echo "$usage"; exit $?;; 1284d9b34d9Smrg 1294d9b34d9Smrg -m) mode=$2 1304d9b34d9Smrg shift 1314d9b34d9Smrg shift 1324d9b34d9Smrg case $mode in 1334d9b34d9Smrg *' '* | *' '* | *' 1344d9b34d9Smrg'* | *'*'* | *'?'* | *'['*) 1354d9b34d9Smrg echo "$0: invalid mode: $mode" >&2 1364d9b34d9Smrg exit 1;; 1374d9b34d9Smrg esac 1384d9b34d9Smrg continue;; 1394d9b34d9Smrg 1404d9b34d9Smrg -o) chowncmd="$chownprog $2" 1414d9b34d9Smrg shift 1424d9b34d9Smrg shift 1434d9b34d9Smrg continue;; 1444d9b34d9Smrg 1454d9b34d9Smrg -s) stripcmd=$stripprog 1464d9b34d9Smrg shift 1474d9b34d9Smrg continue;; 1484d9b34d9Smrg 1494d9b34d9Smrg -t) dstarg=$2 1504d9b34d9Smrg shift 1514d9b34d9Smrg shift 1524d9b34d9Smrg continue;; 1534d9b34d9Smrg 1544d9b34d9Smrg -T) no_target_directory=true 1554d9b34d9Smrg shift 1564d9b34d9Smrg continue;; 1574d9b34d9Smrg 1584d9b34d9Smrg --version) echo "$0 $scriptversion"; exit $?;; 1594d9b34d9Smrg 1604d9b34d9Smrg --) shift 1614d9b34d9Smrg break;; 1624d9b34d9Smrg 1634d9b34d9Smrg -*) echo "$0: invalid option: $1" >&2 1644d9b34d9Smrg exit 1;; 1654d9b34d9Smrg 1664d9b34d9Smrg *) break;; 1674d9b34d9Smrg esac 1684d9b34d9Smrgdone 1694d9b34d9Smrg 1704d9b34d9Smrgif test $# -ne 0 && test -z "$dir_arg$dstarg"; then 1714d9b34d9Smrg # When -d is used, all remaining arguments are directories to create. 1724d9b34d9Smrg # When -t is used, the destination is already specified. 1734d9b34d9Smrg # Otherwise, the last argument is the destination. Remove it from $@. 1744d9b34d9Smrg for arg 1754d9b34d9Smrg do 1764d9b34d9Smrg if test -n "$dstarg"; then 1774d9b34d9Smrg # $@ is not empty: it contains at least $arg. 1784d9b34d9Smrg set fnord "$@" "$dstarg" 1794d9b34d9Smrg shift # fnord 1804d9b34d9Smrg fi 1814d9b34d9Smrg shift # arg 1824d9b34d9Smrg dstarg=$arg 1834d9b34d9Smrg done 1844d9b34d9Smrgfi 1854d9b34d9Smrg 1864d9b34d9Smrgif test $# -eq 0; then 1874d9b34d9Smrg if test -z "$dir_arg"; then 1884d9b34d9Smrg echo "$0: no input file specified." >&2 1894d9b34d9Smrg exit 1 1904d9b34d9Smrg fi 1914d9b34d9Smrg # It's OK to call `install-sh -d' without argument. 1924d9b34d9Smrg # This can happen when creating conditional directories. 1934d9b34d9Smrg exit 0 1944d9b34d9Smrgfi 1954d9b34d9Smrg 1964d9b34d9Smrgif test -z "$dir_arg"; then 1974d9b34d9Smrg trap '(exit $?); exit' 1 2 13 15 1984d9b34d9Smrg 1994d9b34d9Smrg # Set umask so as not to create temps with too-generous modes. 2004d9b34d9Smrg # However, 'strip' requires both read and write access to temps. 2014d9b34d9Smrg case $mode in 2024d9b34d9Smrg # Optimize common cases. 2034d9b34d9Smrg *644) cp_umask=133;; 2044d9b34d9Smrg *755) cp_umask=22;; 2054d9b34d9Smrg 2064d9b34d9Smrg *[0-7]) 2074d9b34d9Smrg if test -z "$stripcmd"; then 2084d9b34d9Smrg u_plus_rw= 2094d9b34d9Smrg else 2104d9b34d9Smrg u_plus_rw='% 200' 2114d9b34d9Smrg fi 2124d9b34d9Smrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2134d9b34d9Smrg *) 2144d9b34d9Smrg if test -z "$stripcmd"; then 2154d9b34d9Smrg u_plus_rw= 2164d9b34d9Smrg else 2174d9b34d9Smrg u_plus_rw=,u+rw 2184d9b34d9Smrg fi 2194d9b34d9Smrg cp_umask=$mode$u_plus_rw;; 2204d9b34d9Smrg esac 2214d9b34d9Smrgfi 2224d9b34d9Smrg 2234d9b34d9Smrgfor src 2244d9b34d9Smrgdo 2254d9b34d9Smrg # Protect names starting with `-'. 2264d9b34d9Smrg case $src in 2274d9b34d9Smrg -*) src=./$src ;; 2284d9b34d9Smrg esac 2294d9b34d9Smrg 2304d9b34d9Smrg if test -n "$dir_arg"; then 2314d9b34d9Smrg dst=$src 2324d9b34d9Smrg dstdir=$dst 2334d9b34d9Smrg test -d "$dstdir" 2344d9b34d9Smrg dstdir_status=$? 2354d9b34d9Smrg else 2364d9b34d9Smrg 2374d9b34d9Smrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 2384d9b34d9Smrg # might cause directories to be created, which would be especially bad 2394d9b34d9Smrg # if $src (and thus $dsttmp) contains '*'. 2404d9b34d9Smrg if test ! -f "$src" && test ! -d "$src"; then 2414d9b34d9Smrg echo "$0: $src does not exist." >&2 2424d9b34d9Smrg exit 1 2434d9b34d9Smrg fi 2444d9b34d9Smrg 2454d9b34d9Smrg if test -z "$dstarg"; then 2464d9b34d9Smrg echo "$0: no destination specified." >&2 2474d9b34d9Smrg exit 1 2484d9b34d9Smrg fi 2494d9b34d9Smrg 2504d9b34d9Smrg dst=$dstarg 2514d9b34d9Smrg # Protect names starting with `-'. 2524d9b34d9Smrg case $dst in 2534d9b34d9Smrg -*) dst=./$dst ;; 2544d9b34d9Smrg esac 2554d9b34d9Smrg 2564d9b34d9Smrg # If destination is a directory, append the input filename; won't work 2574d9b34d9Smrg # if double slashes aren't ignored. 2584d9b34d9Smrg if test -d "$dst"; then 2594d9b34d9Smrg if test -n "$no_target_directory"; then 2604d9b34d9Smrg echo "$0: $dstarg: Is a directory" >&2 2614d9b34d9Smrg exit 1 2624d9b34d9Smrg fi 2634d9b34d9Smrg dstdir=$dst 2644d9b34d9Smrg dst=$dstdir/`basename "$src"` 2654d9b34d9Smrg dstdir_status=0 2664d9b34d9Smrg else 2674d9b34d9Smrg # Prefer dirname, but fall back on a substitute if dirname fails. 2684d9b34d9Smrg dstdir=` 2694d9b34d9Smrg (dirname "$dst") 2>/dev/null || 2704d9b34d9Smrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 2714d9b34d9Smrg X"$dst" : 'X\(//\)[^/]' \| \ 2724d9b34d9Smrg X"$dst" : 'X\(//\)$' \| \ 2734d9b34d9Smrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 2744d9b34d9Smrg echo X"$dst" | 2754d9b34d9Smrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 2764d9b34d9Smrg s//\1/ 2774d9b34d9Smrg q 2784d9b34d9Smrg } 2794d9b34d9Smrg /^X\(\/\/\)[^/].*/{ 2804d9b34d9Smrg s//\1/ 2814d9b34d9Smrg q 2824d9b34d9Smrg } 2834d9b34d9Smrg /^X\(\/\/\)$/{ 2844d9b34d9Smrg s//\1/ 2854d9b34d9Smrg q 2864d9b34d9Smrg } 2874d9b34d9Smrg /^X\(\/\).*/{ 2884d9b34d9Smrg s//\1/ 2894d9b34d9Smrg q 2904d9b34d9Smrg } 2914d9b34d9Smrg s/.*/./; q' 2924d9b34d9Smrg ` 2934d9b34d9Smrg 2944d9b34d9Smrg test -d "$dstdir" 2954d9b34d9Smrg dstdir_status=$? 2964d9b34d9Smrg fi 2974d9b34d9Smrg fi 2984d9b34d9Smrg 2994d9b34d9Smrg obsolete_mkdir_used=false 3004d9b34d9Smrg 3014d9b34d9Smrg if test $dstdir_status != 0; then 3024d9b34d9Smrg case $posix_mkdir in 3034d9b34d9Smrg '') 3044d9b34d9Smrg # Create intermediate dirs using mode 755 as modified by the umask. 3054d9b34d9Smrg # This is like FreeBSD 'install' as of 1997-10-28. 3064d9b34d9Smrg umask=`umask` 3074d9b34d9Smrg case $stripcmd.$umask in 3084d9b34d9Smrg # Optimize common cases. 3094d9b34d9Smrg *[2367][2367]) mkdir_umask=$umask;; 3104d9b34d9Smrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 3114d9b34d9Smrg 3124d9b34d9Smrg *[0-7]) 3134d9b34d9Smrg mkdir_umask=`expr $umask + 22 \ 3144d9b34d9Smrg - $umask % 100 % 40 + $umask % 20 \ 3154d9b34d9Smrg - $umask % 10 % 4 + $umask % 2 3164d9b34d9Smrg `;; 3174d9b34d9Smrg *) mkdir_umask=$umask,go-w;; 3184d9b34d9Smrg esac 3194d9b34d9Smrg 3204d9b34d9Smrg # With -d, create the new directory with the user-specified mode. 3214d9b34d9Smrg # Otherwise, rely on $mkdir_umask. 3224d9b34d9Smrg if test -n "$dir_arg"; then 3234d9b34d9Smrg mkdir_mode=-m$mode 3244d9b34d9Smrg else 3254d9b34d9Smrg mkdir_mode= 3264d9b34d9Smrg fi 3274d9b34d9Smrg 3284d9b34d9Smrg posix_mkdir=false 3294d9b34d9Smrg case $umask in 3304d9b34d9Smrg *[123567][0-7][0-7]) 3314d9b34d9Smrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 3324d9b34d9Smrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 3334d9b34d9Smrg ;; 3344d9b34d9Smrg *) 3354d9b34d9Smrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3364d9b34d9Smrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 3374d9b34d9Smrg 3384d9b34d9Smrg if (umask $mkdir_umask && 3394d9b34d9Smrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 3404d9b34d9Smrg then 3414d9b34d9Smrg if test -z "$dir_arg" || { 3424d9b34d9Smrg # Check for POSIX incompatibilities with -m. 3434d9b34d9Smrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 3444d9b34d9Smrg # other-writeable bit of parent directory when it shouldn't. 3454d9b34d9Smrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3464d9b34d9Smrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 3474d9b34d9Smrg case $ls_ld_tmpdir in 3484d9b34d9Smrg d????-?r-*) different_mode=700;; 3494d9b34d9Smrg d????-?--*) different_mode=755;; 3504d9b34d9Smrg *) false;; 3514d9b34d9Smrg esac && 3524d9b34d9Smrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 3534d9b34d9Smrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 3544d9b34d9Smrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3554d9b34d9Smrg } 3564d9b34d9Smrg } 3574d9b34d9Smrg then posix_mkdir=: 3584d9b34d9Smrg fi 3594d9b34d9Smrg rmdir "$tmpdir/d" "$tmpdir" 3604d9b34d9Smrg else 3614d9b34d9Smrg # Remove any dirs left behind by ancient mkdir implementations. 3624d9b34d9Smrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 3634d9b34d9Smrg fi 3644d9b34d9Smrg trap '' 0;; 3654d9b34d9Smrg esac;; 3664d9b34d9Smrg esac 3674d9b34d9Smrg 3684d9b34d9Smrg if 3694d9b34d9Smrg $posix_mkdir && ( 3704d9b34d9Smrg umask $mkdir_umask && 3714d9b34d9Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3724d9b34d9Smrg ) 3734d9b34d9Smrg then : 3744d9b34d9Smrg else 3754d9b34d9Smrg 3764d9b34d9Smrg # The umask is ridiculous, or mkdir does not conform to POSIX, 3774d9b34d9Smrg # or it failed possibly due to a race condition. Create the 3784d9b34d9Smrg # directory the slow way, step by step, checking for races as we go. 3794d9b34d9Smrg 3804d9b34d9Smrg case $dstdir in 3814d9b34d9Smrg /*) prefix=/ ;; 3824d9b34d9Smrg -*) prefix=./ ;; 3834d9b34d9Smrg *) prefix= ;; 3844d9b34d9Smrg esac 3854d9b34d9Smrg 3864d9b34d9Smrg case $posix_glob in 3874d9b34d9Smrg '') 3884d9b34d9Smrg if (set -f) 2>/dev/null; then 3894d9b34d9Smrg posix_glob=true 3904d9b34d9Smrg else 3914d9b34d9Smrg posix_glob=false 3924d9b34d9Smrg fi ;; 3934d9b34d9Smrg esac 3944d9b34d9Smrg 3954d9b34d9Smrg oIFS=$IFS 3964d9b34d9Smrg IFS=/ 3974d9b34d9Smrg $posix_glob && set -f 3984d9b34d9Smrg set fnord $dstdir 3994d9b34d9Smrg shift 4004d9b34d9Smrg $posix_glob && set +f 4014d9b34d9Smrg IFS=$oIFS 4024d9b34d9Smrg 4034d9b34d9Smrg prefixes= 4044d9b34d9Smrg 4054d9b34d9Smrg for d 4064d9b34d9Smrg do 4074d9b34d9Smrg test -z "$d" && continue 4084d9b34d9Smrg 4094d9b34d9Smrg prefix=$prefix$d 4104d9b34d9Smrg if test -d "$prefix"; then 4114d9b34d9Smrg prefixes= 4124d9b34d9Smrg else 4134d9b34d9Smrg if $posix_mkdir; then 4144d9b34d9Smrg (umask=$mkdir_umask && 4154d9b34d9Smrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 4164d9b34d9Smrg # Don't fail if two instances are running concurrently. 4174d9b34d9Smrg test -d "$prefix" || exit 1 4184d9b34d9Smrg else 4194d9b34d9Smrg case $prefix in 4204d9b34d9Smrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 4214d9b34d9Smrg *) qprefix=$prefix;; 4224d9b34d9Smrg esac 4234d9b34d9Smrg prefixes="$prefixes '$qprefix'" 4244d9b34d9Smrg fi 4254d9b34d9Smrg fi 4264d9b34d9Smrg prefix=$prefix/ 4274d9b34d9Smrg done 4284d9b34d9Smrg 4294d9b34d9Smrg if test -n "$prefixes"; then 4304d9b34d9Smrg # Don't fail if two instances are running concurrently. 4314d9b34d9Smrg (umask $mkdir_umask && 4324d9b34d9Smrg eval "\$doit_exec \$mkdirprog $prefixes") || 4334d9b34d9Smrg test -d "$dstdir" || exit 1 4344d9b34d9Smrg obsolete_mkdir_used=true 4354d9b34d9Smrg fi 4364d9b34d9Smrg fi 4374d9b34d9Smrg fi 4384d9b34d9Smrg 4394d9b34d9Smrg if test -n "$dir_arg"; then 4404d9b34d9Smrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4414d9b34d9Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4424d9b34d9Smrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4434d9b34d9Smrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 4444d9b34d9Smrg else 4454d9b34d9Smrg 4464d9b34d9Smrg # Make a couple of temp file names in the proper directory. 4474d9b34d9Smrg dsttmp=$dstdir/_inst.$$_ 4484d9b34d9Smrg rmtmp=$dstdir/_rm.$$_ 4494d9b34d9Smrg 4504d9b34d9Smrg # Trap to clean up those temp files at exit. 4514d9b34d9Smrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 4524d9b34d9Smrg 4534d9b34d9Smrg # Copy the file name to the temp name. 4544d9b34d9Smrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 4554d9b34d9Smrg 4564d9b34d9Smrg # and set any options; do chmod last to preserve setuid bits. 4574d9b34d9Smrg # 4584d9b34d9Smrg # If any of these fail, we abort the whole thing. If we want to 4594d9b34d9Smrg # ignore errors from any of these, just make sure not to ignore 4604d9b34d9Smrg # errors from the above "$doit $cpprog $src $dsttmp" command. 4614d9b34d9Smrg # 4624d9b34d9Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ 4634d9b34d9Smrg && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ 4644d9b34d9Smrg && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ 4654d9b34d9Smrg && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 4664d9b34d9Smrg 4674d9b34d9Smrg # Now rename the file to the real destination. 4684d9b34d9Smrg { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ 4694d9b34d9Smrg || { 4704d9b34d9Smrg # The rename failed, perhaps because mv can't rename something else 4714d9b34d9Smrg # to itself, or perhaps because mv is so ancient that it does not 4724d9b34d9Smrg # support -f. 4734d9b34d9Smrg 4744d9b34d9Smrg # Now remove or move aside any old file at destination location. 4754d9b34d9Smrg # We try this two ways since rm can't unlink itself on some 4764d9b34d9Smrg # systems and the destination file might be busy for other 4774d9b34d9Smrg # reasons. In this case, the final cleanup might fail but the new 4784d9b34d9Smrg # file should still install successfully. 4794d9b34d9Smrg { 4804d9b34d9Smrg if test -f "$dst"; then 4814d9b34d9Smrg $doit $rmcmd -f "$dst" 2>/dev/null \ 4824d9b34d9Smrg || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ 4834d9b34d9Smrg && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ 4844d9b34d9Smrg || { 4854d9b34d9Smrg echo "$0: cannot unlink or rename $dst" >&2 4864d9b34d9Smrg (exit 1); exit 1 4874d9b34d9Smrg } 4884d9b34d9Smrg else 4894d9b34d9Smrg : 4904d9b34d9Smrg fi 4914d9b34d9Smrg } && 4924d9b34d9Smrg 4934d9b34d9Smrg # Now rename the file to the real destination. 4944d9b34d9Smrg $doit $mvcmd "$dsttmp" "$dst" 4954d9b34d9Smrg } 4964d9b34d9Smrg } || exit 1 4974d9b34d9Smrg 4984d9b34d9Smrg trap '' 0 4994d9b34d9Smrg fi 5004d9b34d9Smrgdone 5014d9b34d9Smrg 5024d9b34d9Smrg# Local variables: 5034d9b34d9Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 5044d9b34d9Smrg# time-stamp-start: "scriptversion=" 5054d9b34d9Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 5064d9b34d9Smrg# time-stamp-end: "$" 5074d9b34d9Smrg# End: 508