12068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project#!/bin/sh 22068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# install - install a program, script, or datafile 32068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 42068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectscriptversion=2005-05-14.22 52068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 62068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# This originates from X11R5 (mit/util/scripts/install.sh), which was 72068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# later released in X11R6 (xc/config/util/install.sh) with the 82068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# following copyright and license. 92068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 102068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# Copyright (C) 1994 X Consortium 112068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 122068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# Permission is hereby granted, free of charge, to any person obtaining a copy 132068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# of this software and associated documentation files (the "Software"), to 142068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# deal in the Software without restriction, including without limitation the 152068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 162068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# sell copies of the Software, and to permit persons to whom the Software is 172068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# furnished to do so, subject to the following conditions: 182068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 192068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# The above copyright notice and this permission notice shall be included in 202068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# all copies or substantial portions of the Software. 212068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 222068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 232068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 242068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 252068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 262068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 272068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 282068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 292068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# Except as contained in this notice, the name of the X Consortium shall not 302068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# be used in advertising or otherwise to promote the sale, use or other deal- 312068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# ings in this Software without prior written authorization from the X Consor- 322068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# tium. 332068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 342068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 352068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# FSF changes to this file are in the public domain. 362068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 372068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# Calling this script install-sh is preferred over install.sh, to prevent 382068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# `make' implicit rules from creating a file called install from it 392068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# when there is no Makefile. 402068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# 412068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# This script is compatible with the BSD install script, but was written 422068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# from scratch. It can only install one file at a time, a restriction 432068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# shared with many OS's install programs. 442068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 452068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# set DOITPROG to echo to test this script 462068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 472068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# Don't use :- since 4.3BSD and earlier shells don't like it. 482068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectdoit="${DOITPROG-}" 492068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 502068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# put in absolute paths if you don't have them in your path; or use env. vars. 512068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 522068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectmvprog="${MVPROG-mv}" 532068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectcpprog="${CPPROG-cp}" 542068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectchmodprog="${CHMODPROG-chmod}" 552068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectchownprog="${CHOWNPROG-chown}" 562068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectchgrpprog="${CHGRPPROG-chgrp}" 572068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectstripprog="${STRIPPROG-strip}" 582068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectrmprog="${RMPROG-rm}" 592068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectmkdirprog="${MKDIRPROG-mkdir}" 602068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 612068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectchmodcmd="$chmodprog 0755" 622068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectchowncmd= 632068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectchgrpcmd= 642068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectstripcmd= 652068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectrmcmd="$rmprog -f" 662068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectmvcmd="$mvprog" 672068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectsrc= 682068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectdst= 692068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectdir_arg= 702068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectdstarg= 712068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectno_target_directory= 722068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 732068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 742068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project or: $0 [OPTION]... SRCFILES... DIRECTORY 752068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project or: $0 [OPTION]... -t DIRECTORY SRCFILES... 762068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project or: $0 [OPTION]... -d DIRECTORIES... 772068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 782068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source ProjectIn the 1st form, copy SRCFILE to DSTFILE. 792068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source ProjectIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 802068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source ProjectIn the 4th, create DIRECTORIES. 812068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 822068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source ProjectOptions: 832068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-c (ignored) 842068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-d create directories instead of installing files. 852068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-g GROUP $chgrpprog installed files to GROUP. 862068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-m MODE $chmodprog installed files to MODE. 872068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-o USER $chownprog installed files to USER. 882068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-s $stripprog installed files. 892068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-t DIRECTORY install into DIRECTORY. 902068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project-T report an error if DSTFILE is a directory. 912068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project--help display this help and exit. 922068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project--version display version info and exit. 932068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 942068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source ProjectEnvironment variables override the default commands: 952068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG 962068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project" 972068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 982068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectwhile test -n "$1"; do 992068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project case $1 in 1002068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -c) shift 1012068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1022068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1032068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -d) dir_arg=true 1042068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1052068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1062068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1072068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -g) chgrpcmd="$chgrpprog $2" 1082068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1092068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1102068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1112068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1122068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project --help) echo "$usage"; exit $?;; 1132068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1142068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -m) chmodcmd="$chmodprog $2" 1152068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1162068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1172068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1182068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1192068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -o) chowncmd="$chownprog $2" 1202068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1212068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1222068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1232068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1242068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -s) stripcmd=$stripprog 1252068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1262068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1272068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1282068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -t) dstarg=$2 1292068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1302068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1312068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1322068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1332068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -T) no_target_directory=true 1342068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 1352068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project continue;; 1362068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1372068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project --version) echo "$0 $scriptversion"; exit $?;; 1382068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1392068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project *) # When -d is used, all remaining arguments are directories to create. 1402068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # When -t is used, the destination is already specified. 1412068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project test -n "$dir_arg$dstarg" && break 1422068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Otherwise, the last argument is the destination. Remove it from $@. 1432068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project for arg 1442068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project do 1452068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -n "$dstarg"; then 1462068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # $@ is not empty: it contains at least $arg. 1472068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project set fnord "$@" "$dstarg" 1482068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift # fnord 1492068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 1502068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift # arg 1512068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project dstarg=$arg 1522068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project done 1532068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project break;; 1542068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project esac 1552068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectdone 1562068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1572068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectif test -z "$1"; then 1582068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -z "$dir_arg"; then 1592068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project echo "$0: no input file specified." >&2 1602068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project exit 1 1612068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 1622068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # It's OK to call `install-sh -d' without argument. 1632068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # This can happen when creating conditional directories. 1642068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project exit 0 1652068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectfi 1662068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1672068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectfor src 1682068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectdo 1692068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Protect names starting with `-'. 1702068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project case $src in 1712068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -*) src=./$src ;; 1722068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project esac 1732068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1742068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -n "$dir_arg"; then 1752068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project dst=$src 1762068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project src= 1772068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1782068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -d "$dst"; then 1792068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project mkdircmd=: 1802068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project chmodcmd= 1812068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project else 1822068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project mkdircmd=$mkdirprog 1832068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 1842068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project else 1852068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 1862068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # might cause directories to be created, which would be especially bad 1872068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # if $src (and thus $dsttmp) contains '*'. 1882068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test ! -f "$src" && test ! -d "$src"; then 1892068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project echo "$0: $src does not exist." >&2 1902068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project exit 1 1912068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 1922068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1932068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -z "$dstarg"; then 1942068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project echo "$0: no destination specified." >&2 1952068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project exit 1 1962068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 1972068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 1982068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project dst=$dstarg 1992068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Protect names starting with `-'. 2002068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project case $dst in 2012068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project -*) dst=./$dst ;; 2022068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project esac 2032068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2042068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # If destination is a directory, append the input filename; won't work 2052068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # if double slashes aren't ignored. 2062068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -d "$dst"; then 2072068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -n "$no_target_directory"; then 2082068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project echo "$0: $dstarg: Is a directory" >&2 2092068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project exit 1 2102068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 2112068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project dst=$dst/`basename "$src"` 2122068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 2132068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 2142068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2152068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # This sed command emulates the dirname command. 2162068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` 2172068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2182068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Make sure that the destination directory exists. 2192068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2202068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Skip lots of stat calls in the usual case. 2212068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test ! -d "$dstdir"; then 2222068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project defaultIFS=' 2232068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project ' 2242068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project IFS="${IFS-$defaultIFS}" 2252068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2262068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project oIFS=$IFS 2272068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Some sh's can't handle IFS=/ for some reason. 2282068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project IFS='%' 2292068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` 2302068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 2312068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project IFS=$oIFS 2322068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2332068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project pathcomp= 2342068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2352068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project while test $# -ne 0 ; do 2362068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project pathcomp=$pathcomp$1 2372068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project shift 2382068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test ! -d "$pathcomp"; then 2392068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project $mkdirprog "$pathcomp" 2402068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # mkdir can fail with a `File exist' error in case several 2412068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # install-sh are creating the directory concurrently. This 2422068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # is OK. 2432068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project test -d "$pathcomp" || exit 2442068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 2452068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project pathcomp=$pathcomp/ 2462068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project done 2472068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 2482068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2492068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -n "$dir_arg"; then 2502068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project $doit $mkdircmd "$dst" \ 2512068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ 2522068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ 2532068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ 2542068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } 2552068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2562068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project else 2572068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project dstfile=`basename "$dst"` 2582068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2592068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Make a couple of temp file names in the proper directory. 2602068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project dsttmp=$dstdir/_inst.$$_ 2612068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project rmtmp=$dstdir/_rm.$$_ 2622068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2632068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Trap to clean up those temp files at exit. 2642068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 2652068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project trap '(exit $?); exit' 1 2 13 15 2662068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2672068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Copy the file name to the temp name. 2682068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project $doit $cpprog "$src" "$dsttmp" && 2692068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2702068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # and set any options; do chmod last to preserve setuid bits. 2712068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # 2722068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # If any of these fail, we abort the whole thing. If we want to 2732068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # ignore errors from any of these, just make sure not to ignore 2742068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # errors from the above "$doit $cpprog $src $dsttmp" command. 2752068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # 2762068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ 2772068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ 2782068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ 2792068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && 2802068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2812068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Now rename the file to the real destination. 2822068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ 2832068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project || { 2842068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # The rename failed, perhaps because mv can't rename something else 2852068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # to itself, or perhaps because mv is so ancient that it does not 2862068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # support -f. 2872068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 2882068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Now remove or move aside any old file at destination location. 2892068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # We try this two ways since rm can't unlink itself on some 2902068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # systems and the destination file might be busy for other 2912068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # reasons. In this case, the final cleanup might fail but the new 2922068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # file should still install successfully. 2932068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project { 2942068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project if test -f "$dstdir/$dstfile"; then 2952068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ 2962068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ 2972068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project || { 2982068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 2992068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project (exit 1); exit 1 3002068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project } 3012068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project else 3022068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project : 3032068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi 3042068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project } && 3052068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 3062068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project # Now rename the file to the real destination. 3072068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" 3082068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project } 3092068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project } 3102068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project fi || { (exit 1); exit 1; } 3112068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Projectdone 3122068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 3132068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# The final little trick to "correctly" pass the exit status to the exit trap. 3142068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project{ 3152068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project (exit 0); exit 0 3162068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project} 3172068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project 3182068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# Local variables: 3192068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# eval: (add-hook 'write-file-hooks 'time-stamp) 3202068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# time-stamp-start: "scriptversion=" 3212068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# time-stamp-format: "%:y-%02m-%02d.%02H" 3222068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# time-stamp-end: "$" 3232068259fff846977bdd4262fa27ea6cb81d35a78The Android Open Source Project# End: 324