18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#!/bin/sh
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# install - install a program, script, or datafile
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsscriptversion=2005-05-14.22
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# This originates from X11R5 (mit/util/scripts/install.sh), which was
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# later released in X11R6 (xc/config/util/install.sh) with the
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# following copyright and license.
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Copyright (C) 1994 X Consortium
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Permission is hereby granted, free of charge, to any person obtaining a copy
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# of this software and associated documentation files (the "Software"), to
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# deal in the Software without restriction, including without limitation the
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# sell copies of the Software, and to permit persons to whom the Software is
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# furnished to do so, subject to the following conditions:
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# The above copyright notice and this permission notice shall be included in
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# all copies or substantial portions of the Software.
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Except as contained in this notice, the name of the X Consortium shall not
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# be used in advertising or otherwise to promote the sale, use or other deal-
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# ings in this Software without prior written authorization from the X Consor-
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# tium.
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# FSF changes to this file are in the public domain.
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Calling this script install-sh is preferred over install.sh, to prevent
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# `make' implicit rules from creating a file called install from it
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# when there is no Makefile.
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# This script is compatible with the BSD install script, but was written
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# from scratch.  It can only install one file at a time, a restriction
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# shared with many OS's install programs.
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# set DOITPROG to echo to test this script
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Don't use :- since 4.3BSD and earlier shells don't like it.
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdoit="${DOITPROG-}"
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# put in absolute paths if you don't have them in your path; or use env. vars.
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmvprog="${MVPROG-mv}"
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscpprog="${CPPROG-cp}"
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschmodprog="${CHMODPROG-chmod}"
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschownprog="${CHOWNPROG-chown}"
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschgrpprog="${CHGRPPROG-chgrp}"
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstripprog="${STRIPPROG-strip}"
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrmprog="${RMPROG-rm}"
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmkdirprog="${MKDIRPROG-mkdir}"
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschmodcmd="$chmodprog 0755"
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschowncmd=
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschgrpcmd=
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstripcmd=
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrmcmd="$rmprog -f"
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmvcmd="$mvprog"
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssrc=
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdst=
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdir_arg=
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdstarg=
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsno_target_directory=
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   or: $0 [OPTION]... SRCFILES... DIRECTORY
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   or: $0 [OPTION]... -d DIRECTORIES...
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIn the 1st form, copy SRCFILE to DSTFILE.
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIn the 4th, create DIRECTORIES.
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsOptions:
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-c         (ignored)
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-d         create directories instead of installing files.
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-g GROUP   $chgrpprog installed files to GROUP.
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-m MODE    $chmodprog installed files to MODE.
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-o USER    $chownprog installed files to USER.
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-s         $stripprog installed files.
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-t DIRECTORY  install into DIRECTORY.
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-T         report an error if DSTFILE is a directory.
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels--help     display this help and exit.
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels--version  display version info and exit.
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsEnvironment variables override the default commands:
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels"
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswhile test -n "$1"; do
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  case $1 in
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -c) shift
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        continue;;
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -d) dir_arg=true
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        continue;;
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -g) chgrpcmd="$chgrpprog $2"
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        continue;;
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    --help) echo "$usage"; exit $?;;
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -m) chmodcmd="$chmodprog $2"
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        continue;;
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -o) chowncmd="$chownprog $2"
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        continue;;
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -s) stripcmd=$stripprog
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        shift
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        continue;;
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -t) dstarg=$2
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	shift
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	shift
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	continue;;
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -T) no_target_directory=true
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	shift
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	continue;;
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    --version) echo "$0 $scriptversion"; exit $?;;
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    *)  # When -d is used, all remaining arguments are directories to create.
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	# When -t is used, the destination is already specified.
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	test -n "$dir_arg$dstarg" && break
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        # Otherwise, the last argument is the destination.  Remove it from $@.
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	for arg
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	do
1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if test -n "$dstarg"; then
1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    # $@ is not empty: it contains at least $arg.
1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    set fnord "$@" "$dstarg"
1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    shift # fnord
1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	  fi
1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	  shift # arg
1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	  dstarg=$arg
1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	done
1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	break;;
1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  esac
1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdone
1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsif test -z "$1"; then
1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if test -z "$dir_arg"; then
1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    echo "$0: no input file specified." >&2
1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit 1
1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  fi
1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # It's OK to call `install-sh -d' without argument.
1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # This can happen when creating conditional directories.
1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  exit 0
1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfi
1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfor src
1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdo
1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # Protect names starting with `-'.
1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  case $src in
1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    -*) src=./$src ;;
1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  esac
1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if test -n "$dir_arg"; then
1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    dst=$src
1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    src=
1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if test -d "$dst"; then
1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      mkdircmd=:
1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      chmodcmd=
1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    else
1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      mkdircmd=$mkdirprog
1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fi
1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  else
1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # might cause directories to be created, which would be especially bad
1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # if $src (and thus $dsttmp) contains '*'.
1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if test ! -f "$src" && test ! -d "$src"; then
1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      echo "$0: $src does not exist." >&2
1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      exit 1
1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fi
1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if test -z "$dstarg"; then
1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      echo "$0: no destination specified." >&2
1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      exit 1
1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fi
1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    dst=$dstarg
1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # Protect names starting with `-'.
2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    case $dst in
2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      -*) dst=./$dst ;;
2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    esac
2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # If destination is a directory, append the input filename; won't work
2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # if double slashes aren't ignored.
2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if test -d "$dst"; then
2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if test -n "$no_target_directory"; then
2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	echo "$0: $dstarg: Is a directory" >&2
2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	exit 1
2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fi
2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      dst=$dst/`basename "$src"`
2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fi
2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  fi
2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # This sed command emulates the dirname command.
2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # Make sure that the destination directory exists.
2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # Skip lots of stat calls in the usual case.
2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if test ! -d "$dstdir"; then
2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    defaultIFS='
2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	 '
2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    IFS="${IFS-$defaultIFS}"
2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oIFS=$IFS
2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # Some sh's can't handle IFS=/ for some reason.
2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    IFS='%'
2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    shift
2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    IFS=$oIFS
2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    pathcomp=
2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    while test $# -ne 0 ; do
2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      pathcomp=$pathcomp$1
2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      shift
2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if test ! -d "$pathcomp"; then
2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        $mkdirprog "$pathcomp"
2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	# mkdir can fail with a `File exist' error in case several
2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	# install-sh are creating the directory concurrently.  This
2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	# is OK.
2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	test -d "$pathcomp" || exit
2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fi
2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      pathcomp=$pathcomp/
2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    done
2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  fi
2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if test -n "$dir_arg"; then
2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    $doit $mkdircmd "$dst" \
2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  else
2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    dstfile=`basename "$dst"`
2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # Make a couple of temp file names in the proper directory.
2608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    dsttmp=$dstdir/_inst.$$_
2618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    rmtmp=$dstdir/_rm.$$_
2628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # Trap to clean up those temp files at exit.
2648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
2658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    trap '(exit $?); exit' 1 2 13 15
2668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # Copy the file name to the temp name.
2688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    $doit $cpprog "$src" "$dsttmp" &&
2698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # and set any options; do chmod last to preserve setuid bits.
2718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    #
2728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # If any of these fail, we abort the whole thing.  If we want to
2738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # ignore errors from any of these, just make sure not to ignore
2748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # errors from the above "$doit $cpprog $src $dsttmp" command.
2758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    #
2768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
2778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
2788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
2798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
2808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    # Now rename the file to the real destination.
2828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
2838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      || {
2848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # The rename failed, perhaps because mv can't rename something else
2858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # to itself, or perhaps because mv is so ancient that it does not
2868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # support -f.
2878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # Now remove or move aside any old file at destination location.
2898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # We try this two ways since rm can't unlink itself on some
2908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # systems and the destination file might be busy for other
2918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # reasons.  In this case, the final cleanup might fail but the new
2928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # file should still install successfully.
2938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   {
2948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	     if test -f "$dstdir/$dstfile"; then
2958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
2968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
2978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	       || {
2988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
2998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels		 (exit 1); exit 1
3008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	       }
3018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	     else
3028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	       :
3038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	     fi
3048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   } &&
3058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   # Now rename the file to the real destination.
3078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
3088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	 }
3098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
3108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  fi || { (exit 1); exit 1; }
3118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdone
3128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# The final little trick to "correctly" pass the exit status to the exit trap.
3148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels{
3158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  (exit 0); exit 0
3168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
3178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Local variables:
3198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# eval: (add-hook 'write-file-hooks 'time-stamp)
3208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-start: "scriptversion="
3218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-format: "%:y-%02m-%02d.%02H"
3228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-end: "$"
3238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# End:
324