1570af302Sopenharmony_ci#!/bin/sh
2570af302Sopenharmony_ci#
3570af302Sopenharmony_ci# This is an actually-safe install command which installs the new
4570af302Sopenharmony_ci# file atomically in the new location, rather than overwriting
5570af302Sopenharmony_ci# existing files.
6570af302Sopenharmony_ci#
7570af302Sopenharmony_ci
8570af302Sopenharmony_ciusage() {
9570af302Sopenharmony_ciprintf "usage: %s [-D] [-l] [-r] [-m mode] src dest\n" "$0" 1>&2
10570af302Sopenharmony_ciexit 1
11570af302Sopenharmony_ci}
12570af302Sopenharmony_ci
13570af302Sopenharmony_cimkdirp=
14570af302Sopenharmony_cisymlink=
15570af302Sopenharmony_cisymlinkflags="-s"
16570af302Sopenharmony_cimode=755
17570af302Sopenharmony_ci
18570af302Sopenharmony_ciwhile getopts Dlrm: name ; do
19570af302Sopenharmony_cicase "$name" in
20570af302Sopenharmony_ciD) mkdirp=yes ;;
21570af302Sopenharmony_cil) symlink=yes ;;
22570af302Sopenharmony_cir) symlink=yes; symlinkflags="$symlinkflags -r" ;;
23570af302Sopenharmony_cim) mode=$OPTARG ;;
24570af302Sopenharmony_ci?) usage ;;
25570af302Sopenharmony_ciesac
26570af302Sopenharmony_cidone
27570af302Sopenharmony_cishift $(($OPTIND - 1))
28570af302Sopenharmony_ci
29570af302Sopenharmony_citest "$#" -eq 2 || usage
30570af302Sopenharmony_cisrc=$1
31570af302Sopenharmony_cidst=$2
32570af302Sopenharmony_citmp="$dst.tmp.$$"
33570af302Sopenharmony_ci
34570af302Sopenharmony_cicase "$dst" in
35570af302Sopenharmony_ci*/) printf "%s: %s ends in /\n", "$0" "$dst" 1>&2 ; exit 1 ;;
36570af302Sopenharmony_ciesac
37570af302Sopenharmony_ci
38570af302Sopenharmony_ciset -C
39570af302Sopenharmony_ciset -e
40570af302Sopenharmony_ci
41570af302Sopenharmony_ciif test "$mkdirp" ; then
42570af302Sopenharmony_ciumask 022
43570af302Sopenharmony_cicase "$2" in
44570af302Sopenharmony_ci*/*) mkdir -p "${dst%/*}" ;;
45570af302Sopenharmony_ciesac
46570af302Sopenharmony_cifi
47570af302Sopenharmony_ci
48570af302Sopenharmony_citrap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP
49570af302Sopenharmony_ci
50570af302Sopenharmony_ciumask 077
51570af302Sopenharmony_ci
52570af302Sopenharmony_ciif test "$symlink" ; then
53570af302Sopenharmony_ciumask 000
54570af302Sopenharmony_ciln $symlinkflags "$1" "$tmp"
55570af302Sopenharmony_ciumask 077
56570af302Sopenharmony_cielse
57570af302Sopenharmony_cicat < "$1" > "$tmp"
58570af302Sopenharmony_cichmod "$mode" "$tmp"
59570af302Sopenharmony_cifi
60570af302Sopenharmony_ci
61570af302Sopenharmony_cimv -f "$tmp" "$2"
62570af302Sopenharmony_citest -d "$2" && {
63570af302Sopenharmony_cirm -f "$2/$tmp"
64570af302Sopenharmony_ciprintf "%s: %s is a directory\n" "$0" "$dst" 1>&2
65570af302Sopenharmony_ciexit 1
66570af302Sopenharmony_ci}
67570af302Sopenharmony_ci
68570af302Sopenharmony_ciexit 0
69