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