125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#!/bin/sh 225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# install - install a program, script, or datafile 325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 425b3c049e70834cf33790a28643ab058b507b35cBen Chengscriptversion=2009-04-28.21; # UTC 525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# This originates from X11R5 (mit/util/scripts/install.sh), which was 725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# later released in X11R6 (xc/config/util/install.sh) with the 825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# following copyright and license. 925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Copyright (C) 1994 X Consortium 1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 1225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Permission is hereby granted, free of charge, to any person obtaining a copy 1325b3c049e70834cf33790a28643ab058b507b35cBen Cheng# of this software and associated documentation files (the "Software"), to 1425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# deal in the Software without restriction, including without limitation the 1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# sell copies of the Software, and to permit persons to whom the Software is 1725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# furnished to do so, subject to the following conditions: 1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 1925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# The above copyright notice and this permission notice shall be included in 2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# all copies or substantial portions of the Software. 2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Except as contained in this notice, the name of the X Consortium shall not 3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# be used in advertising or otherwise to promote the sale, use or other deal- 3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# ings in this Software without prior written authorization from the X Consor- 3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# tium. 3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng# FSF changes to this file are in the public domain. 3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Calling this script install-sh is preferred over install.sh, to prevent 3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# `make' implicit rules from creating a file called install from it 3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# when there is no Makefile. 4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# 4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# This script is compatible with the BSD install script, but was written 4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# from scratch. 4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4425b3c049e70834cf33790a28643ab058b507b35cBen Chengnl=' 4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng' 4625b3c049e70834cf33790a28643ab058b507b35cBen ChengIFS=" "" $nl" 4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# set DOITPROG to echo to test this script 4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Don't use :- since 4.3BSD and earlier shells don't like it. 5125b3c049e70834cf33790a28643ab058b507b35cBen Chengdoit=${DOITPROG-} 5225b3c049e70834cf33790a28643ab058b507b35cBen Chengif test -z "$doit"; then 5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng doit_exec=exec 5425b3c049e70834cf33790a28643ab058b507b35cBen Chengelse 5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng doit_exec=$doit 5625b3c049e70834cf33790a28643ab058b507b35cBen Chengfi 5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Put in absolute file names if you don't have them in your path; 5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# or use environment vars. 6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6125b3c049e70834cf33790a28643ab058b507b35cBen Chengchgrpprog=${CHGRPPROG-chgrp} 6225b3c049e70834cf33790a28643ab058b507b35cBen Chengchmodprog=${CHMODPROG-chmod} 6325b3c049e70834cf33790a28643ab058b507b35cBen Chengchownprog=${CHOWNPROG-chown} 6425b3c049e70834cf33790a28643ab058b507b35cBen Chengcmpprog=${CMPPROG-cmp} 6525b3c049e70834cf33790a28643ab058b507b35cBen Chengcpprog=${CPPROG-cp} 6625b3c049e70834cf33790a28643ab058b507b35cBen Chengmkdirprog=${MKDIRPROG-mkdir} 6725b3c049e70834cf33790a28643ab058b507b35cBen Chengmvprog=${MVPROG-mv} 6825b3c049e70834cf33790a28643ab058b507b35cBen Chengrmprog=${RMPROG-rm} 6925b3c049e70834cf33790a28643ab058b507b35cBen Chengstripprog=${STRIPPROG-strip} 7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7125b3c049e70834cf33790a28643ab058b507b35cBen Chengposix_glob='?' 7225b3c049e70834cf33790a28643ab058b507b35cBen Chenginitialize_posix_glob=' 7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng test "$posix_glob" != "?" || { 7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (set -f) 2>/dev/null; then 7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng posix_glob= 7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng posix_glob=: 7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng' 8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8225b3c049e70834cf33790a28643ab058b507b35cBen Chengposix_mkdir= 8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Desired mode of installed file. 8525b3c049e70834cf33790a28643ab058b507b35cBen Chengmode=0755 8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8725b3c049e70834cf33790a28643ab058b507b35cBen Chengchgrpcmd= 8825b3c049e70834cf33790a28643ab058b507b35cBen Chengchmodcmd=$chmodprog 8925b3c049e70834cf33790a28643ab058b507b35cBen Chengchowncmd= 9025b3c049e70834cf33790a28643ab058b507b35cBen Chengmvcmd=$mvprog 9125b3c049e70834cf33790a28643ab058b507b35cBen Chengrmcmd="$rmprog -f" 9225b3c049e70834cf33790a28643ab058b507b35cBen Chengstripcmd= 9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9425b3c049e70834cf33790a28643ab058b507b35cBen Chengsrc= 9525b3c049e70834cf33790a28643ab058b507b35cBen Chengdst= 9625b3c049e70834cf33790a28643ab058b507b35cBen Chengdir_arg= 9725b3c049e70834cf33790a28643ab058b507b35cBen Chengdst_arg= 9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9925b3c049e70834cf33790a28643ab058b507b35cBen Chengcopy_on_change=false 10025b3c049e70834cf33790a28643ab058b507b35cBen Chengno_target_directory= 10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10225b3c049e70834cf33790a28643ab058b507b35cBen Chengusage="\ 10325b3c049e70834cf33790a28643ab058b507b35cBen ChengUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng or: $0 [OPTION]... SRCFILES... DIRECTORY 10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng or: $0 [OPTION]... -t DIRECTORY SRCFILES... 10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng or: $0 [OPTION]... -d DIRECTORIES... 10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10825b3c049e70834cf33790a28643ab058b507b35cBen ChengIn the 1st form, copy SRCFILE to DSTFILE. 10925b3c049e70834cf33790a28643ab058b507b35cBen ChengIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 11025b3c049e70834cf33790a28643ab058b507b35cBen ChengIn the 4th, create DIRECTORIES. 11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11225b3c049e70834cf33790a28643ab058b507b35cBen ChengOptions: 11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng --help display this help and exit. 11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng --version display version info and exit. 11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng -c (ignored) 11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng -C install only if different (preserve the last data modification time) 11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng -d create directories instead of installing files. 11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng -g GROUP $chgrpprog installed files to GROUP. 12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng -m MODE $chmodprog installed files to MODE. 12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng -o USER $chownprog installed files to USER. 12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng -s $stripprog installed files. 12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng -t DIRECTORY install into DIRECTORY. 12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng -T report an error if DSTFILE is a directory. 12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12625b3c049e70834cf33790a28643ab058b507b35cBen ChengEnvironment variables override the default commands: 12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng RMPROG STRIPPROG 12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng" 13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13125b3c049e70834cf33790a28643ab058b507b35cBen Chengwhile test $# -ne 0; do 13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $1 in 13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng -c) ;; 13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng -C) copy_on_change=true;; 13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng -d) dir_arg=true;; 13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng -g) chgrpcmd="$chgrpprog $2" 14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift;; 14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng --help) echo "$usage"; exit $?;; 14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng -m) mode=$2 14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $mode in 14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng *' '* | *' '* | *' 14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng'* | *'*'* | *'?'* | *'['*) 14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng echo "$0: invalid mode: $mode" >&2 14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng exit 1;; 15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift;; 15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng -o) chowncmd="$chownprog $2" 15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift;; 15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng -s) stripcmd=$stripprog;; 15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng -t) dst_arg=$2 15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift;; 16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng -T) no_target_directory=true;; 16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng --version) echo "$0 $scriptversion"; exit $?;; 16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng --) shift 16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng break;; 16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng -*) echo "$0: invalid option: $1" >&2 16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng exit 1;; 17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng *) break;; 17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift 17425b3c049e70834cf33790a28643ab058b507b35cBen Chengdone 17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17625b3c049e70834cf33790a28643ab058b507b35cBen Chengif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # When -d is used, all remaining arguments are directories to create. 17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng # When -t is used, the destination is already specified. 17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Otherwise, the last argument is the destination. Remove it from $@. 18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng for arg 18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng do 18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -n "$dst_arg"; then 18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng # $@ is not empty: it contains at least $arg. 18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng set fnord "$@" "$dst_arg" 18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift # fnord 18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift # arg 18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng dst_arg=$arg 18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng done 19025b3c049e70834cf33790a28643ab058b507b35cBen Chengfi 19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19225b3c049e70834cf33790a28643ab058b507b35cBen Chengif test $# -eq 0; then 19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -z "$dir_arg"; then 19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng echo "$0: no input file specified." >&2 19525b3c049e70834cf33790a28643ab058b507b35cBen Cheng exit 1 19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # It's OK to call `install-sh -d' without argument. 19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng # This can happen when creating conditional directories. 19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng exit 0 20025b3c049e70834cf33790a28643ab058b507b35cBen Chengfi 20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 20225b3c049e70834cf33790a28643ab058b507b35cBen Chengif test -z "$dir_arg"; then 20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng trap '(exit $?); exit' 1 2 13 15 20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 20525b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Set umask so as not to create temps with too-generous modes. 20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng # However, 'strip' requires both read and write access to temps. 20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $mode in 20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Optimize common cases. 20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng *644) cp_umask=133;; 21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng *755) cp_umask=22;; 21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng *[0-7]) 21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -z "$stripcmd"; then 21425b3c049e70834cf33790a28643ab058b507b35cBen Cheng u_plus_rw= 21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng u_plus_rw='% 200' 21725b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 21825b3c049e70834cf33790a28643ab058b507b35cBen Cheng cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 21925b3c049e70834cf33790a28643ab058b507b35cBen Cheng *) 22025b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -z "$stripcmd"; then 22125b3c049e70834cf33790a28643ab058b507b35cBen Cheng u_plus_rw= 22225b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng u_plus_rw=,u+rw 22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 22525b3c049e70834cf33790a28643ab058b507b35cBen Cheng cp_umask=$mode$u_plus_rw;; 22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 22725b3c049e70834cf33790a28643ab058b507b35cBen Chengfi 22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 22925b3c049e70834cf33790a28643ab058b507b35cBen Chengfor src 23025b3c049e70834cf33790a28643ab058b507b35cBen Chengdo 23125b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Protect names starting with `-'. 23225b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $src in 23325b3c049e70834cf33790a28643ab058b507b35cBen Cheng -*) src=./$src;; 23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 23625b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -n "$dir_arg"; then 23725b3c049e70834cf33790a28643ab058b507b35cBen Cheng dst=$src 23825b3c049e70834cf33790a28643ab058b507b35cBen Cheng dstdir=$dst 23925b3c049e70834cf33790a28643ab058b507b35cBen Cheng test -d "$dstdir" 24025b3c049e70834cf33790a28643ab058b507b35cBen Cheng dstdir_status=$? 24125b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 24225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 24325b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 24425b3c049e70834cf33790a28643ab058b507b35cBen Cheng # might cause directories to be created, which would be especially bad 24525b3c049e70834cf33790a28643ab058b507b35cBen Cheng # if $src (and thus $dsttmp) contains '*'. 24625b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test ! -f "$src" && test ! -d "$src"; then 24725b3c049e70834cf33790a28643ab058b507b35cBen Cheng echo "$0: $src does not exist." >&2 24825b3c049e70834cf33790a28643ab058b507b35cBen Cheng exit 1 24925b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 25025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25125b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -z "$dst_arg"; then 25225b3c049e70834cf33790a28643ab058b507b35cBen Cheng echo "$0: no destination specified." >&2 25325b3c049e70834cf33790a28643ab058b507b35cBen Cheng exit 1 25425b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 25525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25625b3c049e70834cf33790a28643ab058b507b35cBen Cheng dst=$dst_arg 25725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Protect names starting with `-'. 25825b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $dst in 25925b3c049e70834cf33790a28643ab058b507b35cBen Cheng -*) dst=./$dst;; 26025b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 26125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 26225b3c049e70834cf33790a28643ab058b507b35cBen Cheng # If destination is a directory, append the input filename; won't work 26325b3c049e70834cf33790a28643ab058b507b35cBen Cheng # if double slashes aren't ignored. 26425b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -d "$dst"; then 26525b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -n "$no_target_directory"; then 26625b3c049e70834cf33790a28643ab058b507b35cBen Cheng echo "$0: $dst_arg: Is a directory" >&2 26725b3c049e70834cf33790a28643ab058b507b35cBen Cheng exit 1 26825b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 26925b3c049e70834cf33790a28643ab058b507b35cBen Cheng dstdir=$dst 27025b3c049e70834cf33790a28643ab058b507b35cBen Cheng dst=$dstdir/`basename "$src"` 27125b3c049e70834cf33790a28643ab058b507b35cBen Cheng dstdir_status=0 27225b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 27325b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Prefer dirname, but fall back on a substitute if dirname fails. 27425b3c049e70834cf33790a28643ab058b507b35cBen Cheng dstdir=` 27525b3c049e70834cf33790a28643ab058b507b35cBen Cheng (dirname "$dst") 2>/dev/null || 27625b3c049e70834cf33790a28643ab058b507b35cBen Cheng expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 27725b3c049e70834cf33790a28643ab058b507b35cBen Cheng X"$dst" : 'X\(//\)[^/]' \| \ 27825b3c049e70834cf33790a28643ab058b507b35cBen Cheng X"$dst" : 'X\(//\)$' \| \ 27925b3c049e70834cf33790a28643ab058b507b35cBen Cheng X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28025b3c049e70834cf33790a28643ab058b507b35cBen Cheng echo X"$dst" | 28125b3c049e70834cf33790a28643ab058b507b35cBen Cheng sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28225b3c049e70834cf33790a28643ab058b507b35cBen Cheng s//\1/ 28325b3c049e70834cf33790a28643ab058b507b35cBen Cheng q 28425b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 28525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /^X\(\/\/\)[^/].*/{ 28625b3c049e70834cf33790a28643ab058b507b35cBen Cheng s//\1/ 28725b3c049e70834cf33790a28643ab058b507b35cBen Cheng q 28825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 28925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /^X\(\/\/\)$/{ 29025b3c049e70834cf33790a28643ab058b507b35cBen Cheng s//\1/ 29125b3c049e70834cf33790a28643ab058b507b35cBen Cheng q 29225b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 29325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /^X\(\/\).*/{ 29425b3c049e70834cf33790a28643ab058b507b35cBen Cheng s//\1/ 29525b3c049e70834cf33790a28643ab058b507b35cBen Cheng q 29625b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 29725b3c049e70834cf33790a28643ab058b507b35cBen Cheng s/.*/./; q' 29825b3c049e70834cf33790a28643ab058b507b35cBen Cheng ` 29925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 30025b3c049e70834cf33790a28643ab058b507b35cBen Cheng test -d "$dstdir" 30125b3c049e70834cf33790a28643ab058b507b35cBen Cheng dstdir_status=$? 30225b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 30325b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 30425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 30525b3c049e70834cf33790a28643ab058b507b35cBen Cheng obsolete_mkdir_used=false 30625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 30725b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test $dstdir_status != 0; then 30825b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $posix_mkdir in 30925b3c049e70834cf33790a28643ab058b507b35cBen Cheng '') 31025b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Create intermediate dirs using mode 755 as modified by the umask. 31125b3c049e70834cf33790a28643ab058b507b35cBen Cheng # This is like FreeBSD 'install' as of 1997-10-28. 31225b3c049e70834cf33790a28643ab058b507b35cBen Cheng umask=`umask` 31325b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $stripcmd.$umask in 31425b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Optimize common cases. 31525b3c049e70834cf33790a28643ab058b507b35cBen Cheng *[2367][2367]) mkdir_umask=$umask;; 31625b3c049e70834cf33790a28643ab058b507b35cBen Cheng .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 31725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 31825b3c049e70834cf33790a28643ab058b507b35cBen Cheng *[0-7]) 31925b3c049e70834cf33790a28643ab058b507b35cBen Cheng mkdir_umask=`expr $umask + 22 \ 32025b3c049e70834cf33790a28643ab058b507b35cBen Cheng - $umask % 100 % 40 + $umask % 20 \ 32125b3c049e70834cf33790a28643ab058b507b35cBen Cheng - $umask % 10 % 4 + $umask % 2 32225b3c049e70834cf33790a28643ab058b507b35cBen Cheng `;; 32325b3c049e70834cf33790a28643ab058b507b35cBen Cheng *) mkdir_umask=$umask,go-w;; 32425b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 32525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 32625b3c049e70834cf33790a28643ab058b507b35cBen Cheng # With -d, create the new directory with the user-specified mode. 32725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Otherwise, rely on $mkdir_umask. 32825b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -n "$dir_arg"; then 32925b3c049e70834cf33790a28643ab058b507b35cBen Cheng mkdir_mode=-m$mode 33025b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 33125b3c049e70834cf33790a28643ab058b507b35cBen Cheng mkdir_mode= 33225b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 33325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 33425b3c049e70834cf33790a28643ab058b507b35cBen Cheng posix_mkdir=false 33525b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $umask in 33625b3c049e70834cf33790a28643ab058b507b35cBen Cheng *[123567][0-7][0-7]) 33725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # POSIX mkdir -p sets u+wx bits regardless of umask, which 33825b3c049e70834cf33790a28643ab058b507b35cBen Cheng # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 33925b3c049e70834cf33790a28643ab058b507b35cBen Cheng ;; 34025b3c049e70834cf33790a28643ab058b507b35cBen Cheng *) 34125b3c049e70834cf33790a28643ab058b507b35cBen Cheng tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34225b3c049e70834cf33790a28643ab058b507b35cBen Cheng trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 34325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 34425b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (umask $mkdir_umask && 34525b3c049e70834cf33790a28643ab058b507b35cBen Cheng exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 34625b3c049e70834cf33790a28643ab058b507b35cBen Cheng then 34725b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -z "$dir_arg" || { 34825b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Check for POSIX incompatibilities with -m. 34925b3c049e70834cf33790a28643ab058b507b35cBen Cheng # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35025b3c049e70834cf33790a28643ab058b507b35cBen Cheng # other-writeable bit of parent directory when it shouldn't. 35125b3c049e70834cf33790a28643ab058b507b35cBen Cheng # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35225b3c049e70834cf33790a28643ab058b507b35cBen Cheng ls_ld_tmpdir=`ls -ld "$tmpdir"` 35325b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $ls_ld_tmpdir in 35425b3c049e70834cf33790a28643ab058b507b35cBen Cheng d????-?r-*) different_mode=700;; 35525b3c049e70834cf33790a28643ab058b507b35cBen Cheng d????-?--*) different_mode=755;; 35625b3c049e70834cf33790a28643ab058b507b35cBen Cheng *) false;; 35725b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac && 35825b3c049e70834cf33790a28643ab058b507b35cBen Cheng $mkdirprog -m$different_mode -p -- "$tmpdir" && { 35925b3c049e70834cf33790a28643ab058b507b35cBen Cheng ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36025b3c049e70834cf33790a28643ab058b507b35cBen Cheng test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36125b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 36225b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 36325b3c049e70834cf33790a28643ab058b507b35cBen Cheng then posix_mkdir=: 36425b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 36525b3c049e70834cf33790a28643ab058b507b35cBen Cheng rmdir "$tmpdir/d" "$tmpdir" 36625b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 36725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Remove any dirs left behind by ancient mkdir implementations. 36825b3c049e70834cf33790a28643ab058b507b35cBen Cheng rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 36925b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 37025b3c049e70834cf33790a28643ab058b507b35cBen Cheng trap '' 0;; 37125b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac;; 37225b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 37325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 37425b3c049e70834cf33790a28643ab058b507b35cBen Cheng if 37525b3c049e70834cf33790a28643ab058b507b35cBen Cheng $posix_mkdir && ( 37625b3c049e70834cf33790a28643ab058b507b35cBen Cheng umask $mkdir_umask && 37725b3c049e70834cf33790a28643ab058b507b35cBen Cheng $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 37825b3c049e70834cf33790a28643ab058b507b35cBen Cheng ) 37925b3c049e70834cf33790a28643ab058b507b35cBen Cheng then : 38025b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 38125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 38225b3c049e70834cf33790a28643ab058b507b35cBen Cheng # The umask is ridiculous, or mkdir does not conform to POSIX, 38325b3c049e70834cf33790a28643ab058b507b35cBen Cheng # or it failed possibly due to a race condition. Create the 38425b3c049e70834cf33790a28643ab058b507b35cBen Cheng # directory the slow way, step by step, checking for races as we go. 38525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 38625b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $dstdir in 38725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /*) prefix='/';; 38825b3c049e70834cf33790a28643ab058b507b35cBen Cheng -*) prefix='./';; 38925b3c049e70834cf33790a28643ab058b507b35cBen Cheng *) prefix='';; 39025b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 39125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 39225b3c049e70834cf33790a28643ab058b507b35cBen Cheng eval "$initialize_posix_glob" 39325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 39425b3c049e70834cf33790a28643ab058b507b35cBen Cheng oIFS=$IFS 39525b3c049e70834cf33790a28643ab058b507b35cBen Cheng IFS=/ 39625b3c049e70834cf33790a28643ab058b507b35cBen Cheng $posix_glob set -f 39725b3c049e70834cf33790a28643ab058b507b35cBen Cheng set fnord $dstdir 39825b3c049e70834cf33790a28643ab058b507b35cBen Cheng shift 39925b3c049e70834cf33790a28643ab058b507b35cBen Cheng $posix_glob set +f 40025b3c049e70834cf33790a28643ab058b507b35cBen Cheng IFS=$oIFS 40125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40225b3c049e70834cf33790a28643ab058b507b35cBen Cheng prefixes= 40325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40425b3c049e70834cf33790a28643ab058b507b35cBen Cheng for d 40525b3c049e70834cf33790a28643ab058b507b35cBen Cheng do 40625b3c049e70834cf33790a28643ab058b507b35cBen Cheng test -z "$d" && continue 40725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40825b3c049e70834cf33790a28643ab058b507b35cBen Cheng prefix=$prefix$d 40925b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -d "$prefix"; then 41025b3c049e70834cf33790a28643ab058b507b35cBen Cheng prefixes= 41125b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 41225b3c049e70834cf33790a28643ab058b507b35cBen Cheng if $posix_mkdir; then 41325b3c049e70834cf33790a28643ab058b507b35cBen Cheng (umask=$mkdir_umask && 41425b3c049e70834cf33790a28643ab058b507b35cBen Cheng $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 41525b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Don't fail if two instances are running concurrently. 41625b3c049e70834cf33790a28643ab058b507b35cBen Cheng test -d "$prefix" || exit 1 41725b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 41825b3c049e70834cf33790a28643ab058b507b35cBen Cheng case $prefix in 41925b3c049e70834cf33790a28643ab058b507b35cBen Cheng *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42025b3c049e70834cf33790a28643ab058b507b35cBen Cheng *) qprefix=$prefix;; 42125b3c049e70834cf33790a28643ab058b507b35cBen Cheng esac 42225b3c049e70834cf33790a28643ab058b507b35cBen Cheng prefixes="$prefixes '$qprefix'" 42325b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 42425b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 42525b3c049e70834cf33790a28643ab058b507b35cBen Cheng prefix=$prefix/ 42625b3c049e70834cf33790a28643ab058b507b35cBen Cheng done 42725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 42825b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -n "$prefixes"; then 42925b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Don't fail if two instances are running concurrently. 43025b3c049e70834cf33790a28643ab058b507b35cBen Cheng (umask $mkdir_umask && 43125b3c049e70834cf33790a28643ab058b507b35cBen Cheng eval "\$doit_exec \$mkdirprog $prefixes") || 43225b3c049e70834cf33790a28643ab058b507b35cBen Cheng test -d "$dstdir" || exit 1 43325b3c049e70834cf33790a28643ab058b507b35cBen Cheng obsolete_mkdir_used=true 43425b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 43525b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 43625b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 43725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 43825b3c049e70834cf33790a28643ab058b507b35cBen Cheng if test -n "$dir_arg"; then 43925b3c049e70834cf33790a28643ab058b507b35cBen Cheng { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44025b3c049e70834cf33790a28643ab058b507b35cBen Cheng { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44125b3c049e70834cf33790a28643ab058b507b35cBen Cheng { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44225b3c049e70834cf33790a28643ab058b507b35cBen Cheng test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44325b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 44425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 44525b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Make a couple of temp file names in the proper directory. 44625b3c049e70834cf33790a28643ab058b507b35cBen Cheng dsttmp=$dstdir/_inst.$$_ 44725b3c049e70834cf33790a28643ab058b507b35cBen Cheng rmtmp=$dstdir/_rm.$$_ 44825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 44925b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Trap to clean up those temp files at exit. 45025b3c049e70834cf33790a28643ab058b507b35cBen Cheng trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 45225b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Copy the file name to the temp name. 45325b3c049e70834cf33790a28643ab058b507b35cBen Cheng (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 45425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 45525b3c049e70834cf33790a28643ab058b507b35cBen Cheng # and set any options; do chmod last to preserve setuid bits. 45625b3c049e70834cf33790a28643ab058b507b35cBen Cheng # 45725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # If any of these fail, we abort the whole thing. If we want to 45825b3c049e70834cf33790a28643ab058b507b35cBen Cheng # ignore errors from any of these, just make sure not to ignore 45925b3c049e70834cf33790a28643ab058b507b35cBen Cheng # errors from the above "$doit $cpprog $src $dsttmp" command. 46025b3c049e70834cf33790a28643ab058b507b35cBen Cheng # 46125b3c049e70834cf33790a28643ab058b507b35cBen Cheng { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46225b3c049e70834cf33790a28643ab058b507b35cBen Cheng { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 46325b3c049e70834cf33790a28643ab058b507b35cBen Cheng { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 46425b3c049e70834cf33790a28643ab058b507b35cBen Cheng { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 46525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 46625b3c049e70834cf33790a28643ab058b507b35cBen Cheng # If -C, don't bother to copy if it wouldn't change the file. 46725b3c049e70834cf33790a28643ab058b507b35cBen Cheng if $copy_on_change && 46825b3c049e70834cf33790a28643ab058b507b35cBen Cheng old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 46925b3c049e70834cf33790a28643ab058b507b35cBen Cheng new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 47125b3c049e70834cf33790a28643ab058b507b35cBen Cheng eval "$initialize_posix_glob" && 47225b3c049e70834cf33790a28643ab058b507b35cBen Cheng $posix_glob set -f && 47325b3c049e70834cf33790a28643ab058b507b35cBen Cheng set X $old && old=:$2:$4:$5:$6 && 47425b3c049e70834cf33790a28643ab058b507b35cBen Cheng set X $new && new=:$2:$4:$5:$6 && 47525b3c049e70834cf33790a28643ab058b507b35cBen Cheng $posix_glob set +f && 47625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 47725b3c049e70834cf33790a28643ab058b507b35cBen Cheng test "$old" = "$new" && 47825b3c049e70834cf33790a28643ab058b507b35cBen Cheng $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 47925b3c049e70834cf33790a28643ab058b507b35cBen Cheng then 48025b3c049e70834cf33790a28643ab058b507b35cBen Cheng rm -f "$dsttmp" 48125b3c049e70834cf33790a28643ab058b507b35cBen Cheng else 48225b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Rename the file to the real destination. 48325b3c049e70834cf33790a28643ab058b507b35cBen Cheng $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 48425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 48525b3c049e70834cf33790a28643ab058b507b35cBen Cheng # The rename failed, perhaps because mv can't rename something else 48625b3c049e70834cf33790a28643ab058b507b35cBen Cheng # to itself, or perhaps because mv is so ancient that it does not 48725b3c049e70834cf33790a28643ab058b507b35cBen Cheng # support -f. 48825b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 48925b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Now remove or move aside any old file at destination location. 49025b3c049e70834cf33790a28643ab058b507b35cBen Cheng # We try this two ways since rm can't unlink itself on some 49125b3c049e70834cf33790a28643ab058b507b35cBen Cheng # systems and the destination file might be busy for other 49225b3c049e70834cf33790a28643ab058b507b35cBen Cheng # reasons. In this case, the final cleanup might fail but the new 49325b3c049e70834cf33790a28643ab058b507b35cBen Cheng # file should still install successfully. 49425b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 49525b3c049e70834cf33790a28643ab058b507b35cBen Cheng test ! -f "$dst" || 49625b3c049e70834cf33790a28643ab058b507b35cBen Cheng $doit $rmcmd -f "$dst" 2>/dev/null || 49725b3c049e70834cf33790a28643ab058b507b35cBen Cheng { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 49825b3c049e70834cf33790a28643ab058b507b35cBen Cheng { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 49925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } || 50025b3c049e70834cf33790a28643ab058b507b35cBen Cheng { echo "$0: cannot unlink or rename $dst" >&2 50125b3c049e70834cf33790a28643ab058b507b35cBen Cheng (exit 1); exit 1 50225b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 50325b3c049e70834cf33790a28643ab058b507b35cBen Cheng } && 50425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 50525b3c049e70834cf33790a28643ab058b507b35cBen Cheng # Now rename the file to the real destination. 50625b3c049e70834cf33790a28643ab058b507b35cBen Cheng $doit $mvcmd "$dsttmp" "$dst" 50725b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 50825b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi || exit 1 50925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 51025b3c049e70834cf33790a28643ab058b507b35cBen Cheng trap '' 0 51125b3c049e70834cf33790a28643ab058b507b35cBen Cheng fi 51225b3c049e70834cf33790a28643ab058b507b35cBen Chengdone 51325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 51425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Local variables: 51525b3c049e70834cf33790a28643ab058b507b35cBen Cheng# eval: (add-hook 'write-file-hooks 'time-stamp) 51625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# time-stamp-start: "scriptversion=" 51725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# time-stamp-format: "%:y-%02m-%02d.%02H" 51825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# time-stamp-time-zone: "UTC" 51925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# time-stamp-end: "; # UTC" 52025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# End: 521