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