install-sh revision f126e068
18b22bf3fSmrg#!/bin/sh 28b22bf3fSmrg# install - install a program, script, or datafile 38b22bf3fSmrg 4f126e068Smrgscriptversion=2011-11-20.07; # UTC 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 38f126e068Smrg# '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. 5196a81b41Smrgdoit=${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 6196a81b41Smrgchgrpprog=${CHGRPPROG-chgrp} 6296a81b41Smrgchmodprog=${CHMODPROG-chmod} 6396a81b41Smrgchownprog=${CHOWNPROG-chown} 6496a81b41Smrgcmpprog=${CMPPROG-cmp} 6596a81b41Smrgcpprog=${CPPROG-cp} 6696a81b41Smrgmkdirprog=${MKDIRPROG-mkdir} 6796a81b41Smrgmvprog=${MVPROG-mv} 6896a81b41Smrgrmprog=${RMPROG-rm} 6996a81b41Smrgstripprog=${STRIPPROG-strip} 7096a81b41Smrg 7196a81b41Smrgposix_glob='?' 7296a81b41Smrginitialize_posix_glob=' 7396a81b41Smrg test "$posix_glob" != "?" || { 7496a81b41Smrg if (set -f) 2>/dev/null; then 7596a81b41Smrg posix_glob= 7696a81b41Smrg else 7796a81b41Smrg posix_glob=: 7896a81b41Smrg fi 7996a81b41Smrg } 8096a81b41Smrg' 818b22bf3fSmrg 828b22bf3fSmrgposix_mkdir= 838b22bf3fSmrg 848b22bf3fSmrg# Desired mode of installed file. 858b22bf3fSmrgmode=0755 868b22bf3fSmrg 8796a81b41Smrgchgrpcmd= 888b22bf3fSmrgchmodcmd=$chmodprog 898b22bf3fSmrgchowncmd= 9096a81b41Smrgmvcmd=$mvprog 918b22bf3fSmrgrmcmd="$rmprog -f" 9296a81b41Smrgstripcmd= 9396a81b41Smrg 948b22bf3fSmrgsrc= 958b22bf3fSmrgdst= 968b22bf3fSmrgdir_arg= 9796a81b41Smrgdst_arg= 9896a81b41Smrg 9996a81b41Smrgcopy_on_change=false 1008b22bf3fSmrgno_target_directory= 1018b22bf3fSmrg 10296a81b41Smrgusage="\ 10396a81b41SmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 1048b22bf3fSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 1058b22bf3fSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 1068b22bf3fSmrg or: $0 [OPTION]... -d DIRECTORIES... 1078b22bf3fSmrg 1088b22bf3fSmrgIn the 1st form, copy SRCFILE to DSTFILE. 1098b22bf3fSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 1108b22bf3fSmrgIn the 4th, create DIRECTORIES. 1118b22bf3fSmrg 1128b22bf3fSmrgOptions: 11396a81b41Smrg --help display this help and exit. 11496a81b41Smrg --version display version info and exit. 11596a81b41Smrg 11696a81b41Smrg -c (ignored) 11796a81b41Smrg -C install only if different (preserve the last data modification time) 11896a81b41Smrg -d create directories instead of installing files. 11996a81b41Smrg -g GROUP $chgrpprog installed files to GROUP. 12096a81b41Smrg -m MODE $chmodprog installed files to MODE. 12196a81b41Smrg -o USER $chownprog installed files to USER. 12296a81b41Smrg -s $stripprog installed files. 12396a81b41Smrg -t DIRECTORY install into DIRECTORY. 12496a81b41Smrg -T report an error if DSTFILE is a directory. 1258b22bf3fSmrg 1268b22bf3fSmrgEnvironment variables override the default commands: 12796a81b41Smrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12896a81b41Smrg RMPROG STRIPPROG 1298b22bf3fSmrg" 1308b22bf3fSmrg 1318b22bf3fSmrgwhile test $# -ne 0; do 1328b22bf3fSmrg case $1 in 13396a81b41Smrg -c) ;; 13496a81b41Smrg 13596a81b41Smrg -C) copy_on_change=true;; 1368b22bf3fSmrg 13796a81b41Smrg -d) dir_arg=true;; 1388b22bf3fSmrg 1398b22bf3fSmrg -g) chgrpcmd="$chgrpprog $2" 14096a81b41Smrg shift;; 1418b22bf3fSmrg 1428b22bf3fSmrg --help) echo "$usage"; exit $?;; 1438b22bf3fSmrg 1448b22bf3fSmrg -m) mode=$2 1458b22bf3fSmrg case $mode in 1468b22bf3fSmrg *' '* | *' '* | *' 1478b22bf3fSmrg'* | *'*'* | *'?'* | *'['*) 1488b22bf3fSmrg echo "$0: invalid mode: $mode" >&2 1498b22bf3fSmrg exit 1;; 1508b22bf3fSmrg esac 15196a81b41Smrg shift;; 1528b22bf3fSmrg 1538b22bf3fSmrg -o) chowncmd="$chownprog $2" 15496a81b41Smrg shift;; 1558b22bf3fSmrg 15696a81b41Smrg -s) stripcmd=$stripprog;; 1578b22bf3fSmrg 15896a81b41Smrg -t) dst_arg=$2 159f126e068Smrg # Protect names problematic for 'test' and other utilities. 160f126e068Smrg case $dst_arg in 161f126e068Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 162f126e068Smrg esac 16396a81b41Smrg shift;; 1648b22bf3fSmrg 16596a81b41Smrg -T) no_target_directory=true;; 1668b22bf3fSmrg 1678b22bf3fSmrg --version) echo "$0 $scriptversion"; exit $?;; 1688b22bf3fSmrg 1698b22bf3fSmrg --) shift 1708b22bf3fSmrg break;; 1718b22bf3fSmrg 1728b22bf3fSmrg -*) echo "$0: invalid option: $1" >&2 1738b22bf3fSmrg exit 1;; 1748b22bf3fSmrg 1758b22bf3fSmrg *) break;; 1768b22bf3fSmrg esac 17796a81b41Smrg shift 1788b22bf3fSmrgdone 1798b22bf3fSmrg 18096a81b41Smrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 1818b22bf3fSmrg # When -d is used, all remaining arguments are directories to create. 1828b22bf3fSmrg # When -t is used, the destination is already specified. 1838b22bf3fSmrg # Otherwise, the last argument is the destination. Remove it from $@. 1848b22bf3fSmrg for arg 1858b22bf3fSmrg do 18696a81b41Smrg if test -n "$dst_arg"; then 1878b22bf3fSmrg # $@ is not empty: it contains at least $arg. 18896a81b41Smrg set fnord "$@" "$dst_arg" 1898b22bf3fSmrg shift # fnord 1908b22bf3fSmrg fi 1918b22bf3fSmrg shift # arg 19296a81b41Smrg dst_arg=$arg 193f126e068Smrg # Protect names problematic for 'test' and other utilities. 194f126e068Smrg case $dst_arg in 195f126e068Smrg -* | [=\(\)!]) dst_arg=./$dst_arg;; 196f126e068Smrg esac 1978b22bf3fSmrg done 1988b22bf3fSmrgfi 1998b22bf3fSmrg 2008b22bf3fSmrgif test $# -eq 0; then 2018b22bf3fSmrg if test -z "$dir_arg"; then 2028b22bf3fSmrg echo "$0: no input file specified." >&2 2038b22bf3fSmrg exit 1 2048b22bf3fSmrg fi 205f126e068Smrg # It's OK to call 'install-sh -d' without argument. 2068b22bf3fSmrg # This can happen when creating conditional directories. 2078b22bf3fSmrg exit 0 2088b22bf3fSmrgfi 2098b22bf3fSmrg 2108b22bf3fSmrgif test -z "$dir_arg"; then 211f126e068Smrg do_exit='(exit $ret); exit $ret' 212f126e068Smrg trap "ret=129; $do_exit" 1 213f126e068Smrg trap "ret=130; $do_exit" 2 214f126e068Smrg trap "ret=141; $do_exit" 13 215f126e068Smrg trap "ret=143; $do_exit" 15 2168b22bf3fSmrg 2178b22bf3fSmrg # Set umask so as not to create temps with too-generous modes. 2188b22bf3fSmrg # However, 'strip' requires both read and write access to temps. 2198b22bf3fSmrg case $mode in 2208b22bf3fSmrg # Optimize common cases. 2218b22bf3fSmrg *644) cp_umask=133;; 2228b22bf3fSmrg *755) cp_umask=22;; 2238b22bf3fSmrg 2248b22bf3fSmrg *[0-7]) 2258b22bf3fSmrg if test -z "$stripcmd"; then 2268b22bf3fSmrg u_plus_rw= 2278b22bf3fSmrg else 2288b22bf3fSmrg u_plus_rw='% 200' 2298b22bf3fSmrg fi 2308b22bf3fSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2318b22bf3fSmrg *) 2328b22bf3fSmrg if test -z "$stripcmd"; then 2338b22bf3fSmrg u_plus_rw= 2348b22bf3fSmrg else 2358b22bf3fSmrg u_plus_rw=,u+rw 2368b22bf3fSmrg fi 2378b22bf3fSmrg cp_umask=$mode$u_plus_rw;; 2388b22bf3fSmrg esac 2398b22bf3fSmrgfi 2408b22bf3fSmrg 2418b22bf3fSmrgfor src 2428b22bf3fSmrgdo 243f126e068Smrg # Protect names problematic for 'test' and other utilities. 2448b22bf3fSmrg case $src in 245f126e068Smrg -* | [=\(\)!]) src=./$src;; 2468b22bf3fSmrg esac 2478b22bf3fSmrg 2488b22bf3fSmrg if test -n "$dir_arg"; then 2498b22bf3fSmrg dst=$src 2508b22bf3fSmrg dstdir=$dst 2518b22bf3fSmrg test -d "$dstdir" 2528b22bf3fSmrg dstdir_status=$? 2538b22bf3fSmrg else 2548b22bf3fSmrg 2558b22bf3fSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 2568b22bf3fSmrg # might cause directories to be created, which would be especially bad 2578b22bf3fSmrg # if $src (and thus $dsttmp) contains '*'. 2588b22bf3fSmrg if test ! -f "$src" && test ! -d "$src"; then 2598b22bf3fSmrg echo "$0: $src does not exist." >&2 2608b22bf3fSmrg exit 1 2618b22bf3fSmrg fi 2628b22bf3fSmrg 26396a81b41Smrg if test -z "$dst_arg"; then 2648b22bf3fSmrg echo "$0: no destination specified." >&2 2658b22bf3fSmrg exit 1 2668b22bf3fSmrg fi 26796a81b41Smrg dst=$dst_arg 2688b22bf3fSmrg 2698b22bf3fSmrg # If destination is a directory, append the input filename; won't work 2708b22bf3fSmrg # if double slashes aren't ignored. 2718b22bf3fSmrg if test -d "$dst"; then 2728b22bf3fSmrg if test -n "$no_target_directory"; then 27396a81b41Smrg echo "$0: $dst_arg: Is a directory" >&2 2748b22bf3fSmrg exit 1 2758b22bf3fSmrg fi 2768b22bf3fSmrg dstdir=$dst 2778b22bf3fSmrg dst=$dstdir/`basename "$src"` 2788b22bf3fSmrg dstdir_status=0 2798b22bf3fSmrg else 2808b22bf3fSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 2818b22bf3fSmrg dstdir=` 2828b22bf3fSmrg (dirname "$dst") 2>/dev/null || 2838b22bf3fSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 2848b22bf3fSmrg X"$dst" : 'X\(//\)[^/]' \| \ 2858b22bf3fSmrg X"$dst" : 'X\(//\)$' \| \ 2868b22bf3fSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 2878b22bf3fSmrg echo X"$dst" | 2888b22bf3fSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 2898b22bf3fSmrg s//\1/ 2908b22bf3fSmrg q 2918b22bf3fSmrg } 2928b22bf3fSmrg /^X\(\/\/\)[^/].*/{ 2938b22bf3fSmrg s//\1/ 2948b22bf3fSmrg q 2958b22bf3fSmrg } 2968b22bf3fSmrg /^X\(\/\/\)$/{ 2978b22bf3fSmrg s//\1/ 2988b22bf3fSmrg q 2998b22bf3fSmrg } 3008b22bf3fSmrg /^X\(\/\).*/{ 3018b22bf3fSmrg s//\1/ 3028b22bf3fSmrg q 3038b22bf3fSmrg } 3048b22bf3fSmrg s/.*/./; q' 3058b22bf3fSmrg ` 3068b22bf3fSmrg 3078b22bf3fSmrg test -d "$dstdir" 3088b22bf3fSmrg dstdir_status=$? 3098b22bf3fSmrg fi 3108b22bf3fSmrg fi 3118b22bf3fSmrg 3128b22bf3fSmrg obsolete_mkdir_used=false 3138b22bf3fSmrg 3148b22bf3fSmrg if test $dstdir_status != 0; then 3158b22bf3fSmrg case $posix_mkdir in 3168b22bf3fSmrg '') 3178b22bf3fSmrg # Create intermediate dirs using mode 755 as modified by the umask. 3188b22bf3fSmrg # This is like FreeBSD 'install' as of 1997-10-28. 3198b22bf3fSmrg umask=`umask` 3208b22bf3fSmrg case $stripcmd.$umask in 3218b22bf3fSmrg # Optimize common cases. 3228b22bf3fSmrg *[2367][2367]) mkdir_umask=$umask;; 3238b22bf3fSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 3248b22bf3fSmrg 3258b22bf3fSmrg *[0-7]) 3268b22bf3fSmrg mkdir_umask=`expr $umask + 22 \ 3278b22bf3fSmrg - $umask % 100 % 40 + $umask % 20 \ 3288b22bf3fSmrg - $umask % 10 % 4 + $umask % 2 3298b22bf3fSmrg `;; 3308b22bf3fSmrg *) mkdir_umask=$umask,go-w;; 3318b22bf3fSmrg esac 3328b22bf3fSmrg 3338b22bf3fSmrg # With -d, create the new directory with the user-specified mode. 3348b22bf3fSmrg # Otherwise, rely on $mkdir_umask. 3358b22bf3fSmrg if test -n "$dir_arg"; then 3368b22bf3fSmrg mkdir_mode=-m$mode 3378b22bf3fSmrg else 3388b22bf3fSmrg mkdir_mode= 3398b22bf3fSmrg fi 3408b22bf3fSmrg 3418b22bf3fSmrg posix_mkdir=false 3428b22bf3fSmrg case $umask in 3438b22bf3fSmrg *[123567][0-7][0-7]) 3448b22bf3fSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 3458b22bf3fSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 3468b22bf3fSmrg ;; 3478b22bf3fSmrg *) 3488b22bf3fSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3498b22bf3fSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 3508b22bf3fSmrg 3518b22bf3fSmrg if (umask $mkdir_umask && 3528b22bf3fSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 3538b22bf3fSmrg then 3548b22bf3fSmrg if test -z "$dir_arg" || { 3558b22bf3fSmrg # Check for POSIX incompatibilities with -m. 3568b22bf3fSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 357f126e068Smrg # other-writable bit of parent directory when it shouldn't. 3588b22bf3fSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3598b22bf3fSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 3608b22bf3fSmrg case $ls_ld_tmpdir in 3618b22bf3fSmrg d????-?r-*) different_mode=700;; 3628b22bf3fSmrg d????-?--*) different_mode=755;; 3638b22bf3fSmrg *) false;; 3648b22bf3fSmrg esac && 3658b22bf3fSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 3668b22bf3fSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 3678b22bf3fSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3688b22bf3fSmrg } 3698b22bf3fSmrg } 3708b22bf3fSmrg then posix_mkdir=: 3718b22bf3fSmrg fi 3728b22bf3fSmrg rmdir "$tmpdir/d" "$tmpdir" 3738b22bf3fSmrg else 3748b22bf3fSmrg # Remove any dirs left behind by ancient mkdir implementations. 3758b22bf3fSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 3768b22bf3fSmrg fi 3778b22bf3fSmrg trap '' 0;; 3788b22bf3fSmrg esac;; 3798b22bf3fSmrg esac 3808b22bf3fSmrg 3818b22bf3fSmrg if 3828b22bf3fSmrg $posix_mkdir && ( 3838b22bf3fSmrg umask $mkdir_umask && 3848b22bf3fSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3858b22bf3fSmrg ) 3868b22bf3fSmrg then : 3878b22bf3fSmrg else 3888b22bf3fSmrg 3898b22bf3fSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 3908b22bf3fSmrg # or it failed possibly due to a race condition. Create the 3918b22bf3fSmrg # directory the slow way, step by step, checking for races as we go. 3928b22bf3fSmrg 3938b22bf3fSmrg case $dstdir in 39496a81b41Smrg /*) prefix='/';; 395f126e068Smrg [-=\(\)!]*) prefix='./';; 39696a81b41Smrg *) prefix='';; 3978b22bf3fSmrg esac 3988b22bf3fSmrg 39996a81b41Smrg eval "$initialize_posix_glob" 4008b22bf3fSmrg 4018b22bf3fSmrg oIFS=$IFS 4028b22bf3fSmrg IFS=/ 40396a81b41Smrg $posix_glob set -f 4048b22bf3fSmrg set fnord $dstdir 4058b22bf3fSmrg shift 40696a81b41Smrg $posix_glob set +f 4078b22bf3fSmrg IFS=$oIFS 4088b22bf3fSmrg 4098b22bf3fSmrg prefixes= 4108b22bf3fSmrg 4118b22bf3fSmrg for d 4128b22bf3fSmrg do 413f126e068Smrg test X"$d" = X && continue 4148b22bf3fSmrg 4158b22bf3fSmrg prefix=$prefix$d 4168b22bf3fSmrg if test -d "$prefix"; then 4178b22bf3fSmrg prefixes= 4188b22bf3fSmrg else 4198b22bf3fSmrg if $posix_mkdir; then 4208b22bf3fSmrg (umask=$mkdir_umask && 4218b22bf3fSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 4228b22bf3fSmrg # Don't fail if two instances are running concurrently. 4238b22bf3fSmrg test -d "$prefix" || exit 1 4248b22bf3fSmrg else 4258b22bf3fSmrg case $prefix in 4268b22bf3fSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 4278b22bf3fSmrg *) qprefix=$prefix;; 4288b22bf3fSmrg esac 4298b22bf3fSmrg prefixes="$prefixes '$qprefix'" 4308b22bf3fSmrg fi 4318b22bf3fSmrg fi 4328b22bf3fSmrg prefix=$prefix/ 4338b22bf3fSmrg done 4348b22bf3fSmrg 4358b22bf3fSmrg if test -n "$prefixes"; then 4368b22bf3fSmrg # Don't fail if two instances are running concurrently. 4378b22bf3fSmrg (umask $mkdir_umask && 4388b22bf3fSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 4398b22bf3fSmrg test -d "$dstdir" || exit 1 4408b22bf3fSmrg obsolete_mkdir_used=true 4418b22bf3fSmrg fi 4428b22bf3fSmrg fi 4438b22bf3fSmrg fi 4448b22bf3fSmrg 4458b22bf3fSmrg if test -n "$dir_arg"; then 4468b22bf3fSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4478b22bf3fSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4488b22bf3fSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4498b22bf3fSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 4508b22bf3fSmrg else 4518b22bf3fSmrg 4528b22bf3fSmrg # Make a couple of temp file names in the proper directory. 4538b22bf3fSmrg dsttmp=$dstdir/_inst.$$_ 4548b22bf3fSmrg rmtmp=$dstdir/_rm.$$_ 4558b22bf3fSmrg 4568b22bf3fSmrg # Trap to clean up those temp files at exit. 4578b22bf3fSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 4588b22bf3fSmrg 4598b22bf3fSmrg # Copy the file name to the temp name. 4608b22bf3fSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 4618b22bf3fSmrg 4628b22bf3fSmrg # and set any options; do chmod last to preserve setuid bits. 4638b22bf3fSmrg # 4648b22bf3fSmrg # If any of these fail, we abort the whole thing. If we want to 4658b22bf3fSmrg # ignore errors from any of these, just make sure not to ignore 4668b22bf3fSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 4678b22bf3fSmrg # 46896a81b41Smrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46996a81b41Smrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 47096a81b41Smrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 47196a81b41Smrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 47296a81b41Smrg 47396a81b41Smrg # If -C, don't bother to copy if it wouldn't change the file. 47496a81b41Smrg if $copy_on_change && 47596a81b41Smrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 47696a81b41Smrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47796a81b41Smrg 47896a81b41Smrg eval "$initialize_posix_glob" && 47996a81b41Smrg $posix_glob set -f && 48096a81b41Smrg set X $old && old=:$2:$4:$5:$6 && 48196a81b41Smrg set X $new && new=:$2:$4:$5:$6 && 48296a81b41Smrg $posix_glob set +f && 48396a81b41Smrg 48496a81b41Smrg test "$old" = "$new" && 48596a81b41Smrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 48696a81b41Smrg then 48796a81b41Smrg rm -f "$dsttmp" 48896a81b41Smrg else 48996a81b41Smrg # Rename the file to the real destination. 49096a81b41Smrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 49196a81b41Smrg 49296a81b41Smrg # The rename failed, perhaps because mv can't rename something else 49396a81b41Smrg # to itself, or perhaps because mv is so ancient that it does not 49496a81b41Smrg # support -f. 49596a81b41Smrg { 49696a81b41Smrg # Now remove or move aside any old file at destination location. 49796a81b41Smrg # We try this two ways since rm can't unlink itself on some 49896a81b41Smrg # systems and the destination file might be busy for other 49996a81b41Smrg # reasons. In this case, the final cleanup might fail but the new 50096a81b41Smrg # file should still install successfully. 50196a81b41Smrg { 50296a81b41Smrg test ! -f "$dst" || 50396a81b41Smrg $doit $rmcmd -f "$dst" 2>/dev/null || 50496a81b41Smrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 50596a81b41Smrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 50696a81b41Smrg } || 50796a81b41Smrg { echo "$0: cannot unlink or rename $dst" >&2 50896a81b41Smrg (exit 1); exit 1 50996a81b41Smrg } 51096a81b41Smrg } && 51196a81b41Smrg 51296a81b41Smrg # Now rename the file to the real destination. 51396a81b41Smrg $doit $mvcmd "$dsttmp" "$dst" 51496a81b41Smrg } 51596a81b41Smrg fi || exit 1 5168b22bf3fSmrg 5178b22bf3fSmrg trap '' 0 5188b22bf3fSmrg fi 5198b22bf3fSmrgdone 5208b22bf3fSmrg 5218b22bf3fSmrg# Local variables: 5228b22bf3fSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 5238b22bf3fSmrg# time-stamp-start: "scriptversion=" 5248b22bf3fSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 52596a81b41Smrg# time-stamp-time-zone: "UTC" 52696a81b41Smrg# time-stamp-end: "; # UTC" 5278b22bf3fSmrg# End: 528