#!/bin/sh | |
# | |
# This is an actually-safe install command which installs the new | |
# file atomically in the new location, rather than overwriting | |
# existing files. | |
# | |
usage() { | |
printf "usage: %s [-D] [-l] [-m mode] src dest\n" "$0" 1>&2 | |
exit 1 | |
} | |
mkdirp= | |
symlink= | |
mode=755 | |
while getopts Dlm: name ; do | |
case "$name" in | |
D) mkdirp=yes ;; | |
l) symlink=yes ;; | |
m) mode=$OPTARG ;; | |
?) usage ;; | |
esac | |
done | |
shift $(($OPTIND - 1)) | |
test "$#" -eq 2 || usage | |
src=$1 | |
dst=$2 | |
tmp="$dst.tmp.$$" | |
case "$dst" in | |
*/) printf "%s: %s ends in /\n", "$0" "$dst" 1>&2 ; exit 1 ;; | |
esac | |
set -C | |
set -e | |
if test "$mkdirp" ; then | |
umask 022 | |
case "$2" in | |
*/*) mkdir -p "${dst%/*}" ;; | |
esac | |
fi | |
trap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP | |
umask 077 | |
if test "$symlink" ; then | |
ln -s "$1" "$tmp" | |
else | |
cat < "$1" > "$tmp" | |
chmod "$mode" "$tmp" | |
fi | |
mv -f "$tmp" "$2" | |
test -d "$2" && { | |
rm -f "$2/$tmp" | |
printf "%s: %s is a directory\n" "$0" "$dst" 1>&2 | |
exit 1 | |
} | |
exit 0 |