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