#!/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