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