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