|
1 | 1 | #!/bin/sh |
2 | 2 | # install - install a program, script, or datafile |
3 | 3 |
|
4 | | -scriptversion=2013-12-25.23; # UTC |
| 4 | +scriptversion=2018-03-11.20; # UTC |
5 | 5 |
|
6 | 6 | # This originates from X11R5 (mit/util/scripts/install.sh), which was |
7 | 7 | # later released in X11R6 (xc/config/util/install.sh) with the |
|
271 | 271 | fi |
272 | 272 | dst=$dst_arg |
273 | 273 |
|
274 | | - # If destination is a directory, append the input filename; won't work |
275 | | - # if double slashes aren't ignored. |
| 274 | + # If destination is a directory, append the input filename. |
276 | 275 | if test -d "$dst"; then |
277 | 276 | if test "$is_target_a_directory" = never; then |
278 | 277 | echo "$0: $dst_arg: Is a directory" >&2 |
279 | 278 | exit 1 |
280 | 279 | fi |
281 | 280 | dstdir=$dst |
282 | | - dst=$dstdir/`basename "$src"` |
| 281 | + dstbase=`basename "$src"` |
| 282 | + case $dst in |
| 283 | + */) dst=$dst$dstbase;; |
| 284 | + *) dst=$dst/$dstbase;; |
| 285 | + esac |
283 | 286 | dstdir_status=0 |
284 | 287 | else |
285 | 288 | dstdir=`dirname "$dst"` |
|
288 | 291 | fi |
289 | 292 | fi |
290 | 293 |
|
| 294 | + case $dstdir in |
| 295 | + */) dstdirslash=$dstdir;; |
| 296 | + *) dstdirslash=$dstdir/;; |
| 297 | + esac |
| 298 | + |
291 | 299 | obsolete_mkdir_used=false |
292 | 300 |
|
293 | 301 | if test $dstdir_status != 0; then |
|
324 | 332 | # is incompatible with FreeBSD 'install' when (umask & 300) != 0. |
325 | 333 | ;; |
326 | 334 | *) |
| 335 | + # Note that $RANDOM variable is not portable (e.g. dash); Use it |
| 336 | + # here however when possible just to lower collision chance. |
327 | 337 | tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ |
328 | | - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 |
329 | 338 |
|
| 339 | + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 |
| 340 | + |
| 341 | + # Because "mkdir -p" follows existing symlinks and we likely work |
| 342 | + # directly in world-writeable /tmp, make sure that the '$tmpdir' |
| 343 | + # directory is successfully created first before we actually test |
| 344 | + # 'mkdir -p' feature. |
330 | 345 | if (umask $mkdir_umask && |
331 | | - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 |
| 346 | + $mkdirprog $mkdir_mode "$tmpdir" && |
| 347 | + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 |
332 | 348 | then |
333 | 349 | if test -z "$dir_arg" || { |
334 | 350 | # Check for POSIX incompatibilities with -m. |
335 | 351 | # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or |
336 | 352 | # other-writable bit of parent directory when it shouldn't. |
337 | 353 | # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. |
338 | | - ls_ld_tmpdir=`ls -ld "$tmpdir"` |
| 354 | + test_tmpdir="$tmpdir/a" |
| 355 | + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` |
339 | 356 | case $ls_ld_tmpdir in |
340 | 357 | d????-?r-*) different_mode=700;; |
341 | 358 | d????-?--*) different_mode=755;; |
342 | 359 | *) false;; |
343 | 360 | esac && |
344 | | - $mkdirprog -m$different_mode -p -- "$tmpdir" && { |
345 | | - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` |
| 361 | + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { |
| 362 | + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` |
346 | 363 | test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" |
347 | 364 | } |
348 | 365 | } |
349 | 366 | then posix_mkdir=: |
350 | 367 | fi |
351 | | - rmdir "$tmpdir/d" "$tmpdir" |
| 368 | + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" |
352 | 369 | else |
353 | 370 | # Remove any dirs left behind by ancient mkdir implementations. |
354 | | - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null |
| 371 | + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null |
355 | 372 | fi |
356 | 373 | trap '' 0;; |
357 | 374 | esac;; |
|
427 | 444 | else |
428 | 445 |
|
429 | 446 | # Make a couple of temp file names in the proper directory. |
430 | | - dsttmp=$dstdir/_inst.$$_ |
431 | | - rmtmp=$dstdir/_rm.$$_ |
| 447 | + dsttmp=${dstdirslash}_inst.$$_ |
| 448 | + rmtmp=${dstdirslash}_rm.$$_ |
432 | 449 |
|
433 | 450 | # Trap to clean up those temp files at exit. |
434 | 451 | trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 |
|
493 | 510 | done |
494 | 511 |
|
495 | 512 | # Local variables: |
496 | | -# eval: (add-hook 'write-file-hooks 'time-stamp) |
| 513 | +# eval: (add-hook 'before-save-hook 'time-stamp) |
497 | 514 | # time-stamp-start: "scriptversion=" |
498 | 515 | # time-stamp-format: "%:y-%02m-%02d.%02H" |
499 | | -# time-stamp-time-zone: "UTC" |
| 516 | +# time-stamp-time-zone: "UTC0" |
500 | 517 | # time-stamp-end: "; # UTC" |
501 | 518 | # End: |
0 commit comments