1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#!/bin/sh
2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# install - install a program, script, or datafile
3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonscriptversion=2009-04-28.21; # UTC
5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# This originates from X11R5 (mit/util/scripts/install.sh), which was
7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# later released in X11R6 (xc/config/util/install.sh) with the
8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# following copyright and license.
9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Copyright (C) 1994 X Consortium
11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Permission is hereby granted, free of charge, to any person obtaining a copy
13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# of this software and associated documentation files (the "Software"), to
14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# deal in the Software without restriction, including without limitation the
15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# sell copies of the Software, and to permit persons to whom the Software is
17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# furnished to do so, subject to the following conditions:
18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# The above copyright notice and this permission notice shall be included in
20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# all copies or substantial portions of the Software.
21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Except as contained in this notice, the name of the X Consortium shall not
30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# be used in advertising or otherwise to promote the sale, use or other deal-
31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# ings in this Software without prior written authorization from the X Consor-
32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# tium.
33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# FSF changes to this file are in the public domain.
36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Calling this script install-sh is preferred over install.sh, to prevent
38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# `make' implicit rules from creating a file called install from it
39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# when there is no Makefile.
40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#
41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# This script is compatible with the BSD install script, but was written
42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# from scratch.
43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnl='
45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson'
46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIFS=" ""	$nl"
47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# set DOITPROG to echo to test this script
49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Don't use :- since 4.3BSD and earlier shells don't like it.
51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondoit=${DOITPROG-}
52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test -z "$doit"; then
53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  doit_exec=exec
54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonelse
55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  doit_exec=$doit
56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi
57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Put in absolute file names if you don't have them in your path;
59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# or use environment vars.
60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchgrpprog=${CHGRPPROG-chgrp}
62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchmodprog=${CHMODPROG-chmod}
63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchownprog=${CHOWNPROG-chown}
64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoncmpprog=${CMPPROG-cmp}
65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoncpprog=${CPPROG-cp}
66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmkdirprog=${MKDIRPROG-mkdir}
67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmvprog=${MVPROG-mv}
68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonrmprog=${RMPROG-rm}
69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstripprog=${STRIPPROG-strip}
70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonposix_glob='?'
72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoninitialize_posix_glob='
73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  test "$posix_glob" != "?" || {
74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if (set -f) 2>/dev/null; then
75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      posix_glob=
76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    else
77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      posix_glob=:
78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    fi
79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson'
81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonposix_mkdir=
83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Desired mode of installed file.
85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmode=0755
86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchgrpcmd=
88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchmodcmd=$chmodprog
89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchowncmd=
90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmvcmd=$mvprog
91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonrmcmd="$rmprog -f"
92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstripcmd=
93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonsrc=
95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondst=
96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondir_arg=
97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondst_arg=
98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoncopy_on_change=false
100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonno_target_directory=
101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusage="\
103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson   or: $0 [OPTION]... SRCFILES... DIRECTORY
105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson   or: $0 [OPTION]... -d DIRECTORIES...
107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIn the 1st form, copy SRCFILE to DSTFILE.
109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIn the 4th, create DIRECTORIES.
111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonOptions:
113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson     --help     display this help and exit.
114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson     --version  display version info and exit.
115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -c            (ignored)
117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -C            install only if different (preserve the last data modification time)
118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -d            create directories instead of installing files.
119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -g GROUP      $chgrpprog installed files to GROUP.
120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -m MODE       $chmodprog installed files to MODE.
121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -o USER       $chownprog installed files to USER.
122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -s            $stripprog installed files.
123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -t DIRECTORY  install into DIRECTORY.
124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  -T            report an error if DSTFILE is a directory.
125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonEnvironment variables override the default commands:
127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  RMPROG STRIPPROG
129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson"
130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonwhile test $# -ne 0; do
132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  case $1 in
133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -c) ;;
134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -C) copy_on_change=true;;
136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -d) dir_arg=true;;
138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -g) chgrpcmd="$chgrpprog $2"
140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	shift;;
141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    --help) echo "$usage"; exit $?;;
143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -m) mode=$2
145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	case $mode in
146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  *' '* | *'	'* | *'
147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson'*	  | *'*'* | *'?'* | *'['*)
148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    echo "$0: invalid mode: $mode" >&2
149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    exit 1;;
150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	esac
151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	shift;;
152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -o) chowncmd="$chownprog $2"
154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	shift;;
155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -s) stripcmd=$stripprog;;
157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -t) dst_arg=$2
159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	shift;;
160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -T) no_target_directory=true;;
162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    --version) echo "$0 $scriptversion"; exit $?;;
164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    --)	shift
166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	break;;
167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -*)	echo "$0: invalid option: $1" >&2
169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	exit 1;;
170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    *)  break;;
172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  esac
173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  shift
174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondone
175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # When -d is used, all remaining arguments are directories to create.
178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # When -t is used, the destination is already specified.
179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # Otherwise, the last argument is the destination.  Remove it from $@.
180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  for arg
181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  do
182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if test -n "$dst_arg"; then
183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # $@ is not empty: it contains at least $arg.
184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      set fnord "$@" "$dst_arg"
185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      shift # fnord
186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    fi
187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    shift # arg
188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    dst_arg=$arg
189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  done
190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi
191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test $# -eq 0; then
193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  if test -z "$dir_arg"; then
194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    echo "$0: no input file specified." >&2
195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    exit 1
196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  fi
197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # It's OK to call `install-sh -d' without argument.
198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # This can happen when creating conditional directories.
199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  exit 0
200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi
201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test -z "$dir_arg"; then
203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  trap '(exit $?); exit' 1 2 13 15
204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # Set umask so as not to create temps with too-generous modes.
206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # However, 'strip' requires both read and write access to temps.
207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  case $mode in
208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # Optimize common cases.
209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    *644) cp_umask=133;;
210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    *755) cp_umask=22;;
211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    *[0-7])
213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if test -z "$stripcmd"; then
214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	u_plus_rw=
215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      else
216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	u_plus_rw='% 200'
217f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      fi
218f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
219f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    *)
220f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if test -z "$stripcmd"; then
221f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	u_plus_rw=
222f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      else
223f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	u_plus_rw=,u+rw
224f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      fi
225f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      cp_umask=$mode$u_plus_rw;;
226f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  esac
227f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi
228f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
229f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfor src
230f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondo
231f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  # Protect names starting with `-'.
232f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  case $src in
233f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    -*) src=./$src;;
234f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  esac
235f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
236f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  if test -n "$dir_arg"; then
237f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    dst=$src
238f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    dstdir=$dst
239f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    test -d "$dstdir"
240f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    dstdir_status=$?
241f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  else
242f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
243f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
244f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # might cause directories to be created, which would be especially bad
245f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # if $src (and thus $dsttmp) contains '*'.
246f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if test ! -f "$src" && test ! -d "$src"; then
247f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      echo "$0: $src does not exist." >&2
248f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      exit 1
249f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    fi
250f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
251f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if test -z "$dst_arg"; then
252f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      echo "$0: no destination specified." >&2
253f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      exit 1
254f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    fi
255f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
256f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    dst=$dst_arg
257f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # Protect names starting with `-'.
258f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    case $dst in
259f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      -*) dst=./$dst;;
260f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    esac
261f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
262f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # If destination is a directory, append the input filename; won't work
263f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # if double slashes aren't ignored.
264f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if test -d "$dst"; then
265f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if test -n "$no_target_directory"; then
266f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	echo "$0: $dst_arg: Is a directory" >&2
267f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	exit 1
268f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      fi
269f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      dstdir=$dst
270f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      dst=$dstdir/`basename "$src"`
271f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      dstdir_status=0
272f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    else
273f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # Prefer dirname, but fall back on a substitute if dirname fails.
274f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      dstdir=`
275f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	(dirname "$dst") 2>/dev/null ||
276f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
277f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	     X"$dst" : 'X\(//\)[^/]' \| \
278f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	     X"$dst" : 'X\(//\)$' \| \
279f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
280f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	echo X"$dst" |
281f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
282f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   s//\1/
283f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   q
284f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 }
285f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 /^X\(\/\/\)[^/].*/{
286f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   s//\1/
287f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   q
288f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 }
289f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 /^X\(\/\/\)$/{
290f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   s//\1/
291f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   q
292f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 }
293f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 /^X\(\/\).*/{
294f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   s//\1/
295f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   q
296f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 }
297f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 s/.*/./; q'
298f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      `
299f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
300f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      test -d "$dstdir"
301f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      dstdir_status=$?
302f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    fi
303f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  fi
304f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
305f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  obsolete_mkdir_used=false
306f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
307f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  if test $dstdir_status != 0; then
308f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    case $posix_mkdir in
309f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      '')
310f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# Create intermediate dirs using mode 755 as modified by the umask.
311f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# This is like FreeBSD 'install' as of 1997-10-28.
312f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	umask=`umask`
313f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	case $stripcmd.$umask in
314f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  # Optimize common cases.
315f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  *[2367][2367]) mkdir_umask=$umask;;
316f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
317f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
318f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  *[0-7])
319f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    mkdir_umask=`expr $umask + 22 \
320f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      - $umask % 100 % 40 + $umask % 20 \
321f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      - $umask % 10 % 4 + $umask % 2
322f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    `;;
323f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  *) mkdir_umask=$umask,go-w;;
324f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	esac
325f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
326f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# With -d, create the new directory with the user-specified mode.
327f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# Otherwise, rely on $mkdir_umask.
328f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	if test -n "$dir_arg"; then
329f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  mkdir_mode=-m$mode
330f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	else
331f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  mkdir_mode=
332f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	fi
333f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
334f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	posix_mkdir=false
335f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	case $umask in
336f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  *[123567][0-7][0-7])
337f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
338f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
339f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    ;;
340f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  *)
341f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
342f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
343f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
344f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    if (umask $mkdir_umask &&
345f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
346f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    then
347f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      if test -z "$dir_arg" || {
348f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   # Check for POSIX incompatibilities with -m.
349f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
350f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   # other-writeable bit of parent directory when it shouldn't.
351f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
352f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
353f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   case $ls_ld_tmpdir in
354f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		     d????-?r-*) different_mode=700;;
355f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		     d????-?--*) different_mode=755;;
356f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		     *) false;;
357f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   esac &&
358f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
359f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
360f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
361f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		   }
362f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson		 }
363f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      then posix_mkdir=:
364f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      fi
365f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      rmdir "$tmpdir/d" "$tmpdir"
366f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    else
367f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      # Remove any dirs left behind by ancient mkdir implementations.
368f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
369f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    fi
370f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    trap '' 0;;
371f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	esac;;
372f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    esac
373f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
374f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if
375f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      $posix_mkdir && (
376f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	umask $mkdir_umask &&
377f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
378f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      )
379f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    then :
380f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    else
381f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
382f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # The umask is ridiculous, or mkdir does not conform to POSIX,
383f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # or it failed possibly due to a race condition.  Create the
384f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # directory the slow way, step by step, checking for races as we go.
385f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
386f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      case $dstdir in
387f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	/*) prefix='/';;
388f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	-*) prefix='./';;
389f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	*)  prefix='';;
390f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      esac
391f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
392f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      eval "$initialize_posix_glob"
393f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
394f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      oIFS=$IFS
395f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      IFS=/
396f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      $posix_glob set -f
397f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      set fnord $dstdir
398f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      shift
399f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      $posix_glob set +f
400f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      IFS=$oIFS
401f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
402f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      prefixes=
403f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
404f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      for d
405f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      do
406f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	test -z "$d" && continue
407f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
408f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	prefix=$prefix$d
409f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	if test -d "$prefix"; then
410f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  prefixes=
411f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	else
412f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  if $posix_mkdir; then
413f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    (umask=$mkdir_umask &&
414f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
415f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    # Don't fail if two instances are running concurrently.
416f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    test -d "$prefix" || exit 1
417f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  else
418f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    case $prefix in
419f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
420f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	      *) qprefix=$prefix;;
421f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    esac
422f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    prefixes="$prefixes '$qprefix'"
423f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  fi
424f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	fi
425f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	prefix=$prefix/
426f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      done
427f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
428f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if test -n "$prefixes"; then
429f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# Don't fail if two instances are running concurrently.
430f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	(umask $mkdir_umask &&
431f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	 eval "\$doit_exec \$mkdirprog $prefixes") ||
432f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  test -d "$dstdir" || exit 1
433f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	obsolete_mkdir_used=true
434f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      fi
435f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    fi
436f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  fi
437f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
438f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  if test -n "$dir_arg"; then
439f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
440f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
441f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
442f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
443f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  else
444f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
445f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # Make a couple of temp file names in the proper directory.
446f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    dsttmp=$dstdir/_inst.$$_
447f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    rmtmp=$dstdir/_rm.$$_
448f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
449f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # Trap to clean up those temp files at exit.
450f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
451f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
452f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # Copy the file name to the temp name.
453f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
454f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
455f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # and set any options; do chmod last to preserve setuid bits.
456f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    #
457f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # If any of these fail, we abort the whole thing.  If we want to
458f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # ignore errors from any of these, just make sure not to ignore
459f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # errors from the above "$doit $cpprog $src $dsttmp" command.
460f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    #
461f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
462f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
463f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
464f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
465f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
466f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    # If -C, don't bother to copy if it wouldn't change the file.
467f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if $copy_on_change &&
468f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
469f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
470f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
471f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       eval "$initialize_posix_glob" &&
472f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       $posix_glob set -f &&
473f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       set X $old && old=:$2:$4:$5:$6 &&
474f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       set X $new && new=:$2:$4:$5:$6 &&
475f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       $posix_glob set +f &&
476f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
477f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       test "$old" = "$new" &&
478f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
479f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    then
480f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      rm -f "$dsttmp"
481f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    else
482f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # Rename the file to the real destination.
483f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
484f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
485f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # The rename failed, perhaps because mv can't rename something else
486f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # to itself, or perhaps because mv is so ancient that it does not
487f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      # support -f.
488f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      {
489f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# Now remove or move aside any old file at destination location.
490f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# We try this two ways since rm can't unlink itself on some
491f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# systems and the destination file might be busy for other
492f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# reasons.  In this case, the final cleanup might fail but the new
493f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# file should still install successfully.
494f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	{
495f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  test ! -f "$dst" ||
496f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  $doit $rmcmd -f "$dst" 2>/dev/null ||
497f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
498f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
499f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  } ||
500f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  { echo "$0: cannot unlink or rename $dst" >&2
501f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	    (exit 1); exit 1
502f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	  }
503f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	} &&
504f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
505f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	# Now rename the file to the real destination.
506f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson	$doit $mvcmd "$dsttmp" "$dst"
507f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      }
508f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    fi || exit 1
509f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
510f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    trap '' 0
511f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  fi
512f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondone
513f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
514f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Local variables:
515f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# eval: (add-hook 'write-file-hooks 'time-stamp)
516f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-start: "scriptversion="
517f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-format: "%:y-%02m-%02d.%02H"
518f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-time-zone: "UTC"
519f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-end: "; # UTC"
520f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# End:
521