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