comparison install-sh @ 55:77e2b8dfacca gcc-4.4.5

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