• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2#
3# This is an actually-safe install command which installs the new
4# file atomically in the new location, rather than overwriting
5# existing files.
6#
7
8usage() {
9printf "usage: %s [-D] [-l] [-r] [-m mode] src dest\n" "$0" 1>&2
10exit 1
11}
12
13mkdirp=
14symlink=
15symlinkflags="-s"
16mode=755
17
18while getopts Dlrm: name ; do
19case "$name" in
20D) mkdirp=yes ;;
21l) symlink=yes ;;
22r) symlink=yes; symlinkflags="$symlinkflags -r" ;;
23m) mode=$OPTARG ;;
24?) usage ;;
25esac
26done
27shift $(($OPTIND - 1))
28
29test "$#" -eq 2 || usage
30src=$1
31dst=$2
32tmp="$dst.tmp.$$"
33
34case "$dst" in
35*/) printf "%s: %s ends in /\n", "$0" "$dst" 1>&2 ; exit 1 ;;
36esac
37
38set -C
39set -e
40
41if test "$mkdirp" ; then
42umask 022
43case "$2" in
44*/*) mkdir -p "${dst%/*}" ;;
45esac
46fi
47
48trap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP
49
50umask 077
51
52if test "$symlink" ; then
53umask 000
54ln $symlinkflags "$1" "$tmp"
55umask 077
56else
57cat < "$1" > "$tmp"
58chmod "$mode" "$tmp"
59fi
60
61mv -f "$tmp" "$2"
62test -d "$2" && {
63rm -f "$2/$tmp"
64printf "%s: %s is a directory\n" "$0" "$dst" 1>&2
65exit 1
66}
67
68exit 0
69