1548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#!/bin/sh
2548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# install - install a program, script, or datafile
3548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
4548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenscriptversion=2009-04-28.21; # UTC
5548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
6548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# This originates from X11R5 (mit/util/scripts/install.sh), which was
7548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# later released in X11R6 (xc/config/util/install.sh) with the
8548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# following copyright and license.
9548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
10548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Copyright (C) 1994 X Consortium
11548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
12548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Permission is hereby granted, free of charge, to any person obtaining a copy
13548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# of this software and associated documentation files (the "Software"), to
14548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# deal in the Software without restriction, including without limitation the
15548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# sell copies of the Software, and to permit persons to whom the Software is
17548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# furnished to do so, subject to the following conditions:
18548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
19548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# The above copyright notice and this permission notice shall be included in
20548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# all copies or substantial portions of the Software.
21548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
22548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
29548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Except as contained in this notice, the name of the X Consortium shall not
30548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# be used in advertising or otherwise to promote the sale, use or other deal-
31548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# ings in this Software without prior written authorization from the X Consor-
32548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# tium.
33548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
34548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
35548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# FSF changes to this file are in the public domain.
36548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
37548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Calling this script install-sh is preferred over install.sh, to prevent
38548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# `make' implicit rules from creating a file called install from it
39548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# when there is no Makefile.
40548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#
41548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# This script is compatible with the BSD install script, but was written
42548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# from scratch.
43548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
44548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissennl='
45548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen'
46548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIFS=" ""	$nl"
47548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
48548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# set DOITPROG to echo to test this script
49548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
50548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Don't use :- since 4.3BSD and earlier shells don't like it.
51548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendoit=${DOITPROG-}
52548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test -z "$doit"; then
53548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  doit_exec=exec
54548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenelse
55548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  doit_exec=$doit
56548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi
57548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
58548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Put in absolute file names if you don't have them in your path;
59548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# or use environment vars.
60548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
61548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchgrpprog=${CHGRPPROG-chgrp}
62548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchmodprog=${CHMODPROG-chmod}
63548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchownprog=${CHOWNPROG-chown}
64548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissencmpprog=${CMPPROG-cmp}
65548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissencpprog=${CPPROG-cp}
66548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmkdirprog=${MKDIRPROG-mkdir}
67548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmvprog=${MVPROG-mv}
68548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenrmprog=${RMPROG-rm}
69548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstripprog=${STRIPPROG-strip}
70548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
71548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenposix_glob='?'
72548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelisseninitialize_posix_glob='
73548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  test "$posix_glob" != "?" || {
74548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if (set -f) 2>/dev/null; then
75548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      posix_glob=
76548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    else
77548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      posix_glob=:
78548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    fi
79548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  }
80548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen'
81548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
82548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenposix_mkdir=
83548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
84548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Desired mode of installed file.
85548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmode=0755
86548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
87548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchgrpcmd=
88548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchmodcmd=$chmodprog
89548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenchowncmd=
90548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenmvcmd=$mvprog
91548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenrmcmd="$rmprog -f"
92548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstripcmd=
93548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
94548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissensrc=
95548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendst=
96548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendir_arg=
97548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendst_arg=
98548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
99548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissencopy_on_change=false
100548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenno_target_directory=
101548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
102548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenusage="\
103548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen   or: $0 [OPTION]... SRCFILES... DIRECTORY
105548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen   or: $0 [OPTION]... -d DIRECTORIES...
107548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
108548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIn the 1st form, copy SRCFILE to DSTFILE.
109548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
110548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenIn the 4th, create DIRECTORIES.
111548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
112548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenOptions:
113548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen     --help     display this help and exit.
114548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen     --version  display version info and exit.
115548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
116548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -c            (ignored)
117548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -C            install only if different (preserve the last data modification time)
118548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -d            create directories instead of installing files.
119548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -g GROUP      $chgrpprog installed files to GROUP.
120548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -m MODE       $chmodprog installed files to MODE.
121548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -o USER       $chownprog installed files to USER.
122548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -s            $stripprog installed files.
123548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -t DIRECTORY  install into DIRECTORY.
124548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  -T            report an error if DSTFILE is a directory.
125548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
126548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenEnvironment variables override the default commands:
127548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
128548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  RMPROG STRIPPROG
129548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen"
130548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
131548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenwhile test $# -ne 0; do
132548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  case $1 in
133548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -c) ;;
134548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
135548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -C) copy_on_change=true;;
136548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
137548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -d) dir_arg=true;;
138548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
139548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -g) chgrpcmd="$chgrpprog $2"
140548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	shift;;
141548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
142548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    --help) echo "$usage"; exit $?;;
143548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
144548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -m) mode=$2
145548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	case $mode in
146548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  *' '* | *'	'* | *'
147548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen'*	  | *'*'* | *'?'* | *'['*)
148548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    echo "$0: invalid mode: $mode" >&2
149548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    exit 1;;
150548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	esac
151548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	shift;;
152548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
153548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -o) chowncmd="$chownprog $2"
154548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	shift;;
155548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
156548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -s) stripcmd=$stripprog;;
157548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
158548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -t) dst_arg=$2
159548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	shift;;
160548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
161548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -T) no_target_directory=true;;
162548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
163548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    --version) echo "$0 $scriptversion"; exit $?;;
164548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
165548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    --)	shift
166548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	break;;
167548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
168548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -*)	echo "$0: invalid option: $1" >&2
169548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	exit 1;;
170548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
171548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    *)  break;;
172548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  esac
173548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  shift
174548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendone
175548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
176548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # When -d is used, all remaining arguments are directories to create.
178548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # When -t is used, the destination is already specified.
179548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # Otherwise, the last argument is the destination.  Remove it from $@.
180548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  for arg
181548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  do
182548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if test -n "$dst_arg"; then
183548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # $@ is not empty: it contains at least $arg.
184548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      set fnord "$@" "$dst_arg"
185548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      shift # fnord
186548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    fi
187548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    shift # arg
188548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    dst_arg=$arg
189548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  done
190548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi
191548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
192548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test $# -eq 0; then
193548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  if test -z "$dir_arg"; then
194548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    echo "$0: no input file specified." >&2
195548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exit 1
196548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  fi
197548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # It's OK to call `install-sh -d' without argument.
198548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # This can happen when creating conditional directories.
199548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  exit 0
200548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi
201548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
202548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenif test -z "$dir_arg"; then
203548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  trap '(exit $?); exit' 1 2 13 15
204548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
205548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # Set umask so as not to create temps with too-generous modes.
206548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # However, 'strip' requires both read and write access to temps.
207548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  case $mode in
208548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # Optimize common cases.
209548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    *644) cp_umask=133;;
210548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    *755) cp_umask=22;;
211548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
212548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    *[0-7])
213548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      if test -z "$stripcmd"; then
214548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	u_plus_rw=
215548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      else
216548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	u_plus_rw='% 200'
217548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      fi
218548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
219548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    *)
220548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      if test -z "$stripcmd"; then
221548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	u_plus_rw=
222548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      else
223548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	u_plus_rw=,u+rw
224548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      fi
225548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      cp_umask=$mode$u_plus_rw;;
226548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  esac
227548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfi
228548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
229548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenfor src
230548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendo
231548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  # Protect names starting with `-'.
232548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  case $src in
233548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    -*) src=./$src;;
234548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  esac
235548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
236548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  if test -n "$dir_arg"; then
237548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    dst=$src
238548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    dstdir=$dst
239548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    test -d "$dstdir"
240548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    dstdir_status=$?
241548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  else
242548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
243548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
244548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # might cause directories to be created, which would be especially bad
245548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # if $src (and thus $dsttmp) contains '*'.
246548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if test ! -f "$src" && test ! -d "$src"; then
247548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      echo "$0: $src does not exist." >&2
248548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      exit 1
249548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    fi
250548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
251548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if test -z "$dst_arg"; then
252548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      echo "$0: no destination specified." >&2
253548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      exit 1
254548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    fi
255548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
256548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    dst=$dst_arg
257548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # Protect names starting with `-'.
258548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    case $dst in
259548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      -*) dst=./$dst;;
260548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    esac
261548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
262548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # If destination is a directory, append the input filename; won't work
263548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # if double slashes aren't ignored.
264548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if test -d "$dst"; then
265548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      if test -n "$no_target_directory"; then
266548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	echo "$0: $dst_arg: Is a directory" >&2
267548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	exit 1
268548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      fi
269548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      dstdir=$dst
270548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      dst=$dstdir/`basename "$src"`
271548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      dstdir_status=0
272548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    else
273548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # Prefer dirname, but fall back on a substitute if dirname fails.
274548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      dstdir=`
275548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	(dirname "$dst") 2>/dev/null ||
276548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
277548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	     X"$dst" : 'X\(//\)[^/]' \| \
278548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	     X"$dst" : 'X\(//\)$' \| \
279548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
280548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	echo X"$dst" |
281548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
282548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   s//\1/
283548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   q
284548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 }
285548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 /^X\(\/\/\)[^/].*/{
286548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   s//\1/
287548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   q
288548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 }
289548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 /^X\(\/\/\)$/{
290548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   s//\1/
291548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   q
292548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 }
293548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 /^X\(\/\).*/{
294548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   s//\1/
295548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   q
296548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 }
297548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 s/.*/./; q'
298548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      `
299548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
300548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      test -d "$dstdir"
301548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      dstdir_status=$?
302548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    fi
303548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  fi
304548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
305548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  obsolete_mkdir_used=false
306548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
307548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  if test $dstdir_status != 0; then
308548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    case $posix_mkdir in
309548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      '')
310548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# Create intermediate dirs using mode 755 as modified by the umask.
311548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# This is like FreeBSD 'install' as of 1997-10-28.
312548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	umask=`umask`
313548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	case $stripcmd.$umask in
314548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  # Optimize common cases.
315548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  *[2367][2367]) mkdir_umask=$umask;;
316548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
317548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
318548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  *[0-7])
319548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    mkdir_umask=`expr $umask + 22 \
320548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      - $umask % 100 % 40 + $umask % 20 \
321548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      - $umask % 10 % 4 + $umask % 2
322548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    `;;
323548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  *) mkdir_umask=$umask,go-w;;
324548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	esac
325548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
326548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# With -d, create the new directory with the user-specified mode.
327548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# Otherwise, rely on $mkdir_umask.
328548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	if test -n "$dir_arg"; then
329548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  mkdir_mode=-m$mode
330548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	else
331548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  mkdir_mode=
332548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	fi
333548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
334548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	posix_mkdir=false
335548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	case $umask in
336548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  *[123567][0-7][0-7])
337548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
338548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
339548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    ;;
340548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  *)
341548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
342548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
343548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
344548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    if (umask $mkdir_umask &&
345548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
346548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    then
347548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      if test -z "$dir_arg" || {
348548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   # Check for POSIX incompatibilities with -m.
349548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
350548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   # other-writeable bit of parent directory when it shouldn't.
351548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
352548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
353548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   case $ls_ld_tmpdir in
354548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		     d????-?r-*) different_mode=700;;
355548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		     d????-?--*) different_mode=755;;
356548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		     *) false;;
357548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   esac &&
358548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
359548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
360548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
361548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		   }
362548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen		 }
363548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      then posix_mkdir=:
364548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      fi
365548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      rmdir "$tmpdir/d" "$tmpdir"
366548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    else
367548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      # Remove any dirs left behind by ancient mkdir implementations.
368548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
369548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    fi
370548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    trap '' 0;;
371548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	esac;;
372548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    esac
373548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
374548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if
375548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      $posix_mkdir && (
376548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	umask $mkdir_umask &&
377548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
378548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      )
379548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    then :
380548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    else
381548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
382548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # The umask is ridiculous, or mkdir does not conform to POSIX,
383548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # or it failed possibly due to a race condition.  Create the
384548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # directory the slow way, step by step, checking for races as we go.
385548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
386548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      case $dstdir in
387548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	/*) prefix='/';;
388548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	-*) prefix='./';;
389548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	*)  prefix='';;
390548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      esac
391548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
392548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      eval "$initialize_posix_glob"
393548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
394548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      oIFS=$IFS
395548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      IFS=/
396548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      $posix_glob set -f
397548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      set fnord $dstdir
398548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      shift
399548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      $posix_glob set +f
400548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      IFS=$oIFS
401548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
402548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      prefixes=
403548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
404548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      for d
405548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      do
406548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	test -z "$d" && continue
407548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
408548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	prefix=$prefix$d
409548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	if test -d "$prefix"; then
410548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  prefixes=
411548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	else
412548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  if $posix_mkdir; then
413548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    (umask=$mkdir_umask &&
414548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
415548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    # Don't fail if two instances are running concurrently.
416548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    test -d "$prefix" || exit 1
417548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  else
418548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    case $prefix in
419548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
420548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	      *) qprefix=$prefix;;
421548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    esac
422548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    prefixes="$prefixes '$qprefix'"
423548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  fi
424548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	fi
425548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	prefix=$prefix/
426548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      done
427548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
428548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      if test -n "$prefixes"; then
429548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# Don't fail if two instances are running concurrently.
430548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	(umask $mkdir_umask &&
431548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	 eval "\$doit_exec \$mkdirprog $prefixes") ||
432548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  test -d "$dstdir" || exit 1
433548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	obsolete_mkdir_used=true
434548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      fi
435548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    fi
436548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  fi
437548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
438548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  if test -n "$dir_arg"; then
439548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
440548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
441548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
442548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
443548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  else
444548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
445548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # Make a couple of temp file names in the proper directory.
446548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    dsttmp=$dstdir/_inst.$$_
447548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    rmtmp=$dstdir/_rm.$$_
448548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
449548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # Trap to clean up those temp files at exit.
450548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
451548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
452548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # Copy the file name to the temp name.
453548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
454548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
455548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # and set any options; do chmod last to preserve setuid bits.
456548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    #
457548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # If any of these fail, we abort the whole thing.  If we want to
458548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # ignore errors from any of these, just make sure not to ignore
459548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # errors from the above "$doit $cpprog $src $dsttmp" command.
460548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    #
461548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
462548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
463548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
464548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
465548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
466548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    # If -C, don't bother to copy if it wouldn't change the file.
467548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if $copy_on_change &&
468548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
469548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
470548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
471548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       eval "$initialize_posix_glob" &&
472548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       $posix_glob set -f &&
473548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       set X $old && old=:$2:$4:$5:$6 &&
474548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       set X $new && new=:$2:$4:$5:$6 &&
475548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       $posix_glob set +f &&
476548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
477548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       test "$old" = "$new" &&
478548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
479548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    then
480548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      rm -f "$dsttmp"
481548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    else
482548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # Rename the file to the real destination.
483548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
484548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
485548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # The rename failed, perhaps because mv can't rename something else
486548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # to itself, or perhaps because mv is so ancient that it does not
487548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      # support -f.
488548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      {
489548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# Now remove or move aside any old file at destination location.
490548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# We try this two ways since rm can't unlink itself on some
491548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# systems and the destination file might be busy for other
492548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# reasons.  In this case, the final cleanup might fail but the new
493548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# file should still install successfully.
494548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	{
495548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  test ! -f "$dst" ||
496548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  $doit $rmcmd -f "$dst" 2>/dev/null ||
497548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
498548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
499548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  } ||
500548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  { echo "$0: cannot unlink or rename $dst" >&2
501548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	    (exit 1); exit 1
502548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	  }
503548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	} &&
504548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
505548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	# Now rename the file to the real destination.
506548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen	$doit $mvcmd "$dsttmp" "$dst"
507548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen      }
508548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    fi || exit 1
509548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
510548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    trap '' 0
511548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen  fi
512548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissendone
513548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
514548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# Local variables:
515548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# eval: (add-hook 'write-file-hooks 'time-stamp)
516548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-start: "scriptversion="
517548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-format: "%:y-%02m-%02d.%02H"
518548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-time-zone: "UTC"
519548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# time-stamp-end: "; # UTC"
520548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen# End:
521