123dfcd74Spooka#!/bin/sh 223dfcd74Spooka# install - install a program, script, or datafile 323dfcd74Spooka 423dfcd74Spookascriptversion=2011-11-20.07; # UTC 523dfcd74Spooka 623dfcd74Spooka# This originates from X11R5 (mit/util/scripts/install.sh), which was 723dfcd74Spooka# later released in X11R6 (xc/config/util/install.sh) with the 823dfcd74Spooka# following copyright and license. 923dfcd74Spooka# 1023dfcd74Spooka# Copyright (C) 1994 X Consortium 1123dfcd74Spooka# 1223dfcd74Spooka# Permission is hereby granted, free of charge, to any person obtaining a copy 1323dfcd74Spooka# of this software and associated documentation files (the "Software"), to 1423dfcd74Spooka# deal in the Software without restriction, including without limitation the 1523dfcd74Spooka# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1623dfcd74Spooka# sell copies of the Software, and to permit persons to whom the Software is 1723dfcd74Spooka# furnished to do so, subject to the following conditions: 1823dfcd74Spooka# 1923dfcd74Spooka# The above copyright notice and this permission notice shall be included in 2023dfcd74Spooka# all copies or substantial portions of the Software. 2123dfcd74Spooka# 2223dfcd74Spooka# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2323dfcd74Spooka# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2423dfcd74Spooka# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2523dfcd74Spooka# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2623dfcd74Spooka# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2723dfcd74Spooka# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2823dfcd74Spooka# 2923dfcd74Spooka# Except as contained in this notice, the name of the X Consortium shall not 3023dfcd74Spooka# be used in advertising or otherwise to promote the sale, use or other deal- 3123dfcd74Spooka# ings in this Software without prior written authorization from the X Consor- 3223dfcd74Spooka# tium. 3323dfcd74Spooka# 3423dfcd74Spooka# 3523dfcd74Spooka# FSF changes to this file are in the public domain. 3623dfcd74Spooka# 3723dfcd74Spooka# Calling this script install-sh is preferred over install.sh, to prevent 3823dfcd74Spooka# 'make' implicit rules from creating a file called install from it 3923dfcd74Spooka# when there is no Makefile. 4023dfcd74Spooka# 4123dfcd74Spooka# This script is compatible with the BSD install script, but was written 4223dfcd74Spooka# from scratch. 4323dfcd74Spooka 4423dfcd74Spookanl=' 4523dfcd74Spooka' 4623dfcd74SpookaIFS=" "" $nl" 4723dfcd74Spooka 4823dfcd74Spooka# set DOITPROG to echo to test this script 4923dfcd74Spooka 5023dfcd74Spooka# Don't use :- since 4.3BSD and earlier shells don't like it. 5123dfcd74Spookadoit=${DOITPROG-} 5223dfcd74Spookaif test -z "$doit"; then 5323dfcd74Spooka doit_exec=exec 5423dfcd74Spookaelse 5523dfcd74Spooka doit_exec=$doit 5623dfcd74Spookafi 5723dfcd74Spooka 5823dfcd74Spooka# Put in absolute file names if you don't have them in your path; 5923dfcd74Spooka# or use environment vars. 6023dfcd74Spooka 6123dfcd74Spookachgrpprog=${CHGRPPROG-chgrp} 6223dfcd74Spookachmodprog=${CHMODPROG-chmod} 6323dfcd74Spookachownprog=${CHOWNPROG-chown} 6423dfcd74Spookacmpprog=${CMPPROG-cmp} 6523dfcd74Spookacpprog=${CPPROG-cp} 6623dfcd74Spookamkdirprog=${MKDIRPROG-mkdir} 6723dfcd74Spookamvprog=${MVPROG-mv} 6823dfcd74Spookarmprog=${RMPROG-rm} 6923dfcd74Spookastripprog=${STRIPPROG-strip} 7023dfcd74Spooka 7123dfcd74Spookaposix_glob='?' 7223dfcd74Spookainitialize_posix_glob=' 7323dfcd74Spooka test "$posix_glob" != "?" || { 7423dfcd74Spooka if (set -f) 2>/dev/null; then 7523dfcd74Spooka posix_glob= 7623dfcd74Spooka else 7723dfcd74Spooka posix_glob=: 7823dfcd74Spooka fi 7923dfcd74Spooka } 8023dfcd74Spooka' 8123dfcd74Spooka 8223dfcd74Spookaposix_mkdir= 8323dfcd74Spooka 8423dfcd74Spooka# Desired mode of installed file. 8523dfcd74Spookamode=0755 8623dfcd74Spooka 8723dfcd74Spookachgrpcmd= 8823dfcd74Spookachmodcmd=$chmodprog 8923dfcd74Spookachowncmd= 9023dfcd74Spookamvcmd=$mvprog 9123dfcd74Spookarmcmd="$rmprog -f" 9223dfcd74Spookastripcmd= 9323dfcd74Spooka 9423dfcd74Spookasrc= 9523dfcd74Spookadst= 9623dfcd74Spookadir_arg= 9723dfcd74Spookadst_arg= 9823dfcd74Spooka 9923dfcd74Spookacopy_on_change=false 10023dfcd74Spookano_target_directory= 10123dfcd74Spooka 10223dfcd74Spookausage="\ 10323dfcd74SpookaUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 10423dfcd74Spooka or: $0 [OPTION]... SRCFILES... DIRECTORY 10523dfcd74Spooka or: $0 [OPTION]... -t DIRECTORY SRCFILES... 10623dfcd74Spooka or: $0 [OPTION]... -d DIRECTORIES... 10723dfcd74Spooka 10823dfcd74SpookaIn the 1st form, copy SRCFILE to DSTFILE. 10923dfcd74SpookaIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 11023dfcd74SpookaIn the 4th, create DIRECTORIES. 11123dfcd74Spooka 11223dfcd74SpookaOptions: 11323dfcd74Spooka --help display this help and exit. 11423dfcd74Spooka --version display version info and exit. 11523dfcd74Spooka 11623dfcd74Spooka -c (ignored) 11723dfcd74Spooka -C install only if different (preserve the last data modification time) 11823dfcd74Spooka -d create directories instead of installing files. 11923dfcd74Spooka -g GROUP $chgrpprog installed files to GROUP. 12023dfcd74Spooka -m MODE $chmodprog installed files to MODE. 12123dfcd74Spooka -o USER $chownprog installed files to USER. 12223dfcd74Spooka -s $stripprog installed files. 12323dfcd74Spooka -t DIRECTORY install into DIRECTORY. 12423dfcd74Spooka -T report an error if DSTFILE is a directory. 12523dfcd74Spooka 12623dfcd74SpookaEnvironment variables override the default commands: 12723dfcd74Spooka CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12823dfcd74Spooka RMPROG STRIPPROG 12923dfcd74Spooka" 13023dfcd74Spooka 13123dfcd74Spookawhile test $# -ne 0; do 13223dfcd74Spooka case $1 in 13323dfcd74Spooka -c) ;; 13423dfcd74Spooka 13523dfcd74Spooka -C) copy_on_change=true;; 13623dfcd74Spooka 13723dfcd74Spooka -d) dir_arg=true;; 13823dfcd74Spooka 13923dfcd74Spooka -g) chgrpcmd="$chgrpprog $2" 14023dfcd74Spooka shift;; 14123dfcd74Spooka 14223dfcd74Spooka --help) echo "$usage"; exit $?;; 14323dfcd74Spooka 14423dfcd74Spooka -m) mode=$2 14523dfcd74Spooka case $mode in 14623dfcd74Spooka *' '* | *' '* | *' 14723dfcd74Spooka'* | *'*'* | *'?'* | *'['*) 14823dfcd74Spooka echo "$0: invalid mode: $mode" >&2 14923dfcd74Spooka exit 1;; 15023dfcd74Spooka esac 15123dfcd74Spooka shift;; 15223dfcd74Spooka 15323dfcd74Spooka -o) chowncmd="$chownprog $2" 15423dfcd74Spooka shift;; 15523dfcd74Spooka 15623dfcd74Spooka -s) stripcmd=$stripprog;; 15723dfcd74Spooka 15823dfcd74Spooka -t) dst_arg=$2 15923dfcd74Spooka # Protect names problematic for 'test' and other utilities. 16023dfcd74Spooka case $dst_arg in 16123dfcd74Spooka -* | [=\(\)!]) dst_arg=./$dst_arg;; 16223dfcd74Spooka esac 16323dfcd74Spooka shift;; 16423dfcd74Spooka 16523dfcd74Spooka -T) no_target_directory=true;; 16623dfcd74Spooka 16723dfcd74Spooka --version) echo "$0 $scriptversion"; exit $?;; 16823dfcd74Spooka 16923dfcd74Spooka --) shift 17023dfcd74Spooka break;; 17123dfcd74Spooka 17223dfcd74Spooka -*) echo "$0: invalid option: $1" >&2 17323dfcd74Spooka exit 1;; 17423dfcd74Spooka 17523dfcd74Spooka *) break;; 17623dfcd74Spooka esac 17723dfcd74Spooka shift 17823dfcd74Spookadone 17923dfcd74Spooka 18023dfcd74Spookaif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 18123dfcd74Spooka # When -d is used, all remaining arguments are directories to create. 18223dfcd74Spooka # When -t is used, the destination is already specified. 18323dfcd74Spooka # Otherwise, the last argument is the destination. Remove it from $@. 18423dfcd74Spooka for arg 18523dfcd74Spooka do 18623dfcd74Spooka if test -n "$dst_arg"; then 18723dfcd74Spooka # $@ is not empty: it contains at least $arg. 18823dfcd74Spooka set fnord "$@" "$dst_arg" 18923dfcd74Spooka shift # fnord 19023dfcd74Spooka fi 19123dfcd74Spooka shift # arg 19223dfcd74Spooka dst_arg=$arg 19323dfcd74Spooka # Protect names problematic for 'test' and other utilities. 19423dfcd74Spooka case $dst_arg in 19523dfcd74Spooka -* | [=\(\)!]) dst_arg=./$dst_arg;; 19623dfcd74Spooka esac 19723dfcd74Spooka done 19823dfcd74Spookafi 19923dfcd74Spooka 20023dfcd74Spookaif test $# -eq 0; then 20123dfcd74Spooka if test -z "$dir_arg"; then 20223dfcd74Spooka echo "$0: no input file specified." >&2 20323dfcd74Spooka exit 1 20423dfcd74Spooka fi 20523dfcd74Spooka # It's OK to call 'install-sh -d' without argument. 20623dfcd74Spooka # This can happen when creating conditional directories. 20723dfcd74Spooka exit 0 20823dfcd74Spookafi 20923dfcd74Spooka 21023dfcd74Spookaif test -z "$dir_arg"; then 21123dfcd74Spooka do_exit='(exit $ret); exit $ret' 21223dfcd74Spooka trap "ret=129; $do_exit" 1 21323dfcd74Spooka trap "ret=130; $do_exit" 2 21423dfcd74Spooka trap "ret=141; $do_exit" 13 21523dfcd74Spooka trap "ret=143; $do_exit" 15 21623dfcd74Spooka 21723dfcd74Spooka # Set umask so as not to create temps with too-generous modes. 21823dfcd74Spooka # However, 'strip' requires both read and write access to temps. 21923dfcd74Spooka case $mode in 22023dfcd74Spooka # Optimize common cases. 22123dfcd74Spooka *644) cp_umask=133;; 22223dfcd74Spooka *755) cp_umask=22;; 22323dfcd74Spooka 22423dfcd74Spooka *[0-7]) 22523dfcd74Spooka if test -z "$stripcmd"; then 22623dfcd74Spooka u_plus_rw= 22723dfcd74Spooka else 22823dfcd74Spooka u_plus_rw='% 200' 22923dfcd74Spooka fi 23023dfcd74Spooka cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 23123dfcd74Spooka *) 23223dfcd74Spooka if test -z "$stripcmd"; then 23323dfcd74Spooka u_plus_rw= 23423dfcd74Spooka else 23523dfcd74Spooka u_plus_rw=,u+rw 23623dfcd74Spooka fi 23723dfcd74Spooka cp_umask=$mode$u_plus_rw;; 23823dfcd74Spooka esac 23923dfcd74Spookafi 24023dfcd74Spooka 24123dfcd74Spookafor src 24223dfcd74Spookado 24323dfcd74Spooka # Protect names problematic for 'test' and other utilities. 24423dfcd74Spooka case $src in 24523dfcd74Spooka -* | [=\(\)!]) src=./$src;; 24623dfcd74Spooka esac 24723dfcd74Spooka 24823dfcd74Spooka if test -n "$dir_arg"; then 24923dfcd74Spooka dst=$src 25023dfcd74Spooka dstdir=$dst 25123dfcd74Spooka test -d "$dstdir" 25223dfcd74Spooka dstdir_status=$? 25323dfcd74Spooka else 25423dfcd74Spooka 25523dfcd74Spooka # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 25623dfcd74Spooka # might cause directories to be created, which would be especially bad 25723dfcd74Spooka # if $src (and thus $dsttmp) contains '*'. 25823dfcd74Spooka if test ! -f "$src" && test ! -d "$src"; then 25923dfcd74Spooka echo "$0: $src does not exist." >&2 26023dfcd74Spooka exit 1 26123dfcd74Spooka fi 26223dfcd74Spooka 26323dfcd74Spooka if test -z "$dst_arg"; then 26423dfcd74Spooka echo "$0: no destination specified." >&2 26523dfcd74Spooka exit 1 26623dfcd74Spooka fi 26723dfcd74Spooka dst=$dst_arg 26823dfcd74Spooka 26923dfcd74Spooka # If destination is a directory, append the input filename; won't work 27023dfcd74Spooka # if double slashes aren't ignored. 27123dfcd74Spooka if test -d "$dst"; then 27223dfcd74Spooka if test -n "$no_target_directory"; then 27323dfcd74Spooka echo "$0: $dst_arg: Is a directory" >&2 27423dfcd74Spooka exit 1 27523dfcd74Spooka fi 27623dfcd74Spooka dstdir=$dst 27723dfcd74Spooka dst=$dstdir/`basename "$src"` 27823dfcd74Spooka dstdir_status=0 27923dfcd74Spooka else 28023dfcd74Spooka # Prefer dirname, but fall back on a substitute if dirname fails. 28123dfcd74Spooka dstdir=` 28223dfcd74Spooka (dirname "$dst") 2>/dev/null || 28323dfcd74Spooka expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 28423dfcd74Spooka X"$dst" : 'X\(//\)[^/]' \| \ 28523dfcd74Spooka X"$dst" : 'X\(//\)$' \| \ 28623dfcd74Spooka X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28723dfcd74Spooka echo X"$dst" | 28823dfcd74Spooka sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28923dfcd74Spooka s//\1/ 29023dfcd74Spooka q 29123dfcd74Spooka } 29223dfcd74Spooka /^X\(\/\/\)[^/].*/{ 29323dfcd74Spooka s//\1/ 29423dfcd74Spooka q 29523dfcd74Spooka } 29623dfcd74Spooka /^X\(\/\/\)$/{ 29723dfcd74Spooka s//\1/ 29823dfcd74Spooka q 29923dfcd74Spooka } 30023dfcd74Spooka /^X\(\/\).*/{ 30123dfcd74Spooka s//\1/ 30223dfcd74Spooka q 30323dfcd74Spooka } 30423dfcd74Spooka s/.*/./; q' 30523dfcd74Spooka ` 30623dfcd74Spooka 30723dfcd74Spooka test -d "$dstdir" 30823dfcd74Spooka dstdir_status=$? 30923dfcd74Spooka fi 31023dfcd74Spooka fi 31123dfcd74Spooka 31223dfcd74Spooka obsolete_mkdir_used=false 31323dfcd74Spooka 31423dfcd74Spooka if test $dstdir_status != 0; then 31523dfcd74Spooka case $posix_mkdir in 31623dfcd74Spooka '') 31723dfcd74Spooka # Create intermediate dirs using mode 755 as modified by the umask. 31823dfcd74Spooka # This is like FreeBSD 'install' as of 1997-10-28. 31923dfcd74Spooka umask=`umask` 32023dfcd74Spooka case $stripcmd.$umask in 32123dfcd74Spooka # Optimize common cases. 32223dfcd74Spooka *[2367][2367]) mkdir_umask=$umask;; 32323dfcd74Spooka .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 32423dfcd74Spooka 32523dfcd74Spooka *[0-7]) 32623dfcd74Spooka mkdir_umask=`expr $umask + 22 \ 32723dfcd74Spooka - $umask % 100 % 40 + $umask % 20 \ 32823dfcd74Spooka - $umask % 10 % 4 + $umask % 2 32923dfcd74Spooka `;; 33023dfcd74Spooka *) mkdir_umask=$umask,go-w;; 33123dfcd74Spooka esac 33223dfcd74Spooka 33323dfcd74Spooka # With -d, create the new directory with the user-specified mode. 33423dfcd74Spooka # Otherwise, rely on $mkdir_umask. 33523dfcd74Spooka if test -n "$dir_arg"; then 33623dfcd74Spooka mkdir_mode=-m$mode 33723dfcd74Spooka else 33823dfcd74Spooka mkdir_mode= 33923dfcd74Spooka fi 34023dfcd74Spooka 34123dfcd74Spooka posix_mkdir=false 34223dfcd74Spooka case $umask in 34323dfcd74Spooka *[123567][0-7][0-7]) 34423dfcd74Spooka # POSIX mkdir -p sets u+wx bits regardless of umask, which 34523dfcd74Spooka # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 34623dfcd74Spooka ;; 34723dfcd74Spooka *) 348*57f11163Smaya tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34923dfcd74Spooka trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 35023dfcd74Spooka 35123dfcd74Spooka if (umask $mkdir_umask && 35223dfcd74Spooka exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 35323dfcd74Spooka then 35423dfcd74Spooka if test -z "$dir_arg" || { 35523dfcd74Spooka # Check for POSIX incompatibilities with -m. 35623dfcd74Spooka # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35723dfcd74Spooka # other-writable bit of parent directory when it shouldn't. 35823dfcd74Spooka # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35923dfcd74Spooka ls_ld_tmpdir=`ls -ld "$tmpdir"` 36023dfcd74Spooka case $ls_ld_tmpdir in 36123dfcd74Spooka d????-?r-*) different_mode=700;; 36223dfcd74Spooka d????-?--*) different_mode=755;; 36323dfcd74Spooka *) false;; 36423dfcd74Spooka esac && 36523dfcd74Spooka $mkdirprog -m$different_mode -p -- "$tmpdir" && { 36623dfcd74Spooka ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36723dfcd74Spooka test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36823dfcd74Spooka } 36923dfcd74Spooka } 37023dfcd74Spooka then posix_mkdir=: 37123dfcd74Spooka fi 37223dfcd74Spooka rmdir "$tmpdir/d" "$tmpdir" 37323dfcd74Spooka else 37423dfcd74Spooka # Remove any dirs left behind by ancient mkdir implementations. 37523dfcd74Spooka rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 37623dfcd74Spooka fi 37723dfcd74Spooka trap '' 0;; 37823dfcd74Spooka esac;; 37923dfcd74Spooka esac 38023dfcd74Spooka 38123dfcd74Spooka if 38223dfcd74Spooka $posix_mkdir && ( 38323dfcd74Spooka umask $mkdir_umask && 38423dfcd74Spooka $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38523dfcd74Spooka ) 38623dfcd74Spooka then : 38723dfcd74Spooka else 38823dfcd74Spooka 38923dfcd74Spooka # The umask is ridiculous, or mkdir does not conform to POSIX, 39023dfcd74Spooka # or it failed possibly due to a race condition. Create the 39123dfcd74Spooka # directory the slow way, step by step, checking for races as we go. 39223dfcd74Spooka 39323dfcd74Spooka case $dstdir in 39423dfcd74Spooka /*) prefix='/';; 39523dfcd74Spooka [-=\(\)!]*) prefix='./';; 39623dfcd74Spooka *) prefix='';; 39723dfcd74Spooka esac 39823dfcd74Spooka 39923dfcd74Spooka eval "$initialize_posix_glob" 40023dfcd74Spooka 40123dfcd74Spooka oIFS=$IFS 40223dfcd74Spooka IFS=/ 40323dfcd74Spooka $posix_glob set -f 40423dfcd74Spooka set fnord $dstdir 40523dfcd74Spooka shift 40623dfcd74Spooka $posix_glob set +f 40723dfcd74Spooka IFS=$oIFS 40823dfcd74Spooka 40923dfcd74Spooka prefixes= 41023dfcd74Spooka 41123dfcd74Spooka for d 41223dfcd74Spooka do 41323dfcd74Spooka test X"$d" = X && continue 41423dfcd74Spooka 41523dfcd74Spooka prefix=$prefix$d 41623dfcd74Spooka if test -d "$prefix"; then 41723dfcd74Spooka prefixes= 41823dfcd74Spooka else 41923dfcd74Spooka if $posix_mkdir; then 42023dfcd74Spooka (umask=$mkdir_umask && 42123dfcd74Spooka $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 42223dfcd74Spooka # Don't fail if two instances are running concurrently. 42323dfcd74Spooka test -d "$prefix" || exit 1 42423dfcd74Spooka else 42523dfcd74Spooka case $prefix in 42623dfcd74Spooka *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42723dfcd74Spooka *) qprefix=$prefix;; 42823dfcd74Spooka esac 42923dfcd74Spooka prefixes="$prefixes '$qprefix'" 43023dfcd74Spooka fi 43123dfcd74Spooka fi 43223dfcd74Spooka prefix=$prefix/ 43323dfcd74Spooka done 43423dfcd74Spooka 43523dfcd74Spooka if test -n "$prefixes"; then 43623dfcd74Spooka # Don't fail if two instances are running concurrently. 43723dfcd74Spooka (umask $mkdir_umask && 43823dfcd74Spooka eval "\$doit_exec \$mkdirprog $prefixes") || 43923dfcd74Spooka test -d "$dstdir" || exit 1 44023dfcd74Spooka obsolete_mkdir_used=true 44123dfcd74Spooka fi 44223dfcd74Spooka fi 44323dfcd74Spooka fi 44423dfcd74Spooka 44523dfcd74Spooka if test -n "$dir_arg"; then 44623dfcd74Spooka { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44723dfcd74Spooka { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44823dfcd74Spooka { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44923dfcd74Spooka test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 45023dfcd74Spooka else 45123dfcd74Spooka 45223dfcd74Spooka # Make a couple of temp file names in the proper directory. 45323dfcd74Spooka dsttmp=$dstdir/_inst.$$_ 45423dfcd74Spooka rmtmp=$dstdir/_rm.$$_ 45523dfcd74Spooka 45623dfcd74Spooka # Trap to clean up those temp files at exit. 45723dfcd74Spooka trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45823dfcd74Spooka 45923dfcd74Spooka # Copy the file name to the temp name. 46023dfcd74Spooka (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 46123dfcd74Spooka 46223dfcd74Spooka # and set any options; do chmod last to preserve setuid bits. 46323dfcd74Spooka # 46423dfcd74Spooka # If any of these fail, we abort the whole thing. If we want to 46523dfcd74Spooka # ignore errors from any of these, just make sure not to ignore 46623dfcd74Spooka # errors from the above "$doit $cpprog $src $dsttmp" command. 46723dfcd74Spooka # 46823dfcd74Spooka { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46923dfcd74Spooka { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 47023dfcd74Spooka { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 47123dfcd74Spooka { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 47223dfcd74Spooka 47323dfcd74Spooka # If -C, don't bother to copy if it wouldn't change the file. 47423dfcd74Spooka if $copy_on_change && 47523dfcd74Spooka old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 47623dfcd74Spooka new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47723dfcd74Spooka 47823dfcd74Spooka eval "$initialize_posix_glob" && 47923dfcd74Spooka $posix_glob set -f && 48023dfcd74Spooka set X $old && old=:$2:$4:$5:$6 && 48123dfcd74Spooka set X $new && new=:$2:$4:$5:$6 && 48223dfcd74Spooka $posix_glob set +f && 48323dfcd74Spooka 48423dfcd74Spooka test "$old" = "$new" && 48523dfcd74Spooka $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 48623dfcd74Spooka then 48723dfcd74Spooka rm -f "$dsttmp" 48823dfcd74Spooka else 48923dfcd74Spooka # Rename the file to the real destination. 49023dfcd74Spooka $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 49123dfcd74Spooka 49223dfcd74Spooka # The rename failed, perhaps because mv can't rename something else 49323dfcd74Spooka # to itself, or perhaps because mv is so ancient that it does not 49423dfcd74Spooka # support -f. 49523dfcd74Spooka { 49623dfcd74Spooka # Now remove or move aside any old file at destination location. 49723dfcd74Spooka # We try this two ways since rm can't unlink itself on some 49823dfcd74Spooka # systems and the destination file might be busy for other 49923dfcd74Spooka # reasons. In this case, the final cleanup might fail but the new 50023dfcd74Spooka # file should still install successfully. 50123dfcd74Spooka { 50223dfcd74Spooka test ! -f "$dst" || 50323dfcd74Spooka $doit $rmcmd -f "$dst" 2>/dev/null || 50423dfcd74Spooka { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 50523dfcd74Spooka { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 50623dfcd74Spooka } || 50723dfcd74Spooka { echo "$0: cannot unlink or rename $dst" >&2 50823dfcd74Spooka (exit 1); exit 1 50923dfcd74Spooka } 51023dfcd74Spooka } && 51123dfcd74Spooka 51223dfcd74Spooka # Now rename the file to the real destination. 51323dfcd74Spooka $doit $mvcmd "$dsttmp" "$dst" 51423dfcd74Spooka } 51523dfcd74Spooka fi || exit 1 51623dfcd74Spooka 51723dfcd74Spooka trap '' 0 51823dfcd74Spooka fi 51923dfcd74Spookadone 52023dfcd74Spooka 52123dfcd74Spooka# Local variables: 52223dfcd74Spooka# eval: (add-hook 'write-file-hooks 'time-stamp) 52323dfcd74Spooka# time-stamp-start: "scriptversion=" 52423dfcd74Spooka# time-stamp-format: "%:y-%02m-%02d.%02H" 52523dfcd74Spooka# time-stamp-time-zone: "UTC" 52623dfcd74Spooka# time-stamp-end: "; # UTC" 52723dfcd74Spooka# End: 528