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