1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#!/bin/sh
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# install - install a program, script, or datafile
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
405436638acc7c010349a69c3395f1a57c642dc62Ying Wangscriptversion=2011-11-20.07; # UTC
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This originates from X11R5 (mit/util/scripts/install.sh), which was
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# later released in X11R6 (xc/config/util/install.sh) with the
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# following copyright and license.
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Copyright (C) 1994 X Consortium
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Permission is hereby granted, free of charge, to any person obtaining a copy
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# of this software and associated documentation files (the "Software"), to
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# deal in the Software without restriction, including without limitation the
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# sell copies of the Software, and to permit persons to whom the Software is
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# furnished to do so, subject to the following conditions:
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# The above copyright notice and this permission notice shall be included in
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# all copies or substantial portions of the Software.
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Except as contained in this notice, the name of the X Consortium shall not
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# be used in advertising or otherwise to promote the sale, use or other deal-
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ings in this Software without prior written authorization from the X Consor-
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# tium.
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# FSF changes to this file are in the public domain.
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Calling this script install-sh is preferred over install.sh, to prevent
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 'make' implicit rules from creating a file called install from it
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# when there is no Makefile.
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# This script is compatible with the BSD install script, but was written
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# from scratch.
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wangnl='
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang'
4605436638acc7c010349a69c3395f1a57c642dc62Ying WangIFS=" ""	$nl"
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# set DOITPROG to echo to test this script
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Don't use :- since 4.3BSD and earlier shells don't like it.
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wangdoit=${DOITPROG-}
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wangif test -z "$doit"; then
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  doit_exec=exec
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wangelse
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  doit_exec=$doit
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wangfi
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Put in absolute file names if you don't have them in your path;
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# or use environment vars.
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wangchgrpprog=${CHGRPPROG-chgrp}
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wangchmodprog=${CHMODPROG-chmod}
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wangchownprog=${CHOWNPROG-chown}
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wangcmpprog=${CMPPROG-cmp}
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wangcpprog=${CPPROG-cp}
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wangmkdirprog=${MKDIRPROG-mkdir}
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wangmvprog=${MVPROG-mv}
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wangrmprog=${RMPROG-rm}
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstripprog=${STRIPPROG-strip}
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wangposix_glob='?'
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wanginitialize_posix_glob='
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  test "$posix_glob" != "?" || {
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (set -f) 2>/dev/null; then
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      posix_glob=
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    else
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      posix_glob=:
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fi
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang'
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wangposix_mkdir=
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Desired mode of installed file.
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wangmode=0755
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchgrpcmd=
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wangchmodcmd=$chmodprog
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wangchowncmd=
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wangmvcmd=$mvprog
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrmcmd="$rmprog -f"
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstripcmd=
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsrc=
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdst=
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdir_arg=
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wangdst_arg=
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wangcopy_on_change=false
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectno_target_directory=
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wangusage="\
10305436638acc7c010349a69c3395f1a57c642dc62Ying WangUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or: $0 [OPTION]... SRCFILES... DIRECTORY
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or: $0 [OPTION]... -d DIRECTORIES...
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the 1st form, copy SRCFILE to DSTFILE.
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn the 4th, create DIRECTORIES.
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOptions:
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     --help     display this help and exit.
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     --version  display version info and exit.
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -c            (ignored)
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -C            install only if different (preserve the last data modification time)
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -d            create directories instead of installing files.
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -g GROUP      $chgrpprog installed files to GROUP.
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -m MODE       $chmodprog installed files to MODE.
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -o USER       $chownprog installed files to USER.
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -s            $stripprog installed files.
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -t DIRECTORY  install into DIRECTORY.
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  -T            report an error if DSTFILE is a directory.
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEnvironment variables override the default commands:
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  RMPROG STRIPPROG
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project"
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wangwhile test $# -ne 0; do
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  case $1 in
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -c) ;;
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -C) copy_on_change=true;;
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -d) dir_arg=true;;
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    -g) chgrpcmd="$chgrpprog $2"
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	shift;;
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    --help) echo "$usage"; exit $?;;
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -m) mode=$2
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	case $mode in
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  *' '* | *'	'* | *'
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang'*	  | *'*'* | *'?'* | *'['*)
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    echo "$0: invalid mode: $mode" >&2
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    exit 1;;
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	esac
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	shift;;
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    -o) chowncmd="$chownprog $2"
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	shift;;
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -s) stripcmd=$stripprog;;
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -t) dst_arg=$2
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# Protect names problematic for 'test' and other utilities.
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	case $dst_arg in
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	esac
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	shift;;
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -T) no_target_directory=true;;
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    --version) echo "$0 $scriptversion"; exit $?;;
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    --)	shift
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	break;;
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -*)	echo "$0: invalid option: $1" >&2
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	exit 1;;
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    *)  break;;
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  esac
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  shift
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdone
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wangif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  # When -d is used, all remaining arguments are directories to create.
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  # When -t is used, the destination is already specified.
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  # Otherwise, the last argument is the destination.  Remove it from $@.
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for arg
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  do
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if test -n "$dst_arg"; then
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # $@ is not empty: it contains at least $arg.
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      set fnord "$@" "$dst_arg"
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      shift # fnord
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fi
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    shift # arg
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dst_arg=$arg
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    # Protect names problematic for 'test' and other utilities.
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    case $dst_arg in
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      -* | [=\(\)!]) dst_arg=./$dst_arg;;
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    esac
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  done
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wangfi
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wangif test $# -eq 0; then
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if test -z "$dir_arg"; then
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    echo "$0: no input file specified." >&2
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    exit 1
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fi
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  # It's OK to call 'install-sh -d' without argument.
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  # This can happen when creating conditional directories.
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  exit 0
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfi
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wangif test -z "$dir_arg"; then
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  do_exit='(exit $ret); exit $ret'
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  trap "ret=129; $do_exit" 1
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  trap "ret=130; $do_exit" 2
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  trap "ret=141; $do_exit" 13
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  trap "ret=143; $do_exit" 15
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  # Set umask so as not to create temps with too-generous modes.
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  # However, 'strip' requires both read and write access to temps.
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  case $mode in
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    # Optimize common cases.
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    *644) cp_umask=133;;
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    *755) cp_umask=22;;
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    *[0-7])
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if test -z "$stripcmd"; then
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	u_plus_rw=
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      else
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	u_plus_rw='% 200'
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fi
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    *)
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if test -z "$stripcmd"; then
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	u_plus_rw=
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      else
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	u_plus_rw=,u+rw
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fi
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      cp_umask=$mode$u_plus_rw;;
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  esac
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wangfi
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfor src
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdo
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  # Protect names problematic for 'test' and other utilities.
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  case $src in
24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    -* | [=\(\)!]) src=./$src;;
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  esac
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if test -n "$dir_arg"; then
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    dst=$src
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dstdir=$dst
25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    test -d "$dstdir"
25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dstdir_status=$?
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # might cause directories to be created, which would be especially bad
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # if $src (and thus $dsttmp) contains '*'.
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if test ! -f "$src" && test ! -d "$src"; then
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      echo "$0: $src does not exist." >&2
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      exit 1
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fi
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if test -z "$dst_arg"; then
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      echo "$0: no destination specified." >&2
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      exit 1
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fi
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dst=$dst_arg
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # If destination is a directory, append the input filename; won't work
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # if double slashes aren't ignored.
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if test -d "$dst"; then
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if test -n "$no_target_directory"; then
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	echo "$0: $dst_arg: Is a directory" >&2
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	exit 1
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fi
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dstdir=$dst
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dst=$dstdir/`basename "$src"`
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dstdir_status=0
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    else
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # Prefer dirname, but fall back on a substitute if dirname fails.
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dstdir=`
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	(dirname "$dst") 2>/dev/null ||
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	     X"$dst" : 'X\(//\)[^/]' \| \
28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	     X"$dst" : 'X\(//\)$' \| \
28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	echo X"$dst" |
28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   s//\1/
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   q
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 }
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 /^X\(\/\/\)[^/].*/{
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   s//\1/
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   q
29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 }
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 /^X\(\/\/\)$/{
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   s//\1/
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   q
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 }
30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 /^X\(\/\).*/{
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   s//\1/
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   q
30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 }
30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 s/.*/./; q'
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      `
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      test -d "$dstdir"
30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dstdir_status=$?
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fi
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fi
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  obsolete_mkdir_used=false
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $dstdir_status != 0; then
31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    case $posix_mkdir in
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      '')
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# Create intermediate dirs using mode 755 as modified by the umask.
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# This is like FreeBSD 'install' as of 1997-10-28.
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	umask=`umask`
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	case $stripcmd.$umask in
32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  # Optimize common cases.
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  *[2367][2367]) mkdir_umask=$umask;;
32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  *[0-7])
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    mkdir_umask=`expr $umask + 22 \
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      - $umask % 100 % 40 + $umask % 20 \
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      - $umask % 10 % 4 + $umask % 2
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    `;;
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  *) mkdir_umask=$umask,go-w;;
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	esac
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# With -d, create the new directory with the user-specified mode.
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# Otherwise, rely on $mkdir_umask.
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	if test -n "$dir_arg"; then
33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  mkdir_mode=-m$mode
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	else
33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  mkdir_mode=
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	fi
34005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
34105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	posix_mkdir=false
34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	case $umask in
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  *[123567][0-7][0-7])
34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    ;;
34705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  *)
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    if (umask $mkdir_umask &&
35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    then
35405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      if test -z "$dir_arg" || {
35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   # Check for POSIX incompatibilities with -m.
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   # other-writable bit of parent directory when it shouldn't.
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   case $ls_ld_tmpdir in
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     d????-?r-*) different_mode=700;;
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     d????-?--*) different_mode=755;;
36305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     *) false;;
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   esac &&
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		   }
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 }
37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      then posix_mkdir=:
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      fi
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      rmdir "$tmpdir/d" "$tmpdir"
37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    else
37405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      # Remove any dirs left behind by ancient mkdir implementations.
37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    fi
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    trap '' 0;;
37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	esac;;
37905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    esac
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if
38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      $posix_mkdir && (
38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	umask $mkdir_umask &&
38405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      )
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    then :
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    else
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # The umask is ridiculous, or mkdir does not conform to POSIX,
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # or it failed possibly due to a race condition.  Create the
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # directory the slow way, step by step, checking for races as we go.
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case $dstdir in
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	/*) prefix='/';;
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	[-=\(\)!]*) prefix='./';;
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	*)  prefix='';;
39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      esac
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      eval "$initialize_posix_glob"
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      oIFS=$IFS
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      IFS=/
40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      $posix_glob set -f
40405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      set fnord $dstdir
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      shift
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      $posix_glob set +f
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      IFS=$oIFS
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      prefixes=
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      for d
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      do
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	test X"$d" = X && continue
41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	prefix=$prefix$d
41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	if test -d "$prefix"; then
41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  prefixes=
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	else
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  if $posix_mkdir; then
42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    (umask=$mkdir_umask &&
42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    # Don't fail if two instances are running concurrently.
42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    test -d "$prefix" || exit 1
42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  else
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    case $prefix in
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
42705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      *) qprefix=$prefix;;
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    esac
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    prefixes="$prefixes '$qprefix'"
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  fi
43105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	fi
43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	prefix=$prefix/
43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      done
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if test -n "$prefixes"; then
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# Don't fail if two instances are running concurrently.
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	(umask $mkdir_umask &&
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	 eval "\$doit_exec \$mkdirprog $prefixes") ||
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  test -d "$dstdir" || exit 1
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	obsolete_mkdir_used=true
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fi
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fi
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fi
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if test -n "$dir_arg"; then
44605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # Make a couple of temp file names in the proper directory.
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    dsttmp=$dstdir/_inst.$$_
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    rmtmp=$dstdir/_rm.$$_
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # Trap to clean up those temp files at exit.
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # Copy the file name to the temp name.
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # and set any options; do chmod last to preserve setuid bits.
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    #
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # If any of these fail, we abort the whole thing.  If we want to
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # ignore errors from any of these, just make sure not to ignore
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    # errors from the above "$doit $cpprog $src $dsttmp" command.
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    #
46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    # If -C, don't bother to copy if it wouldn't change the file.
47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if $copy_on_change &&
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       eval "$initialize_posix_glob" &&
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       $posix_glob set -f &&
48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       set X $old && old=:$2:$4:$5:$6 &&
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       set X $new && new=:$2:$4:$5:$6 &&
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       $posix_glob set +f &&
48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       test "$old" = "$new" &&
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    then
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      rm -f "$dsttmp"
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    else
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # Rename the file to the real destination.
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # The rename failed, perhaps because mv can't rename something else
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # to itself, or perhaps because mv is so ancient that it does not
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      # support -f.
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# Now remove or move aside any old file at destination location.
49705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# We try this two ways since rm can't unlink itself on some
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# systems and the destination file might be busy for other
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# reasons.  In this case, the final cleanup might fail but the new
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# file should still install successfully.
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	{
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  test ! -f "$dst" ||
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  $doit $rmcmd -f "$dst" 2>/dev/null ||
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  } ||
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  { echo "$0: cannot unlink or rename $dst" >&2
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    (exit 1); exit 1
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  }
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	} &&
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	# Now rename the file to the real destination.
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	$doit $mvcmd "$dsttmp" "$dst"
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fi || exit 1
51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    trap '' 0
51805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdone
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# Local variables:
522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# eval: (add-hook 'write-file-hooks 'time-stamp)
523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# time-stamp-start: "scriptversion="
524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# time-stamp-format: "%:y-%02m-%02d.%02H"
52505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# time-stamp-time-zone: "UTC"
52605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# time-stamp-end: "; # UTC"
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# End:
528