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