1bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#!/bin/sh
2bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# install - install a program, script, or datafile
3bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
4bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonscriptversion=2005-05-14.22
5bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
6bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# This originates from X11R5 (mit/util/scripts/install.sh), which was
7bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# later released in X11R6 (xc/config/util/install.sh) with the
8bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# following copyright and license.
9bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
10bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# Copyright (C) 1994 X Consortium
11bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
12bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# Permission is hereby granted, free of charge, to any person obtaining a copy
13bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# of this software and associated documentation files (the "Software"), to
14bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# deal in the Software without restriction, including without limitation the
15bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# sell copies of the Software, and to permit persons to whom the Software is
17bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# furnished to do so, subject to the following conditions:
18bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
19bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# The above copyright notice and this permission notice shall be included in
20bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# all copies or substantial portions of the Software.
21bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
22bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
29bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# Except as contained in this notice, the name of the X Consortium shall not
30bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# be used in advertising or otherwise to promote the sale, use or other deal-
31bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# ings in this Software without prior written authorization from the X Consor-
32bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# tium.
33bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
34bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
35bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# FSF changes to this file are in the public domain.
36bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
37bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# Calling this script install-sh is preferred over install.sh, to prevent
38bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# `make' implicit rules from creating a file called install from it
39bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# when there is no Makefile.
40bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#
41bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# This script is compatible with the BSD install script, but was written
42bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# from scratch.  It can only install one file at a time, a restriction
43bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# shared with many OS's install programs.
44bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
45bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# set DOITPROG to echo to test this script
46bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
47bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# Don't use :- since 4.3BSD and earlier shells don't like it.
48bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsondoit="${DOITPROG-}"
49bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
50bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# put in absolute paths if you don't have them in your path; or use env. vars.
51bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
52bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonmvprog="${MVPROG-mv}"
53bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsoncpprog="${CPPROG-cp}"
54bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonchmodprog="${CHMODPROG-chmod}"
55bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonchownprog="${CHOWNPROG-chown}"
56bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonchgrpprog="${CHGRPPROG-chgrp}"
57bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonstripprog="${STRIPPROG-strip}"
58bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonrmprog="${RMPROG-rm}"
59bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonmkdirprog="${MKDIRPROG-mkdir}"
60bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
61bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonchmodcmd="$chmodprog 0755"
62bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonchowncmd=
63bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonchgrpcmd=
64bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonstripcmd=
65bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonrmcmd="$rmprog -f"
66bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonmvcmd="$mvprog"
67bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonsrc=
68bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsondst=
69bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsondir_arg=
70bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsondstarg=
71bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonno_target_directory=
72bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
73bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
74bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson   or: $0 [OPTION]... SRCFILES... DIRECTORY
75bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
76bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson   or: $0 [OPTION]... -d DIRECTORIES...
77bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
78bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee WilsonIn the 1st form, copy SRCFILE to DSTFILE.
79bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee WilsonIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
80bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee WilsonIn the 4th, create DIRECTORIES.
81bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
82bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee WilsonOptions:
83bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-c         (ignored)
84bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-d         create directories instead of installing files.
85bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-g GROUP   $chgrpprog installed files to GROUP.
86bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-m MODE    $chmodprog installed files to MODE.
87bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-o USER    $chownprog installed files to USER.
88bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-s         $stripprog installed files.
89bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-t DIRECTORY  install into DIRECTORY.
90bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson-T         report an error if DSTFILE is a directory.
91bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson--help     display this help and exit.
92bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson--version  display version info and exit.
93bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
94bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee WilsonEnvironment variables override the default commands:
95bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
96bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson"
97bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
98bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonwhile test -n "$1"; do
99bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  case $1 in
100bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -c) shift
101bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        continue;;
102bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
103bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -d) dir_arg=true
104bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
105bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        continue;;
106bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
107bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -g) chgrpcmd="$chgrpprog $2"
108bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
109bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
110bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        continue;;
111bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
112bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    --help) echo "$usage"; exit $?;;
113bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
114bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -m) chmodcmd="$chmodprog $2"
115bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
116bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
117bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        continue;;
118bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
119bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -o) chowncmd="$chownprog $2"
120bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
121bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
122bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        continue;;
123bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
124bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -s) stripcmd=$stripprog
125bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        shift
126bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        continue;;
127bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
128bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -t) dstarg=$2
129bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	shift
130bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	shift
131bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	continue;;
132bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
133bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -T) no_target_directory=true
134bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	shift
135bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	continue;;
136bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
137bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    --version) echo "$0 $scriptversion"; exit $?;;
138bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
139bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    *)  # When -d is used, all remaining arguments are directories to create.
140bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	# When -t is used, the destination is already specified.
141bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	test -n "$dir_arg$dstarg" && break
142bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        # Otherwise, the last argument is the destination.  Remove it from $@.
143bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	for arg
144bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	do
145bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson          if test -n "$dstarg"; then
146bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	    # $@ is not empty: it contains at least $arg.
147bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	    set fnord "$@" "$dstarg"
148bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	    shift # fnord
149bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	  fi
150bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	  shift # arg
151bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	  dstarg=$arg
152bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	done
153bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	break;;
154bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  esac
155bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsondone
156bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
157bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonif test -z "$1"; then
158bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  if test -z "$dir_arg"; then
159bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    echo "$0: no input file specified." >&2
160bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    exit 1
161bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  fi
162bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  # It's OK to call `install-sh -d' without argument.
163bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  # This can happen when creating conditional directories.
164bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  exit 0
165bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonfi
166bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
167bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonfor src
168bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsondo
169bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  # Protect names starting with `-'.
170bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  case $src in
171bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    -*) src=./$src ;;
172bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  esac
173bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
174bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  if test -n "$dir_arg"; then
175bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    dst=$src
176bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    src=
177bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
178bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    if test -d "$dst"; then
179bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      mkdircmd=:
180bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      chmodcmd=
181bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    else
182bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      mkdircmd=$mkdirprog
183bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    fi
184bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  else
185bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
186bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # might cause directories to be created, which would be especially bad
187bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # if $src (and thus $dsttmp) contains '*'.
188bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    if test ! -f "$src" && test ! -d "$src"; then
189bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      echo "$0: $src does not exist." >&2
190bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      exit 1
191bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    fi
192bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
193bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    if test -z "$dstarg"; then
194bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      echo "$0: no destination specified." >&2
195bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      exit 1
196bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    fi
197bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
198bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    dst=$dstarg
199bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # Protect names starting with `-'.
200bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    case $dst in
201bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      -*) dst=./$dst ;;
202bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    esac
203bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
204bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # If destination is a directory, append the input filename; won't work
205bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # if double slashes aren't ignored.
206bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    if test -d "$dst"; then
207bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      if test -n "$no_target_directory"; then
208bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	echo "$0: $dstarg: Is a directory" >&2
209bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	exit 1
210bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      fi
211bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      dst=$dst/`basename "$src"`
212bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    fi
213bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  fi
214bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
215bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  # This sed command emulates the dirname command.
216bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
217bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
218bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  # Make sure that the destination directory exists.
219bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
220bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  # Skip lots of stat calls in the usual case.
221bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  if test ! -d "$dstdir"; then
222bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    defaultIFS='
223bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	 '
224bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    IFS="${IFS-$defaultIFS}"
225bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
226bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    oIFS=$IFS
227bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # Some sh's can't handle IFS=/ for some reason.
228bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    IFS='%'
229bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
230bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    shift
231bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    IFS=$oIFS
232bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
233bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    pathcomp=
234bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
235bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    while test $# -ne 0 ; do
236bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      pathcomp=$pathcomp$1
237bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      shift
238bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      if test ! -d "$pathcomp"; then
239bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson        $mkdirprog "$pathcomp"
240bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	# mkdir can fail with a `File exist' error in case several
241bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	# install-sh are creating the directory concurrently.  This
242bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	# is OK.
243bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	test -d "$pathcomp" || exit
244bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      fi
245bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      pathcomp=$pathcomp/
246bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    done
247bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  fi
248bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
249bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  if test -n "$dir_arg"; then
250bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    $doit $mkdircmd "$dst" \
251bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
252bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
253bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
254bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
255bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
256bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  else
257bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    dstfile=`basename "$dst"`
258bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
259bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # Make a couple of temp file names in the proper directory.
260bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    dsttmp=$dstdir/_inst.$$_
261bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    rmtmp=$dstdir/_rm.$$_
262bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
263bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # Trap to clean up those temp files at exit.
264bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
265bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    trap '(exit $?); exit' 1 2 13 15
266bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
267bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # Copy the file name to the temp name.
268bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    $doit $cpprog "$src" "$dsttmp" &&
269bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
270bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # and set any options; do chmod last to preserve setuid bits.
271bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    #
272bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # If any of these fail, we abort the whole thing.  If we want to
273bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # ignore errors from any of these, just make sure not to ignore
274bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # errors from the above "$doit $cpprog $src $dsttmp" command.
275bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    #
276bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
277bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
278bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
279bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
280bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
281bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    # Now rename the file to the real destination.
282bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
283bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      || {
284bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # The rename failed, perhaps because mv can't rename something else
285bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # to itself, or perhaps because mv is so ancient that it does not
286bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # support -f.
287bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
288bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # Now remove or move aside any old file at destination location.
289bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # We try this two ways since rm can't unlink itself on some
290bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # systems and the destination file might be busy for other
291bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # reasons.  In this case, the final cleanup might fail but the new
292bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # file should still install successfully.
293bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   {
294bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	     if test -f "$dstdir/$dstfile"; then
295bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
296bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
297bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	       || {
298bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
299bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson		 (exit 1); exit 1
300bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	       }
301bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	     else
302bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	       :
303bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	     fi
304bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   } &&
305bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
306bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   # Now rename the file to the real destination.
307bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
308bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	 }
309bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    }
310bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  fi || { (exit 1); exit 1; }
311bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsondone
312bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
313bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# The final little trick to "correctly" pass the exit status to the exit trap.
314bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson{
315bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  (exit 0); exit 0
316bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson}
317bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
318bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# Local variables:
319bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# eval: (add-hook 'write-file-hooks 'time-stamp)
320bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# time-stamp-start: "scriptversion="
321bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# time-stamp-format: "%:y-%02m-%02d.%02H"
322bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# time-stamp-end: "$"
323bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson# End:
324