install-sh revision 3e747e6d
13e747e6dSmrg#!/bin/sh 23e747e6dSmrg# install - install a program, script, or datafile 33e747e6dSmrg 43e747e6dSmrgscriptversion=2006-12-25.00 53e747e6dSmrg 63e747e6dSmrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 73e747e6dSmrg# later released in X11R6 (xc/config/util/install.sh) with the 83e747e6dSmrg# following copyright and license. 93e747e6dSmrg# 103e747e6dSmrg# Copyright (C) 1994 X Consortium 113e747e6dSmrg# 123e747e6dSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 133e747e6dSmrg# of this software and associated documentation files (the "Software"), to 143e747e6dSmrg# deal in the Software without restriction, including without limitation the 153e747e6dSmrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 163e747e6dSmrg# sell copies of the Software, and to permit persons to whom the Software is 173e747e6dSmrg# furnished to do so, subject to the following conditions: 183e747e6dSmrg# 193e747e6dSmrg# The above copyright notice and this permission notice shall be included in 203e747e6dSmrg# all copies or substantial portions of the Software. 213e747e6dSmrg# 223e747e6dSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 233e747e6dSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 243e747e6dSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 253e747e6dSmrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 263e747e6dSmrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 273e747e6dSmrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 283e747e6dSmrg# 293e747e6dSmrg# Except as contained in this notice, the name of the X Consortium shall not 303e747e6dSmrg# be used in advertising or otherwise to promote the sale, use or other deal- 313e747e6dSmrg# ings in this Software without prior written authorization from the X Consor- 323e747e6dSmrg# tium. 333e747e6dSmrg# 343e747e6dSmrg# 353e747e6dSmrg# FSF changes to this file are in the public domain. 363e747e6dSmrg# 373e747e6dSmrg# Calling this script install-sh is preferred over install.sh, to prevent 383e747e6dSmrg# `make' implicit rules from creating a file called install from it 393e747e6dSmrg# when there is no Makefile. 403e747e6dSmrg# 413e747e6dSmrg# This script is compatible with the BSD install script, but was written 423e747e6dSmrg# from scratch. 433e747e6dSmrg 443e747e6dSmrgnl=' 453e747e6dSmrg' 463e747e6dSmrgIFS=" "" $nl" 473e747e6dSmrg 483e747e6dSmrg# set DOITPROG to echo to test this script 493e747e6dSmrg 503e747e6dSmrg# Don't use :- since 4.3BSD and earlier shells don't like it. 513e747e6dSmrgdoit=${DOITPROG-} 523e747e6dSmrgif test -z "$doit"; then 533e747e6dSmrg doit_exec=exec 543e747e6dSmrgelse 553e747e6dSmrg doit_exec=$doit 563e747e6dSmrgfi 573e747e6dSmrg 583e747e6dSmrg# Put in absolute file names if you don't have them in your path; 593e747e6dSmrg# or use environment vars. 603e747e6dSmrg 613e747e6dSmrgchgrpprog=${CHGRPPROG-chgrp} 623e747e6dSmrgchmodprog=${CHMODPROG-chmod} 633e747e6dSmrgchownprog=${CHOWNPROG-chown} 643e747e6dSmrgcmpprog=${CMPPROG-cmp} 653e747e6dSmrgcpprog=${CPPROG-cp} 663e747e6dSmrgmkdirprog=${MKDIRPROG-mkdir} 673e747e6dSmrgmvprog=${MVPROG-mv} 683e747e6dSmrgrmprog=${RMPROG-rm} 693e747e6dSmrgstripprog=${STRIPPROG-strip} 703e747e6dSmrg 713e747e6dSmrgposix_glob='?' 723e747e6dSmrginitialize_posix_glob=' 733e747e6dSmrg test "$posix_glob" != "?" || { 743e747e6dSmrg if (set -f) 2>/dev/null; then 753e747e6dSmrg posix_glob= 763e747e6dSmrg else 773e747e6dSmrg posix_glob=: 783e747e6dSmrg fi 793e747e6dSmrg } 803e747e6dSmrg' 813e747e6dSmrg 823e747e6dSmrgposix_mkdir= 833e747e6dSmrg 843e747e6dSmrg# Desired mode of installed file. 853e747e6dSmrgmode=0755 863e747e6dSmrg 873e747e6dSmrgchgrpcmd= 883e747e6dSmrgchmodcmd=$chmodprog 893e747e6dSmrgchowncmd= 903e747e6dSmrgmvcmd=$mvprog 913e747e6dSmrgrmcmd="$rmprog -f" 923e747e6dSmrgstripcmd= 933e747e6dSmrg 943e747e6dSmrgsrc= 953e747e6dSmrgdst= 963e747e6dSmrgdir_arg= 973e747e6dSmrgdst_arg= 983e747e6dSmrg 993e747e6dSmrgcopy_on_change=false 1003e747e6dSmrgno_target_directory= 1013e747e6dSmrg 1023e747e6dSmrgusage="\ 1033e747e6dSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 1043e747e6dSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 1053e747e6dSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 1063e747e6dSmrg or: $0 [OPTION]... -d DIRECTORIES... 1073e747e6dSmrg 1083e747e6dSmrgIn the 1st form, copy SRCFILE to DSTFILE. 1093e747e6dSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 1103e747e6dSmrgIn the 4th, create DIRECTORIES. 1113e747e6dSmrg 1123e747e6dSmrgOptions: 1133e747e6dSmrg --help display this help and exit. 1143e747e6dSmrg --version display version info and exit. 1153e747e6dSmrg 1163e747e6dSmrg -c (ignored) 1173e747e6dSmrg -C install only if different (preserve the last data modification time) 1183e747e6dSmrg -d create directories instead of installing files. 1193e747e6dSmrg -g GROUP $chgrpprog installed files to GROUP. 1203e747e6dSmrg -m MODE $chmodprog installed files to MODE. 1213e747e6dSmrg -o USER $chownprog installed files to USER. 1223e747e6dSmrg -s $stripprog installed files. 1233e747e6dSmrg -t DIRECTORY install into DIRECTORY. 1243e747e6dSmrg -T report an error if DSTFILE is a directory. 1253e747e6dSmrg 1263e747e6dSmrgEnvironment variables override the default commands: 1273e747e6dSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 1283e747e6dSmrg RMPROG STRIPPROG 1293e747e6dSmrg" 1303e747e6dSmrg 1313e747e6dSmrgwhile test $# -ne 0; do 1323e747e6dSmrg case $1 in 1333e747e6dSmrg -c) ;; 1343e747e6dSmrg 1353e747e6dSmrg -C) copy_on_change=true;; 1363e747e6dSmrg 1373e747e6dSmrg -d) dir_arg=true;; 1383e747e6dSmrg 1393e747e6dSmrg -g) chgrpcmd="$chgrpprog $2" 1403e747e6dSmrg shift;; 1413e747e6dSmrg 1423e747e6dSmrg --help) echo "$usage"; exit $?;; 1433e747e6dSmrg 1443e747e6dSmrg -m) mode=$2 1453e747e6dSmrg case $mode in 1463e747e6dSmrg *' '* | *' '* | *' 1473e747e6dSmrg'* | *'*'* | *'?'* | *'['*) 1483e747e6dSmrg echo "$0: invalid mode: $mode" >&2 1493e747e6dSmrg exit 1;; 1503e747e6dSmrg esac 1513e747e6dSmrg shift;; 1523e747e6dSmrg 1533e747e6dSmrg -o) chowncmd="$chownprog $2" 1543e747e6dSmrg shift;; 1553e747e6dSmrg 1563e747e6dSmrg -s) stripcmd=$stripprog;; 1573e747e6dSmrg 1583e747e6dSmrg -t) dst_arg=$2 1593e747e6dSmrg shift;; 1603e747e6dSmrg 1613e747e6dSmrg -T) no_target_directory=true;; 1623e747e6dSmrg 1633e747e6dSmrg --version) echo "$0 $scriptversion"; exit $?;; 1643e747e6dSmrg 1653e747e6dSmrg --) shift 1663e747e6dSmrg break;; 1673e747e6dSmrg 1683e747e6dSmrg -*) echo "$0: invalid option: $1" >&2 1693e747e6dSmrg exit 1;; 1703e747e6dSmrg 1713e747e6dSmrg *) break;; 1723e747e6dSmrg esac 1733e747e6dSmrg shift 1743e747e6dSmrgdone 1753e747e6dSmrg 1763e747e6dSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 1773e747e6dSmrg # When -d is used, all remaining arguments are directories to create. 1783e747e6dSmrg # When -t is used, the destination is already specified. 1793e747e6dSmrg # Otherwise, the last argument is the destination. Remove it from $@. 1803e747e6dSmrg for arg 1813e747e6dSmrg do 1823e747e6dSmrg if test -n "$dst_arg"; then 1833e747e6dSmrg # $@ is not empty: it contains at least $arg. 1843e747e6dSmrg set fnord "$@" "$dst_arg" 1853e747e6dSmrg shift # fnord 1863e747e6dSmrg fi 1873e747e6dSmrg shift # arg 1883e747e6dSmrg dst_arg=$arg 1893e747e6dSmrg done 1903e747e6dSmrgfi 1913e747e6dSmrg 1923e747e6dSmrgif test $# -eq 0; then 1933e747e6dSmrg if test -z "$dir_arg"; then 1943e747e6dSmrg echo "$0: no input file specified." >&2 1953e747e6dSmrg exit 1 1963e747e6dSmrg fi 1973e747e6dSmrg # It's OK to call `install-sh -d' without argument. 1983e747e6dSmrg # This can happen when creating conditional directories. 1993e747e6dSmrg exit 0 2003e747e6dSmrgfi 2013e747e6dSmrg 2023e747e6dSmrgif test -z "$dir_arg"; then 2033e747e6dSmrg trap '(exit $?); exit' 1 2 13 15 2043e747e6dSmrg 2053e747e6dSmrg # Set umask so as not to create temps with too-generous modes. 2063e747e6dSmrg # However, 'strip' requires both read and write access to temps. 2073e747e6dSmrg case $mode in 2083e747e6dSmrg # Optimize common cases. 2093e747e6dSmrg *644) cp_umask=133;; 2103e747e6dSmrg *755) cp_umask=22;; 2113e747e6dSmrg 2123e747e6dSmrg *[0-7]) 2133e747e6dSmrg if test -z "$stripcmd"; then 2143e747e6dSmrg u_plus_rw= 2153e747e6dSmrg else 2163e747e6dSmrg u_plus_rw='% 200' 2173e747e6dSmrg fi 2183e747e6dSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2193e747e6dSmrg *) 2203e747e6dSmrg if test -z "$stripcmd"; then 2213e747e6dSmrg u_plus_rw= 2223e747e6dSmrg else 2233e747e6dSmrg u_plus_rw=,u+rw 2243e747e6dSmrg fi 2253e747e6dSmrg cp_umask=$mode$u_plus_rw;; 2263e747e6dSmrg esac 2273e747e6dSmrgfi 2283e747e6dSmrg 2293e747e6dSmrgfor src 2303e747e6dSmrgdo 2313e747e6dSmrg # Protect names starting with `-'. 2323e747e6dSmrg case $src in 2333e747e6dSmrg -*) src=./$src;; 2343e747e6dSmrg esac 2353e747e6dSmrg 2363e747e6dSmrg if test -n "$dir_arg"; then 2373e747e6dSmrg dst=$src 2383e747e6dSmrg dstdir=$dst 2393e747e6dSmrg test -d "$dstdir" 2403e747e6dSmrg dstdir_status=$? 2413e747e6dSmrg else 2423e747e6dSmrg 2433e747e6dSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 2443e747e6dSmrg # might cause directories to be created, which would be especially bad 2453e747e6dSmrg # if $src (and thus $dsttmp) contains '*'. 2463e747e6dSmrg if test ! -f "$src" && test ! -d "$src"; then 2473e747e6dSmrg echo "$0: $src does not exist." >&2 2483e747e6dSmrg exit 1 2493e747e6dSmrg fi 2503e747e6dSmrg 2513e747e6dSmrg if test -z "$dst_arg"; then 2523e747e6dSmrg echo "$0: no destination specified." >&2 2533e747e6dSmrg exit 1 2543e747e6dSmrg fi 2553e747e6dSmrg 2563e747e6dSmrg dst=$dst_arg 2573e747e6dSmrg # Protect names starting with `-'. 2583e747e6dSmrg case $dst in 2593e747e6dSmrg -*) dst=./$dst;; 2603e747e6dSmrg esac 2613e747e6dSmrg 2623e747e6dSmrg # If destination is a directory, append the input filename; won't work 2633e747e6dSmrg # if double slashes aren't ignored. 2643e747e6dSmrg if test -d "$dst"; then 2653e747e6dSmrg if test -n "$no_target_directory"; then 2663e747e6dSmrg echo "$0: $dst_arg: Is a directory" >&2 2673e747e6dSmrg exit 1 2683e747e6dSmrg fi 2693e747e6dSmrg dstdir=$dst 2703e747e6dSmrg dst=$dstdir/`basename "$src"` 2713e747e6dSmrg dstdir_status=0 2723e747e6dSmrg else 2733e747e6dSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 2743e747e6dSmrg dstdir=` 2753e747e6dSmrg (dirname "$dst") 2>/dev/null || 2763e747e6dSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 2773e747e6dSmrg X"$dst" : 'X\(//\)[^/]' \| \ 2783e747e6dSmrg X"$dst" : 'X\(//\)$' \| \ 2793e747e6dSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 2803e747e6dSmrg echo X"$dst" | 2813e747e6dSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 2823e747e6dSmrg s//\1/ 2833e747e6dSmrg q 2843e747e6dSmrg } 2853e747e6dSmrg /^X\(\/\/\)[^/].*/{ 2863e747e6dSmrg s//\1/ 2873e747e6dSmrg q 2883e747e6dSmrg } 2893e747e6dSmrg /^X\(\/\/\)$/{ 2903e747e6dSmrg s//\1/ 2913e747e6dSmrg q 2923e747e6dSmrg } 2933e747e6dSmrg /^X\(\/\).*/{ 2943e747e6dSmrg s//\1/ 2953e747e6dSmrg q 2963e747e6dSmrg } 2973e747e6dSmrg s/.*/./; q' 2983e747e6dSmrg ` 2993e747e6dSmrg 3003e747e6dSmrg test -d "$dstdir" 3013e747e6dSmrg dstdir_status=$? 3023e747e6dSmrg fi 3033e747e6dSmrg fi 3043e747e6dSmrg 3053e747e6dSmrg obsolete_mkdir_used=false 3063e747e6dSmrg 3073e747e6dSmrg if test $dstdir_status != 0; then 3083e747e6dSmrg case $posix_mkdir in 3093e747e6dSmrg '') 3103e747e6dSmrg # Create intermediate dirs using mode 755 as modified by the umask. 3113e747e6dSmrg # This is like FreeBSD 'install' as of 1997-10-28. 3123e747e6dSmrg umask=`umask` 3133e747e6dSmrg case $stripcmd.$umask in 3143e747e6dSmrg # Optimize common cases. 3153e747e6dSmrg *[2367][2367]) mkdir_umask=$umask;; 3163e747e6dSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 3173e747e6dSmrg 3183e747e6dSmrg *[0-7]) 3193e747e6dSmrg mkdir_umask=`expr $umask + 22 \ 3203e747e6dSmrg - $umask % 100 % 40 + $umask % 20 \ 3213e747e6dSmrg - $umask % 10 % 4 + $umask % 2 3223e747e6dSmrg `;; 3233e747e6dSmrg *) mkdir_umask=$umask,go-w;; 3243e747e6dSmrg esac 3253e747e6dSmrg 3263e747e6dSmrg # With -d, create the new directory with the user-specified mode. 3273e747e6dSmrg # Otherwise, rely on $mkdir_umask. 3283e747e6dSmrg if test -n "$dir_arg"; then 3293e747e6dSmrg mkdir_mode=-m$mode 3303e747e6dSmrg else 3313e747e6dSmrg mkdir_mode= 3323e747e6dSmrg fi 3333e747e6dSmrg 3343e747e6dSmrg posix_mkdir=false 3353e747e6dSmrg case $umask in 3363e747e6dSmrg *[123567][0-7][0-7]) 3373e747e6dSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 3383e747e6dSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 3393e747e6dSmrg ;; 3403e747e6dSmrg *) 3413e747e6dSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3423e747e6dSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 3433e747e6dSmrg 3443e747e6dSmrg if (umask $mkdir_umask && 3453e747e6dSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 3463e747e6dSmrg then 3473e747e6dSmrg if test -z "$dir_arg" || { 3483e747e6dSmrg # Check for POSIX incompatibilities with -m. 3493e747e6dSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 3503e747e6dSmrg # other-writeable bit of parent directory when it shouldn't. 3513e747e6dSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3523e747e6dSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 3533e747e6dSmrg case $ls_ld_tmpdir in 3543e747e6dSmrg d????-?r-*) different_mode=700;; 3553e747e6dSmrg d????-?--*) different_mode=755;; 3563e747e6dSmrg *) false;; 3573e747e6dSmrg esac && 3583e747e6dSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 3593e747e6dSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 3603e747e6dSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3613e747e6dSmrg } 3623e747e6dSmrg } 3633e747e6dSmrg then posix_mkdir=: 3643e747e6dSmrg fi 3653e747e6dSmrg rmdir "$tmpdir/d" "$tmpdir" 3663e747e6dSmrg else 3673e747e6dSmrg # Remove any dirs left behind by ancient mkdir implementations. 3683e747e6dSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 3693e747e6dSmrg fi 3703e747e6dSmrg trap '' 0;; 3713e747e6dSmrg esac;; 3723e747e6dSmrg esac 3733e747e6dSmrg 3743e747e6dSmrg if 3753e747e6dSmrg $posix_mkdir && ( 3763e747e6dSmrg umask $mkdir_umask && 3773e747e6dSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3783e747e6dSmrg ) 3793e747e6dSmrg then : 3803e747e6dSmrg else 3813e747e6dSmrg 3823e747e6dSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 3833e747e6dSmrg # or it failed possibly due to a race condition. Create the 3843e747e6dSmrg # directory the slow way, step by step, checking for races as we go. 3853e747e6dSmrg 3863e747e6dSmrg case $dstdir in 3873e747e6dSmrg /*) prefix='/';; 3883e747e6dSmrg -*) prefix='./';; 3893e747e6dSmrg *) prefix='';; 3903e747e6dSmrg esac 3913e747e6dSmrg 3923e747e6dSmrg eval "$initialize_posix_glob" 3933e747e6dSmrg 3943e747e6dSmrg oIFS=$IFS 3953e747e6dSmrg IFS=/ 3963e747e6dSmrg $posix_glob set -f 3973e747e6dSmrg set fnord $dstdir 3983e747e6dSmrg shift 3993e747e6dSmrg $posix_glob set +f 4003e747e6dSmrg IFS=$oIFS 4013e747e6dSmrg 4023e747e6dSmrg prefixes= 4033e747e6dSmrg 4043e747e6dSmrg for d 4053e747e6dSmrg do 4063e747e6dSmrg test -z "$d" && continue 4073e747e6dSmrg 4083e747e6dSmrg prefix=$prefix$d 4093e747e6dSmrg if test -d "$prefix"; then 4103e747e6dSmrg prefixes= 4113e747e6dSmrg else 4123e747e6dSmrg if $posix_mkdir; then 4133e747e6dSmrg (umask=$mkdir_umask && 4143e747e6dSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 4153e747e6dSmrg # Don't fail if two instances are running concurrently. 4163e747e6dSmrg test -d "$prefix" || exit 1 4173e747e6dSmrg else 4183e747e6dSmrg case $prefix in 4193e747e6dSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 4203e747e6dSmrg *) qprefix=$prefix;; 4213e747e6dSmrg esac 4223e747e6dSmrg prefixes="$prefixes '$qprefix'" 4233e747e6dSmrg fi 4243e747e6dSmrg fi 4253e747e6dSmrg prefix=$prefix/ 4263e747e6dSmrg done 4273e747e6dSmrg 4283e747e6dSmrg if test -n "$prefixes"; then 4293e747e6dSmrg # Don't fail if two instances are running concurrently. 4303e747e6dSmrg (umask $mkdir_umask && 4313e747e6dSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 4323e747e6dSmrg test -d "$dstdir" || exit 1 4333e747e6dSmrg obsolete_mkdir_used=true 4343e747e6dSmrg fi 4353e747e6dSmrg fi 4363e747e6dSmrg fi 4373e747e6dSmrg 4383e747e6dSmrg if test -n "$dir_arg"; then 4393e747e6dSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4403e747e6dSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4413e747e6dSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4423e747e6dSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 4433e747e6dSmrg else 4443e747e6dSmrg 4453e747e6dSmrg # Make a couple of temp file names in the proper directory. 4463e747e6dSmrg dsttmp=$dstdir/_inst.$$_ 4473e747e6dSmrg rmtmp=$dstdir/_rm.$$_ 4483e747e6dSmrg 4493e747e6dSmrg # Trap to clean up those temp files at exit. 4503e747e6dSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 4513e747e6dSmrg 4523e747e6dSmrg # Copy the file name to the temp name. 4533e747e6dSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 4543e747e6dSmrg 4553e747e6dSmrg # and set any options; do chmod last to preserve setuid bits. 4563e747e6dSmrg # 4573e747e6dSmrg # If any of these fail, we abort the whole thing. If we want to 4583e747e6dSmrg # ignore errors from any of these, just make sure not to ignore 4593e747e6dSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 4603e747e6dSmrg # 4613e747e6dSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 4623e747e6dSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 4633e747e6dSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 4643e747e6dSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 4653e747e6dSmrg 4663e747e6dSmrg # If -C, don't bother to copy if it wouldn't change the file. 4673e747e6dSmrg if $copy_on_change && 4683e747e6dSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 4693e747e6dSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 4703e747e6dSmrg 4713e747e6dSmrg eval "$initialize_posix_glob" && 4723e747e6dSmrg $posix_glob set -f && 4733e747e6dSmrg set X $old && old=:$2:$4:$5:$6 && 4743e747e6dSmrg set X $new && new=:$2:$4:$5:$6 && 4753e747e6dSmrg $posix_glob set +f && 4763e747e6dSmrg 4773e747e6dSmrg test "$old" = "$new" && 4783e747e6dSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 4793e747e6dSmrg then 4803e747e6dSmrg rm -f "$dsttmp" 4813e747e6dSmrg else 4823e747e6dSmrg # Rename the file to the real destination. 4833e747e6dSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 4843e747e6dSmrg 4853e747e6dSmrg # The rename failed, perhaps because mv can't rename something else 4863e747e6dSmrg # to itself, or perhaps because mv is so ancient that it does not 4873e747e6dSmrg # support -f. 4883e747e6dSmrg { 4893e747e6dSmrg # Now remove or move aside any old file at destination location. 4903e747e6dSmrg # We try this two ways since rm can't unlink itself on some 4913e747e6dSmrg # systems and the destination file might be busy for other 4923e747e6dSmrg # reasons. In this case, the final cleanup might fail but the new 4933e747e6dSmrg # file should still install successfully. 4943e747e6dSmrg { 4953e747e6dSmrg test ! -f "$dst" || 4963e747e6dSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 4973e747e6dSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 4983e747e6dSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 4993e747e6dSmrg } || 5003e747e6dSmrg { echo "$0: cannot unlink or rename $dst" >&2 5013e747e6dSmrg (exit 1); exit 1 5023e747e6dSmrg } 5033e747e6dSmrg } && 5043e747e6dSmrg 5053e747e6dSmrg # Now rename the file to the real destination. 5063e747e6dSmrg $doit $mvcmd "$dsttmp" "$dst" 5073e747e6dSmrg } 5083e747e6dSmrg fi || exit 1 5093e747e6dSmrg 5103e747e6dSmrg trap '' 0 5113e747e6dSmrg fi 5123e747e6dSmrgdone 5133e747e6dSmrg 5143e747e6dSmrg# Local variables: 5153e747e6dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 5163e747e6dSmrg# time-stamp-start: "scriptversion=" 5173e747e6dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 5183e747e6dSmrg# time-stamp-end: "$" 5193e747e6dSmrg# End: 520