xref: /aosp_15_r20/external/musl/tools/install.sh (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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