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