xref: /freebsd/contrib/ncurses/install-sh (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
10e3d5408SPeter Wemm#!/bin/sh
20e3d5408SPeter Wemm# install - install a program, script, or datafile
3*21817992SBaptiste Daroussin
4*21817992SBaptiste Daroussinscriptversion=2020-11-14.01; # UTC
5*21817992SBaptiste Daroussin
65ca44d1cSRong-En Fan# This originates from X11R5 (mit/util/scripts/install.sh), which was
75ca44d1cSRong-En Fan# later released in X11R6 (xc/config/util/install.sh) with the
85ca44d1cSRong-En Fan# following copyright and license.
915589c42SPeter Wemm#
105ca44d1cSRong-En Fan# Copyright (C) 1994 X Consortium
115ca44d1cSRong-En Fan#
125ca44d1cSRong-En Fan# Permission is hereby granted, free of charge, to any person obtaining a copy
135ca44d1cSRong-En Fan# of this software and associated documentation files (the "Software"), to
145ca44d1cSRong-En Fan# deal in the Software without restriction, including without limitation the
155ca44d1cSRong-En Fan# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
165ca44d1cSRong-En Fan# sell copies of the Software, and to permit persons to whom the Software is
175ca44d1cSRong-En Fan# furnished to do so, subject to the following conditions:
185ca44d1cSRong-En Fan#
195ca44d1cSRong-En Fan# The above copyright notice and this permission notice shall be included in
205ca44d1cSRong-En Fan# all copies or substantial portions of the Software.
215ca44d1cSRong-En Fan#
225ca44d1cSRong-En Fan# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
235ca44d1cSRong-En Fan# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
245ca44d1cSRong-En Fan# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
255ca44d1cSRong-En Fan# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
265ca44d1cSRong-En Fan# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
275ca44d1cSRong-En Fan# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
285ca44d1cSRong-En Fan#
295ca44d1cSRong-En Fan# Except as contained in this notice, the name of the X Consortium shall not
305ca44d1cSRong-En Fan# be used in advertising or otherwise to promote the sale, use or other deal-
315ca44d1cSRong-En Fan# ings in this Software without prior written authorization from the X Consor-
325ca44d1cSRong-En Fan# tium.
335ca44d1cSRong-En Fan#
345ca44d1cSRong-En Fan#
355ca44d1cSRong-En Fan# FSF changes to this file are in the public domain.
360e3d5408SPeter Wemm#
370e3d5408SPeter Wemm# Calling this script install-sh is preferred over install.sh, to prevent
38*21817992SBaptiste Daroussin# 'make' implicit rules from creating a file called install from it
390e3d5408SPeter Wemm# when there is no Makefile.
400e3d5408SPeter Wemm#
410e3d5408SPeter Wemm# This script is compatible with the BSD install script, but was written
42*21817992SBaptiste Daroussin# from scratch.
430e3d5408SPeter Wemm
44*21817992SBaptiste Daroussintab='	'
45*21817992SBaptiste Daroussinnl='
46*21817992SBaptiste Daroussin'
47*21817992SBaptiste DaroussinIFS=" $tab$nl"
480e3d5408SPeter Wemm
49*21817992SBaptiste Daroussin# Set DOITPROG to "echo" to test this script.
500e3d5408SPeter Wemm
51*21817992SBaptiste Daroussindoit=${DOITPROG-}
52*21817992SBaptiste Daroussindoit_exec=${doit:-exec}
530e3d5408SPeter Wemm
54*21817992SBaptiste Daroussin# Put in absolute file names if you don't have them in your path;
55*21817992SBaptiste Daroussin# or use environment vars.
560e3d5408SPeter Wemm
57*21817992SBaptiste Daroussinchgrpprog=${CHGRPPROG-chgrp}
58*21817992SBaptiste Daroussinchmodprog=${CHMODPROG-chmod}
59*21817992SBaptiste Daroussinchownprog=${CHOWNPROG-chown}
60*21817992SBaptiste Daroussincmpprog=${CMPPROG-cmp}
61*21817992SBaptiste Daroussincpprog=${CPPROG-cp}
62*21817992SBaptiste Daroussinmkdirprog=${MKDIRPROG-mkdir}
63*21817992SBaptiste Daroussinmvprog=${MVPROG-mv}
64*21817992SBaptiste Daroussinrmprog=${RMPROG-rm}
65*21817992SBaptiste Daroussinstripprog=${STRIPPROG-strip}
660e3d5408SPeter Wemm
67*21817992SBaptiste Daroussinposix_mkdir=
680e3d5408SPeter Wemm
69*21817992SBaptiste Daroussin# Desired mode of installed file.
70*21817992SBaptiste Daroussinmode=0755
71*21817992SBaptiste Daroussin
72*21817992SBaptiste Daroussin# Create dirs (including intermediate dirs) using mode 755.
73*21817992SBaptiste Daroussin# This is like GNU 'install' as of coreutils 8.32 (2020).
74*21817992SBaptiste Daroussinmkdir_umask=22
75*21817992SBaptiste Daroussin
76*21817992SBaptiste Daroussinbackupsuffix=
77*21817992SBaptiste Daroussinchgrpcmd=
78*21817992SBaptiste Daroussinchmodcmd=$chmodprog
79*21817992SBaptiste Daroussinchowncmd=
80*21817992SBaptiste Daroussinmvcmd=$mvprog
810e3d5408SPeter Wemmrmcmd="$rmprog -f"
82*21817992SBaptiste Daroussinstripcmd=
830e3d5408SPeter Wemm
84*21817992SBaptiste Daroussinsrc=
85*21817992SBaptiste Daroussindst=
86*21817992SBaptiste Daroussindir_arg=
87*21817992SBaptiste Daroussindst_arg=
88*21817992SBaptiste Daroussin
89*21817992SBaptiste Daroussincopy_on_change=false
90*21817992SBaptiste Daroussinis_target_a_directory=possibly
91*21817992SBaptiste Daroussin
92*21817992SBaptiste Daroussinusage="\
93*21817992SBaptiste DaroussinUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
94*21817992SBaptiste Daroussin   or: $0 [OPTION]... SRCFILES... DIRECTORY
95*21817992SBaptiste Daroussin   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
96*21817992SBaptiste Daroussin   or: $0 [OPTION]... -d DIRECTORIES...
97*21817992SBaptiste Daroussin
98*21817992SBaptiste DaroussinIn the 1st form, copy SRCFILE to DSTFILE.
99*21817992SBaptiste DaroussinIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
100*21817992SBaptiste DaroussinIn the 4th, create DIRECTORIES.
101*21817992SBaptiste Daroussin
102*21817992SBaptiste DaroussinOptions:
103*21817992SBaptiste Daroussin     --help     display this help and exit.
104*21817992SBaptiste Daroussin     --version  display version info and exit.
105*21817992SBaptiste Daroussin
106*21817992SBaptiste Daroussin  -c            (ignored)
107*21817992SBaptiste Daroussin  -C            install only if different (preserve data modification time)
108*21817992SBaptiste Daroussin  -d            create directories instead of installing files.
109*21817992SBaptiste Daroussin  -g GROUP      $chgrpprog installed files to GROUP.
110*21817992SBaptiste Daroussin  -m MODE       $chmodprog installed files to MODE.
111*21817992SBaptiste Daroussin  -o USER       $chownprog installed files to USER.
112*21817992SBaptiste Daroussin  -p            pass -p to $cpprog.
113*21817992SBaptiste Daroussin  -s            $stripprog installed files.
114*21817992SBaptiste Daroussin  -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.
115*21817992SBaptiste Daroussin  -t DIRECTORY  install into DIRECTORY.
116*21817992SBaptiste Daroussin  -T            report an error if DSTFILE is a directory.
117*21817992SBaptiste Daroussin
118*21817992SBaptiste DaroussinEnvironment variables override the default commands:
119*21817992SBaptiste Daroussin  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
120*21817992SBaptiste Daroussin  RMPROG STRIPPROG
121*21817992SBaptiste Daroussin
122*21817992SBaptiste DaroussinBy default, rm is invoked with -f; when overridden with RMPROG,
123*21817992SBaptiste Daroussinit's up to you to specify -f if you want it.
124*21817992SBaptiste Daroussin
125*21817992SBaptiste DaroussinIf -S is not specified, no backups are attempted.
126*21817992SBaptiste Daroussin
127*21817992SBaptiste DaroussinEmail bug reports to bug-automake@gnu.org.
128*21817992SBaptiste DaroussinAutomake home page: https://www.gnu.org/software/automake/
129*21817992SBaptiste Daroussin"
130*21817992SBaptiste Daroussin
131*21817992SBaptiste Daroussinwhile test $# -ne 0; do
1320e3d5408SPeter Wemm  case $1 in
133*21817992SBaptiste Daroussin    -c) ;;
1340e3d5408SPeter Wemm
135*21817992SBaptiste Daroussin    -C) copy_on_change=true;;
1360e3d5408SPeter Wemm
137*21817992SBaptiste Daroussin    -d) dir_arg=true;;
1380e3d5408SPeter Wemm
1390e3d5408SPeter Wemm    -g) chgrpcmd="$chgrpprog $2"
140*21817992SBaptiste Daroussin        shift;;
1410e3d5408SPeter Wemm
142*21817992SBaptiste Daroussin    --help) echo "$usage"; exit $?;;
1430e3d5408SPeter Wemm
144*21817992SBaptiste Daroussin    -m) mode=$2
145*21817992SBaptiste Daroussin        case $mode in
146*21817992SBaptiste Daroussin          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
147*21817992SBaptiste Daroussin            echo "$0: invalid mode: $mode" >&2
148*21817992SBaptiste Daroussin            exit 1;;
149*21817992SBaptiste Daroussin        esac
150*21817992SBaptiste Daroussin        shift;;
1510e3d5408SPeter Wemm
152*21817992SBaptiste Daroussin    -o) chowncmd="$chownprog $2"
153*21817992SBaptiste Daroussin        shift;;
1540e3d5408SPeter Wemm
155*21817992SBaptiste Daroussin    -p) cpprog="$cpprog -p";;
156*21817992SBaptiste Daroussin
157*21817992SBaptiste Daroussin    -s) stripcmd=$stripprog;;
158*21817992SBaptiste Daroussin
159*21817992SBaptiste Daroussin    -S) backupsuffix="$2"
160*21817992SBaptiste Daroussin        shift;;
161*21817992SBaptiste Daroussin
162*21817992SBaptiste Daroussin    -t)
163*21817992SBaptiste Daroussin        is_target_a_directory=always
164*21817992SBaptiste Daroussin        dst_arg=$2
165*21817992SBaptiste Daroussin        # Protect names problematic for 'test' and other utilities.
166*21817992SBaptiste Daroussin        case $dst_arg in
167*21817992SBaptiste Daroussin          -* | [=\(\)!]) dst_arg=./$dst_arg;;
168*21817992SBaptiste Daroussin        esac
169*21817992SBaptiste Daroussin        shift;;
170*21817992SBaptiste Daroussin
171*21817992SBaptiste Daroussin    -T) is_target_a_directory=never;;
172*21817992SBaptiste Daroussin
173*21817992SBaptiste Daroussin    --version) echo "$0 $scriptversion"; exit $?;;
174*21817992SBaptiste Daroussin
175*21817992SBaptiste Daroussin    --) shift
176*21817992SBaptiste Daroussin        break;;
177*21817992SBaptiste Daroussin
178*21817992SBaptiste Daroussin    -*) echo "$0: invalid option: $1" >&2
179*21817992SBaptiste Daroussin        exit 1;;
180*21817992SBaptiste Daroussin
181*21817992SBaptiste Daroussin    *)  break;;
182*21817992SBaptiste Daroussin  esac
183*21817992SBaptiste Daroussin  shift
184*21817992SBaptiste Daroussindone
185*21817992SBaptiste Daroussin
186*21817992SBaptiste Daroussin# We allow the use of options -d and -T together, by making -d
187*21817992SBaptiste Daroussin# take the precedence; this is for compatibility with GNU install.
188*21817992SBaptiste Daroussin
189*21817992SBaptiste Daroussinif test -n "$dir_arg"; then
190*21817992SBaptiste Daroussin  if test -n "$dst_arg"; then
191*21817992SBaptiste Daroussin    echo "$0: target directory not allowed when installing a directory." >&2
192*21817992SBaptiste Daroussin    exit 1
1930e3d5408SPeter Wemm  fi
194*21817992SBaptiste Daroussinfi
195*21817992SBaptiste Daroussin
196*21817992SBaptiste Daroussinif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
197*21817992SBaptiste Daroussin  # When -d is used, all remaining arguments are directories to create.
198*21817992SBaptiste Daroussin  # When -t is used, the destination is already specified.
199*21817992SBaptiste Daroussin  # Otherwise, the last argument is the destination.  Remove it from $@.
200*21817992SBaptiste Daroussin  for arg
201*21817992SBaptiste Daroussin  do
202*21817992SBaptiste Daroussin    if test -n "$dst_arg"; then
203*21817992SBaptiste Daroussin      # $@ is not empty: it contains at least $arg.
204*21817992SBaptiste Daroussin      set fnord "$@" "$dst_arg"
205*21817992SBaptiste Daroussin      shift # fnord
206*21817992SBaptiste Daroussin    fi
207*21817992SBaptiste Daroussin    shift # arg
208*21817992SBaptiste Daroussin    dst_arg=$arg
209*21817992SBaptiste Daroussin    # Protect names problematic for 'test' and other utilities.
210*21817992SBaptiste Daroussin    case $dst_arg in
211*21817992SBaptiste Daroussin      -* | [=\(\)!]) dst_arg=./$dst_arg;;
2120e3d5408SPeter Wemm    esac
2130e3d5408SPeter Wemm  done
214*21817992SBaptiste Daroussinfi
2150e3d5408SPeter Wemm
216*21817992SBaptiste Daroussinif test $# -eq 0; then
217*21817992SBaptiste Daroussin  if test -z "$dir_arg"; then
218*21817992SBaptiste Daroussin    echo "$0: no input file specified." >&2
2190e3d5408SPeter Wemm    exit 1
220*21817992SBaptiste Daroussin  fi
221*21817992SBaptiste Daroussin  # It's OK to call 'install-sh -d' without argument.
222*21817992SBaptiste Daroussin  # This can happen when creating conditional directories.
223*21817992SBaptiste Daroussin  exit 0
2240e3d5408SPeter Wemmfi
2250e3d5408SPeter Wemm
226*21817992SBaptiste Daroussinif test -z "$dir_arg"; then
227*21817992SBaptiste Daroussin  if test $# -gt 1 || test "$is_target_a_directory" = always; then
228*21817992SBaptiste Daroussin    if test ! -d "$dst_arg"; then
229*21817992SBaptiste Daroussin      echo "$0: $dst_arg: Is not a directory." >&2
230*21817992SBaptiste Daroussin      exit 1
231*21817992SBaptiste Daroussin    fi
232*21817992SBaptiste Daroussin  fi
233*21817992SBaptiste Daroussinfi
234*21817992SBaptiste Daroussin
235*21817992SBaptiste Daroussinif test -z "$dir_arg"; then
236*21817992SBaptiste Daroussin  do_exit='(exit $ret); exit $ret'
237*21817992SBaptiste Daroussin  trap "ret=129; $do_exit" 1
238*21817992SBaptiste Daroussin  trap "ret=130; $do_exit" 2
239*21817992SBaptiste Daroussin  trap "ret=141; $do_exit" 13
240*21817992SBaptiste Daroussin  trap "ret=143; $do_exit" 15
241*21817992SBaptiste Daroussin
242*21817992SBaptiste Daroussin  # Set umask so as not to create temps with too-generous modes.
243*21817992SBaptiste Daroussin  # However, 'strip' requires both read and write access to temps.
244*21817992SBaptiste Daroussin  case $mode in
245*21817992SBaptiste Daroussin    # Optimize common cases.
246*21817992SBaptiste Daroussin    *644) cp_umask=133;;
247*21817992SBaptiste Daroussin    *755) cp_umask=22;;
248*21817992SBaptiste Daroussin
249*21817992SBaptiste Daroussin    *[0-7])
250*21817992SBaptiste Daroussin      if test -z "$stripcmd"; then
251*21817992SBaptiste Daroussin        u_plus_rw=
252*21817992SBaptiste Daroussin      else
253*21817992SBaptiste Daroussin        u_plus_rw='% 200'
254*21817992SBaptiste Daroussin      fi
255*21817992SBaptiste Daroussin      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
256*21817992SBaptiste Daroussin    *)
257*21817992SBaptiste Daroussin      if test -z "$stripcmd"; then
258*21817992SBaptiste Daroussin        u_plus_rw=
259*21817992SBaptiste Daroussin      else
260*21817992SBaptiste Daroussin        u_plus_rw=,u+rw
261*21817992SBaptiste Daroussin      fi
262*21817992SBaptiste Daroussin      cp_umask=$mode$u_plus_rw;;
263*21817992SBaptiste Daroussin  esac
264*21817992SBaptiste Daroussinfi
265*21817992SBaptiste Daroussin
266*21817992SBaptiste Daroussinfor src
267*21817992SBaptiste Daroussindo
268*21817992SBaptiste Daroussin  # Protect names problematic for 'test' and other utilities.
269*21817992SBaptiste Daroussin  case $src in
270*21817992SBaptiste Daroussin    -* | [=\(\)!]) src=./$src;;
271*21817992SBaptiste Daroussin  esac
272*21817992SBaptiste Daroussin
273*21817992SBaptiste Daroussin  if test -n "$dir_arg"; then
2740e3d5408SPeter Wemm    dst=$src
275*21817992SBaptiste Daroussin    dstdir=$dst
276*21817992SBaptiste Daroussin    test -d "$dstdir"
277*21817992SBaptiste Daroussin    dstdir_status=$?
278*21817992SBaptiste Daroussin    # Don't chown directories that already exist.
279*21817992SBaptiste Daroussin    if test $dstdir_status = 0; then
280*21817992SBaptiste Daroussin      chowncmd=""
2810e3d5408SPeter Wemm    fi
2820e3d5408SPeter Wemm  else
2830e3d5408SPeter Wemm
284*21817992SBaptiste Daroussin    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
2850e3d5408SPeter Wemm    # might cause directories to be created, which would be especially bad
2860e3d5408SPeter Wemm    # if $src (and thus $dsttmp) contains '*'.
287*21817992SBaptiste Daroussin    if test ! -f "$src" && test ! -d "$src"; then
288*21817992SBaptiste Daroussin      echo "$0: $src does not exist." >&2
2890e3d5408SPeter Wemm      exit 1
2900e3d5408SPeter Wemm    fi
2910e3d5408SPeter Wemm
292*21817992SBaptiste Daroussin    if test -z "$dst_arg"; then
293*21817992SBaptiste Daroussin      echo "$0: no destination specified." >&2
2940e3d5408SPeter Wemm      exit 1
295*21817992SBaptiste Daroussin    fi
296*21817992SBaptiste Daroussin    dst=$dst_arg
297*21817992SBaptiste Daroussin
298*21817992SBaptiste Daroussin    # If destination is a directory, append the input filename.
299*21817992SBaptiste Daroussin    if test -d "$dst"; then
300*21817992SBaptiste Daroussin      if test "$is_target_a_directory" = never; then
301*21817992SBaptiste Daroussin        echo "$0: $dst_arg: Is a directory" >&2
302*21817992SBaptiste Daroussin        exit 1
303*21817992SBaptiste Daroussin      fi
304*21817992SBaptiste Daroussin      dstdir=$dst
305*21817992SBaptiste Daroussin      dstbase=`basename "$src"`
306*21817992SBaptiste Daroussin      case $dst in
307*21817992SBaptiste Daroussin	*/) dst=$dst$dstbase;;
308*21817992SBaptiste Daroussin	*)  dst=$dst/$dstbase;;
309*21817992SBaptiste Daroussin      esac
310*21817992SBaptiste Daroussin      dstdir_status=0
3110e3d5408SPeter Wemm    else
312*21817992SBaptiste Daroussin      dstdir=`dirname "$dst"`
313*21817992SBaptiste Daroussin      test -d "$dstdir"
314*21817992SBaptiste Daroussin      dstdir_status=$?
315*21817992SBaptiste Daroussin    fi
3160e3d5408SPeter Wemm  fi
3170e3d5408SPeter Wemm
318*21817992SBaptiste Daroussin  case $dstdir in
319*21817992SBaptiste Daroussin    */) dstdirslash=$dstdir;;
320*21817992SBaptiste Daroussin    *)  dstdirslash=$dstdir/;;
321*21817992SBaptiste Daroussin  esac
3220e3d5408SPeter Wemm
323*21817992SBaptiste Daroussin  obsolete_mkdir_used=false
324*21817992SBaptiste Daroussin
325*21817992SBaptiste Daroussin  if test $dstdir_status != 0; then
326*21817992SBaptiste Daroussin    case $posix_mkdir in
327*21817992SBaptiste Daroussin      '')
328*21817992SBaptiste Daroussin        # With -d, create the new directory with the user-specified mode.
329*21817992SBaptiste Daroussin        # Otherwise, rely on $mkdir_umask.
330*21817992SBaptiste Daroussin        if test -n "$dir_arg"; then
331*21817992SBaptiste Daroussin          mkdir_mode=-m$mode
332*21817992SBaptiste Daroussin        else
333*21817992SBaptiste Daroussin          mkdir_mode=
334*21817992SBaptiste Daroussin        fi
335*21817992SBaptiste Daroussin
336*21817992SBaptiste Daroussin        posix_mkdir=false
337*21817992SBaptiste Daroussin	# The $RANDOM variable is not portable (e.g., dash).  Use it
338*21817992SBaptiste Daroussin	# here however when possible just to lower collision chance.
339*21817992SBaptiste Daroussin	tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
340*21817992SBaptiste Daroussin
341*21817992SBaptiste Daroussin	trap '
342*21817992SBaptiste Daroussin	  ret=$?
343*21817992SBaptiste Daroussin	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
344*21817992SBaptiste Daroussin	  exit $ret
345*21817992SBaptiste Daroussin	' 0
346*21817992SBaptiste Daroussin
347*21817992SBaptiste Daroussin	# Because "mkdir -p" follows existing symlinks and we likely work
348*21817992SBaptiste Daroussin	# directly in world-writeable /tmp, make sure that the '$tmpdir'
349*21817992SBaptiste Daroussin	# directory is successfully created first before we actually test
350*21817992SBaptiste Daroussin	# 'mkdir -p'.
351*21817992SBaptiste Daroussin	if (umask $mkdir_umask &&
352*21817992SBaptiste Daroussin	    $mkdirprog $mkdir_mode "$tmpdir" &&
353*21817992SBaptiste Daroussin	    exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
3540e3d5408SPeter Wemm	then
355*21817992SBaptiste Daroussin	  if test -z "$dir_arg" || {
356*21817992SBaptiste Daroussin	       # Check for POSIX incompatibilities with -m.
357*21817992SBaptiste Daroussin	       # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
358*21817992SBaptiste Daroussin	       # other-writable bit of parent directory when it shouldn't.
359*21817992SBaptiste Daroussin	       # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
360*21817992SBaptiste Daroussin	       test_tmpdir="$tmpdir/a"
361*21817992SBaptiste Daroussin	       ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
362*21817992SBaptiste Daroussin	       case $ls_ld_tmpdir in
363*21817992SBaptiste Daroussin		 d????-?r-*) different_mode=700;;
364*21817992SBaptiste Daroussin		 d????-?--*) different_mode=755;;
365*21817992SBaptiste Daroussin		 *) false;;
366*21817992SBaptiste Daroussin	       esac &&
367*21817992SBaptiste Daroussin	       $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
368*21817992SBaptiste Daroussin		 ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
369*21817992SBaptiste Daroussin		 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
370*21817992SBaptiste Daroussin	       }
371*21817992SBaptiste Daroussin	     }
372*21817992SBaptiste Daroussin	  then posix_mkdir=:
373*21817992SBaptiste Daroussin	  fi
374*21817992SBaptiste Daroussin	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
3750e3d5408SPeter Wemm	else
376*21817992SBaptiste Daroussin	  # Remove any dirs left behind by ancient mkdir implementations.
377*21817992SBaptiste Daroussin	  rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
3780e3d5408SPeter Wemm	fi
379*21817992SBaptiste Daroussin	trap '' 0;;
380*21817992SBaptiste Daroussin    esac
3810e3d5408SPeter Wemm
382*21817992SBaptiste Daroussin    if
383*21817992SBaptiste Daroussin      $posix_mkdir && (
384*21817992SBaptiste Daroussin        umask $mkdir_umask &&
385*21817992SBaptiste Daroussin        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
386*21817992SBaptiste Daroussin      )
387*21817992SBaptiste Daroussin    then :
388*21817992SBaptiste Daroussin    else
3890e3d5408SPeter Wemm
390*21817992SBaptiste Daroussin      # mkdir does not conform to POSIX,
391*21817992SBaptiste Daroussin      # or it failed possibly due to a race condition.  Create the
392*21817992SBaptiste Daroussin      # directory the slow way, step by step, checking for races as we go.
3930e3d5408SPeter Wemm
394*21817992SBaptiste Daroussin      case $dstdir in
395*21817992SBaptiste Daroussin        /*) prefix='/';;
396*21817992SBaptiste Daroussin        [-=\(\)!]*) prefix='./';;
397*21817992SBaptiste Daroussin        *)  prefix='';;
398*21817992SBaptiste Daroussin      esac
3990e3d5408SPeter Wemm
4005ca44d1cSRong-En Fan      oIFS=$IFS
401*21817992SBaptiste Daroussin      IFS=/
402*21817992SBaptiste Daroussin      set -f
403*21817992SBaptiste Daroussin      set fnord $dstdir
404*21817992SBaptiste Daroussin      shift
405*21817992SBaptiste Daroussin      set +f
4065ca44d1cSRong-En Fan      IFS=$oIFS
4070e3d5408SPeter Wemm
408*21817992SBaptiste Daroussin      prefixes=
4090e3d5408SPeter Wemm
410*21817992SBaptiste Daroussin      for d
411*21817992SBaptiste Daroussin      do
412*21817992SBaptiste Daroussin        test X"$d" = X && continue
4130e3d5408SPeter Wemm
414*21817992SBaptiste Daroussin        prefix=$prefix$d
415*21817992SBaptiste Daroussin        if test -d "$prefix"; then
416*21817992SBaptiste Daroussin          prefixes=
4170e3d5408SPeter Wemm        else
418*21817992SBaptiste Daroussin          if $posix_mkdir; then
419*21817992SBaptiste Daroussin            (umask $mkdir_umask &&
420*21817992SBaptiste Daroussin             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
421*21817992SBaptiste Daroussin            # Don't fail if two instances are running concurrently.
422*21817992SBaptiste Daroussin            test -d "$prefix" || exit 1
423*21817992SBaptiste Daroussin          else
424*21817992SBaptiste Daroussin            case $prefix in
425*21817992SBaptiste Daroussin              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
426*21817992SBaptiste Daroussin              *) qprefix=$prefix;;
427*21817992SBaptiste Daroussin            esac
428*21817992SBaptiste Daroussin            prefixes="$prefixes '$qprefix'"
4290e3d5408SPeter Wemm          fi
430*21817992SBaptiste Daroussin        fi
431*21817992SBaptiste Daroussin        prefix=$prefix/
4320e3d5408SPeter Wemm      done
433*21817992SBaptiste Daroussin
434*21817992SBaptiste Daroussin      if test -n "$prefixes"; then
435*21817992SBaptiste Daroussin        # Don't fail if two instances are running concurrently.
436*21817992SBaptiste Daroussin        (umask $mkdir_umask &&
437*21817992SBaptiste Daroussin         eval "\$doit_exec \$mkdirprog $prefixes") ||
438*21817992SBaptiste Daroussin          test -d "$dstdir" || exit 1
439*21817992SBaptiste Daroussin        obsolete_mkdir_used=true
440*21817992SBaptiste Daroussin      fi
441*21817992SBaptiste Daroussin    fi
4420e3d5408SPeter Wemm  fi
4430e3d5408SPeter Wemm
444*21817992SBaptiste Daroussin  if test -n "$dir_arg"; then
445*21817992SBaptiste Daroussin    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
446*21817992SBaptiste Daroussin    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
447*21817992SBaptiste Daroussin    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
448*21817992SBaptiste Daroussin      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
4490e3d5408SPeter Wemm  else
4500e3d5408SPeter Wemm
4515ca44d1cSRong-En Fan    # Make a couple of temp file names in the proper directory.
452*21817992SBaptiste Daroussin    dsttmp=${dstdirslash}_inst.$$_
453*21817992SBaptiste Daroussin    rmtmp=${dstdirslash}_rm.$$_
4540e3d5408SPeter Wemm
455*21817992SBaptiste Daroussin    # Trap to clean up those temp files at exit.
456*21817992SBaptiste Daroussin    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
4575ca44d1cSRong-En Fan
458*21817992SBaptiste Daroussin    # Copy the file name to the temp name.
459*21817992SBaptiste Daroussin    (umask $cp_umask &&
460*21817992SBaptiste Daroussin     { test -z "$stripcmd" || {
461*21817992SBaptiste Daroussin	 # Create $dsttmp read-write so that cp doesn't create it read-only,
462*21817992SBaptiste Daroussin	 # which would cause strip to fail.
463*21817992SBaptiste Daroussin	 if test -z "$doit"; then
464*21817992SBaptiste Daroussin	   : >"$dsttmp" # No need to fork-exec 'touch'.
465*21817992SBaptiste Daroussin	 else
466*21817992SBaptiste Daroussin	   $doit touch "$dsttmp"
467*21817992SBaptiste Daroussin	 fi
468*21817992SBaptiste Daroussin       }
469*21817992SBaptiste Daroussin     } &&
470*21817992SBaptiste Daroussin     $doit_exec $cpprog "$src" "$dsttmp") &&
4715ca44d1cSRong-En Fan
472*21817992SBaptiste Daroussin    # and set any options; do chmod last to preserve setuid bits.
473*21817992SBaptiste Daroussin    #
4740e3d5408SPeter Wemm    # If any of these fail, we abort the whole thing.  If we want to
4750e3d5408SPeter Wemm    # ignore errors from any of these, just make sure not to ignore
476*21817992SBaptiste Daroussin    # errors from the above "$doit $cpprog $src $dsttmp" command.
477*21817992SBaptiste Daroussin    #
478*21817992SBaptiste Daroussin    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
479*21817992SBaptiste Daroussin    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
480*21817992SBaptiste Daroussin    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
481*21817992SBaptiste Daroussin    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
4820e3d5408SPeter Wemm
483*21817992SBaptiste Daroussin    # If -C, don't bother to copy if it wouldn't change the file.
484*21817992SBaptiste Daroussin    if $copy_on_change &&
485*21817992SBaptiste Daroussin       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
486*21817992SBaptiste Daroussin       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
487*21817992SBaptiste Daroussin       set -f &&
488*21817992SBaptiste Daroussin       set X $old && old=:$2:$4:$5:$6 &&
489*21817992SBaptiste Daroussin       set X $new && new=:$2:$4:$5:$6 &&
490*21817992SBaptiste Daroussin       set +f &&
491*21817992SBaptiste Daroussin       test "$old" = "$new" &&
492*21817992SBaptiste Daroussin       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
4935ca44d1cSRong-En Fan    then
494*21817992SBaptiste Daroussin      rm -f "$dsttmp"
4955ca44d1cSRong-En Fan    else
496*21817992SBaptiste Daroussin      # If $backupsuffix is set, and the file being installed
497*21817992SBaptiste Daroussin      # already exists, attempt a backup.  Don't worry if it fails,
498*21817992SBaptiste Daroussin      # e.g., if mv doesn't support -f.
499*21817992SBaptiste Daroussin      if test -n "$backupsuffix" && test -f "$dst"; then
500*21817992SBaptiste Daroussin        $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
5015ca44d1cSRong-En Fan      fi
502*21817992SBaptiste Daroussin
503*21817992SBaptiste Daroussin      # Rename the file to the real destination.
504*21817992SBaptiste Daroussin      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
505*21817992SBaptiste Daroussin
506*21817992SBaptiste Daroussin      # The rename failed, perhaps because mv can't rename something else
507*21817992SBaptiste Daroussin      # to itself, or perhaps because mv is so ancient that it does not
508*21817992SBaptiste Daroussin      # support -f.
509*21817992SBaptiste Daroussin      {
510*21817992SBaptiste Daroussin        # Now remove or move aside any old file at destination location.
511*21817992SBaptiste Daroussin        # We try this two ways since rm can't unlink itself on some
512*21817992SBaptiste Daroussin        # systems and the destination file might be busy for other
513*21817992SBaptiste Daroussin        # reasons.  In this case, the final cleanup might fail but the new
514*21817992SBaptiste Daroussin        # file should still install successfully.
515*21817992SBaptiste Daroussin        {
516*21817992SBaptiste Daroussin          test ! -f "$dst" ||
517*21817992SBaptiste Daroussin          $doit $rmcmd "$dst" 2>/dev/null ||
518*21817992SBaptiste Daroussin          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
519*21817992SBaptiste Daroussin            { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
520*21817992SBaptiste Daroussin          } ||
521*21817992SBaptiste Daroussin          { echo "$0: cannot unlink or rename $dst" >&2
522*21817992SBaptiste Daroussin            (exit 1); exit 1
523*21817992SBaptiste Daroussin          }
5245ca44d1cSRong-En Fan        } &&
5250e3d5408SPeter Wemm
5260e3d5408SPeter Wemm        # Now rename the file to the real destination.
527*21817992SBaptiste Daroussin        $doit $mvcmd "$dsttmp" "$dst"
5285ca44d1cSRong-En Fan      }
529*21817992SBaptiste Daroussin    fi || exit 1
530*21817992SBaptiste Daroussin
531*21817992SBaptiste Daroussin    trap '' 0
532*21817992SBaptiste Daroussin  fi
533*21817992SBaptiste Daroussindone
534*21817992SBaptiste Daroussin
535*21817992SBaptiste Daroussin# Local variables:
536*21817992SBaptiste Daroussin# eval: (add-hook 'before-save-hook 'time-stamp)
537*21817992SBaptiste Daroussin# time-stamp-start: "scriptversion="
538*21817992SBaptiste Daroussin# time-stamp-format: "%:y-%02m-%02d.%02H"
539*21817992SBaptiste Daroussin# time-stamp-time-zone: "UTC0"
540*21817992SBaptiste Daroussin# time-stamp-end: "; # UTC"
541*21817992SBaptiste Daroussin# End:
542