1*c9945492SAndroid Build Coastguard Worker#!/bin/sh 2*c9945492SAndroid Build Coastguard Worker# 3*c9945492SAndroid Build Coastguard Worker# This is an actually-safe install command which installs the new 4*c9945492SAndroid Build Coastguard Worker# file atomically in the new location, rather than overwriting 5*c9945492SAndroid Build Coastguard Worker# existing files. 6*c9945492SAndroid Build Coastguard Worker# 7*c9945492SAndroid Build Coastguard Worker 8*c9945492SAndroid Build Coastguard Workerusage() { 9*c9945492SAndroid Build Coastguard Workerprintf "usage: %s [-D] [-l] [-m mode] src dest\n" "$0" 1>&2 10*c9945492SAndroid Build Coastguard Workerexit 1 11*c9945492SAndroid Build Coastguard Worker} 12*c9945492SAndroid Build Coastguard Worker 13*c9945492SAndroid Build Coastguard Workermkdirp= 14*c9945492SAndroid Build Coastguard Workersymlink= 15*c9945492SAndroid Build Coastguard Workermode=755 16*c9945492SAndroid Build Coastguard Worker 17*c9945492SAndroid Build Coastguard Workerwhile getopts Dlm: name ; do 18*c9945492SAndroid Build Coastguard Workercase "$name" in 19*c9945492SAndroid Build Coastguard WorkerD) mkdirp=yes ;; 20*c9945492SAndroid Build Coastguard Workerl) symlink=yes ;; 21*c9945492SAndroid Build Coastguard Workerm) mode=$OPTARG ;; 22*c9945492SAndroid Build Coastguard Worker?) usage ;; 23*c9945492SAndroid Build Coastguard Workeresac 24*c9945492SAndroid Build Coastguard Workerdone 25*c9945492SAndroid Build Coastguard Workershift $(($OPTIND - 1)) 26*c9945492SAndroid Build Coastguard Worker 27*c9945492SAndroid Build Coastguard Workertest "$#" -eq 2 || usage 28*c9945492SAndroid Build Coastguard Workersrc=$1 29*c9945492SAndroid Build Coastguard Workerdst=$2 30*c9945492SAndroid Build Coastguard Workertmp="$dst.tmp.$$" 31*c9945492SAndroid Build Coastguard Worker 32*c9945492SAndroid Build Coastguard Workercase "$dst" in 33*c9945492SAndroid Build Coastguard Worker*/) printf "%s: %s ends in /\n", "$0" "$dst" 1>&2 ; exit 1 ;; 34*c9945492SAndroid Build Coastguard Workeresac 35*c9945492SAndroid Build Coastguard Worker 36*c9945492SAndroid Build Coastguard Workerset -C 37*c9945492SAndroid Build Coastguard Workerset -e 38*c9945492SAndroid Build Coastguard Worker 39*c9945492SAndroid Build Coastguard Workerif test "$mkdirp" ; then 40*c9945492SAndroid Build Coastguard Workerumask 022 41*c9945492SAndroid Build Coastguard Workercase "$2" in 42*c9945492SAndroid Build Coastguard Worker*/*) mkdir -p "${dst%/*}" ;; 43*c9945492SAndroid Build Coastguard Workeresac 44*c9945492SAndroid Build Coastguard Workerfi 45*c9945492SAndroid Build Coastguard Worker 46*c9945492SAndroid Build Coastguard Workertrap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP 47*c9945492SAndroid Build Coastguard Worker 48*c9945492SAndroid Build Coastguard Workerumask 077 49*c9945492SAndroid Build Coastguard Worker 50*c9945492SAndroid Build Coastguard Workerif test "$symlink" ; then 51*c9945492SAndroid Build Coastguard Workerumask 000 52*c9945492SAndroid Build Coastguard Workerln -s "$1" "$tmp" 53*c9945492SAndroid Build Coastguard Workerumask 077 54*c9945492SAndroid Build Coastguard Workerelse 55*c9945492SAndroid Build Coastguard Workercat < "$1" > "$tmp" 56*c9945492SAndroid Build Coastguard Workerchmod "$mode" "$tmp" 57*c9945492SAndroid Build Coastguard Workerfi 58*c9945492SAndroid Build Coastguard Worker 59*c9945492SAndroid Build Coastguard Workermv -f "$tmp" "$2" 60*c9945492SAndroid Build Coastguard Workertest -d "$2" && { 61*c9945492SAndroid Build Coastguard Workerrm -f "$2/$tmp" 62*c9945492SAndroid Build Coastguard Workerprintf "%s: %s is a directory\n" "$0" "$dst" 1>&2 63*c9945492SAndroid Build Coastguard Workerexit 1 64*c9945492SAndroid Build Coastguard Worker} 65*c9945492SAndroid Build Coastguard Worker 66*c9945492SAndroid Build Coastguard Workerexit 0 67