1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#!/bin/sh
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# install - install a program, script, or datafile
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
4ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikscriptversion=2011-11-20.07; # UTC
5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# This originates from X11R5 (mit/util/scripts/install.sh), which was
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# later released in X11R6 (xc/config/util/install.sh) with the
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# following copyright and license.
9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Copyright (C) 1994 X Consortium
11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Permission is hereby granted, free of charge, to any person obtaining a copy
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# of this software and associated documentation files (the "Software"), to
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# deal in the Software without restriction, including without limitation the
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# sell copies of the Software, and to permit persons to whom the Software is
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# furnished to do so, subject to the following conditions:
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# The above copyright notice and this permission notice shall be included in
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# all copies or substantial portions of the Software.
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Except as contained in this notice, the name of the X Consortium shall not
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# be used in advertising or otherwise to promote the sale, use or other deal-
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ings in this Software without prior written authorization from the X Consor-
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# tium.
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# FSF changes to this file are in the public domain.
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Calling this script install-sh is preferred over install.sh, to prevent
38ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# 'make' implicit rules from creating a file called install from it
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# when there is no Makefile.
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# This script is compatible with the BSD install script, but was written
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# from scratch.
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectnl='
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project'
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectIFS=" ""	$nl"
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# set DOITPROG to echo to test this script
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Don't use :- since 4.3BSD and earlier shells don't like it.
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectdoit=${DOITPROG-}
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectif test -z "$doit"; then
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  doit_exec=exec
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectelse
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  doit_exec=$doit
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectfi
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Put in absolute file names if you don't have them in your path;
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# or use environment vars.
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectchgrpprog=${CHGRPPROG-chgrp}
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectchmodprog=${CHMODPROG-chmod}
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectchownprog=${CHOWNPROG-chown}
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectcmpprog=${CMPPROG-cmp}
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectcpprog=${CPPROG-cp}
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectmkdirprog=${MKDIRPROG-mkdir}
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectmvprog=${MVPROG-mv}
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectrmprog=${RMPROG-rm}
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstripprog=${STRIPPROG-strip}
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectposix_glob='?'
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectinitialize_posix_glob='
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  test "$posix_glob" != "?" || {
74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (set -f) 2>/dev/null; then
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      posix_glob=
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      posix_glob=:
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fi
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project'
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectposix_mkdir=
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Desired mode of installed file.
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectmode=0755
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectchgrpcmd=
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectchmodcmd=$chmodprog
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectchowncmd=
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectmvcmd=$mvprog
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectrmcmd="$rmprog -f"
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstripcmd=
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectsrc=
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectdst=
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectdir_arg=
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectdst_arg=
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectcopy_on_change=false
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectno_target_directory=
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectusage="\
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   or: $0 [OPTION]... SRCFILES... DIRECTORY
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   or: $0 [OPTION]... -d DIRECTORIES...
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectIn the 1st form, copy SRCFILE to DSTFILE.
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectIn the 4th, create DIRECTORIES.
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectOptions:
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     --help     display this help and exit.
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     --version  display version info and exit.
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -c            (ignored)
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -C            install only if different (preserve the last data modification time)
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -d            create directories instead of installing files.
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -g GROUP      $chgrpprog installed files to GROUP.
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -m MODE       $chmodprog installed files to MODE.
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -o USER       $chownprog installed files to USER.
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -s            $stripprog installed files.
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -t DIRECTORY  install into DIRECTORY.
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  -T            report an error if DSTFILE is a directory.
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectEnvironment variables override the default commands:
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  RMPROG STRIPPROG
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectwhile test $# -ne 0; do
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  case $1 in
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -c) ;;
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -C) copy_on_change=true;;
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -d) dir_arg=true;;
138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -g) chgrpcmd="$chgrpprog $2"
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	shift;;
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    --help) echo "$usage"; exit $?;;
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -m) mode=$2
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	case $mode in
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  *' '* | *'	'* | *'
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project'*	  | *'*'* | *'?'* | *'['*)
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    echo "$0: invalid mode: $mode" >&2
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    exit 1;;
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	esac
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	shift;;
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -o) chowncmd="$chownprog $2"
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	shift;;
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -s) stripcmd=$stripprog;;
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -t) dst_arg=$2
159ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik	# Protect names problematic for 'test' and other utilities.
160ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik	case $dst_arg in
161ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
162ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik	esac
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	shift;;
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -T) no_target_directory=true;;
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    --version) echo "$0 $scriptversion"; exit $?;;
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    --)	shift
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	break;;
171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    -*)	echo "$0: invalid option: $1" >&2
173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	exit 1;;
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *)  break;;
176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  esac
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  shift
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectdone
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  # When -d is used, all remaining arguments are directories to create.
182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  # When -t is used, the destination is already specified.
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  # Otherwise, the last argument is the destination.  Remove it from $@.
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  for arg
185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  do
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if test -n "$dst_arg"; then
187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # $@ is not empty: it contains at least $arg.
188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      set fnord "$@" "$dst_arg"
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      shift # fnord
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fi
191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    shift # arg
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    dst_arg=$arg
193ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    # Protect names problematic for 'test' and other utilities.
194ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    case $dst_arg in
195ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik      -* | [=\(\)!]) dst_arg=./$dst_arg;;
196ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    esac
197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  done
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectfi
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectif test $# -eq 0; then
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if test -z "$dir_arg"; then
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    echo "$0: no input file specified." >&2
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    exit 1
204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fi
205ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  # It's OK to call 'install-sh -d' without argument.
206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  # This can happen when creating conditional directories.
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  exit 0
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectfi
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectif test -z "$dir_arg"; then
211ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  do_exit='(exit $ret); exit $ret'
212ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  trap "ret=129; $do_exit" 1
213ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  trap "ret=130; $do_exit" 2
214ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  trap "ret=141; $do_exit" 13
215ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  trap "ret=143; $do_exit" 15
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  # Set umask so as not to create temps with too-generous modes.
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  # However, 'strip' requires both read and write access to temps.
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  case $mode in
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # Optimize common cases.
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *644) cp_umask=133;;
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *755) cp_umask=22;;
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *[0-7])
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if test -z "$stripcmd"; then
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	u_plus_rw=
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	u_plus_rw='% 200'
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fi
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *)
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if test -z "$stripcmd"; then
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	u_plus_rw=
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	u_plus_rw=,u+rw
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fi
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      cp_umask=$mode$u_plus_rw;;
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  esac
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectfi
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectfor src
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectdo
243ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  # Protect names problematic for 'test' and other utilities.
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  case $src in
245ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    -* | [=\(\)!]) src=./$src;;
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  esac
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if test -n "$dir_arg"; then
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    dst=$src
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    dstdir=$dst
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    test -d "$dstdir"
252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    dstdir_status=$?
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # might cause directories to be created, which would be especially bad
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # if $src (and thus $dsttmp) contains '*'.
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if test ! -f "$src" && test ! -d "$src"; then
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      echo "$0: $src does not exist." >&2
260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      exit 1
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fi
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if test -z "$dst_arg"; then
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      echo "$0: no destination specified." >&2
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      exit 1
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fi
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    dst=$dst_arg
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # If destination is a directory, append the input filename; won't work
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # if double slashes aren't ignored.
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if test -d "$dst"; then
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if test -n "$no_target_directory"; then
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	echo "$0: $dst_arg: Is a directory" >&2
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	exit 1
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fi
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      dstdir=$dst
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      dst=$dstdir/`basename "$src"`
278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      dstdir_status=0
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # Prefer dirname, but fall back on a substitute if dirname fails.
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      dstdir=`
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	(dirname "$dst") 2>/dev/null ||
283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	     X"$dst" : 'X\(//\)[^/]' \| \
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	     X"$dst" : 'X\(//\)$' \| \
286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	echo X"$dst" |
288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   s//\1/
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   q
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 }
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 /^X\(\/\/\)[^/].*/{
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   s//\1/
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   q
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 }
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 /^X\(\/\/\)$/{
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   s//\1/
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   q
299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 }
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 /^X\(\/\).*/{
301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   s//\1/
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   q
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 }
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 s/.*/./; q'
305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      `
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      test -d "$dstdir"
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      dstdir_status=$?
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fi
310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fi
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  obsolete_mkdir_used=false
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if test $dstdir_status != 0; then
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    case $posix_mkdir in
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      '')
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# Create intermediate dirs using mode 755 as modified by the umask.
318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# This is like FreeBSD 'install' as of 1997-10-28.
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	umask=`umask`
320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	case $stripcmd.$umask in
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  # Optimize common cases.
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  *[2367][2367]) mkdir_umask=$umask;;
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  *[0-7])
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    mkdir_umask=`expr $umask + 22 \
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      - $umask % 100 % 40 + $umask % 20 \
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      - $umask % 10 % 4 + $umask % 2
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    `;;
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  *) mkdir_umask=$umask,go-w;;
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	esac
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# With -d, create the new directory with the user-specified mode.
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# Otherwise, rely on $mkdir_umask.
335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	if test -n "$dir_arg"; then
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  mkdir_mode=-m$mode
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	else
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  mkdir_mode=
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	fi
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	posix_mkdir=false
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	case $umask in
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  *[123567][0-7][0-7])
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    ;;
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  *)
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    if (umask $mkdir_umask &&
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    then
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      if test -z "$dir_arg" || {
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   # Check for POSIX incompatibilities with -m.
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
357ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik		   # other-writable bit of parent directory when it shouldn't.
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   case $ls_ld_tmpdir in
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		     d????-?r-*) different_mode=700;;
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		     d????-?--*) different_mode=755;;
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		     *) false;;
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   esac &&
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		   }
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project		 }
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      then posix_mkdir=:
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      fi
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      rmdir "$tmpdir/d" "$tmpdir"
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    else
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      # Remove any dirs left behind by ancient mkdir implementations.
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    fi
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    trap '' 0;;
378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	esac;;
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    esac
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      $posix_mkdir && (
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	umask $mkdir_umask &&
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      )
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    then :
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # The umask is ridiculous, or mkdir does not conform to POSIX,
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # or it failed possibly due to a race condition.  Create the
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # directory the slow way, step by step, checking for races as we go.
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case $dstdir in
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	/*) prefix='/';;
395ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik	[-=\(\)!]*) prefix='./';;
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	*)  prefix='';;
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      esac
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      eval "$initialize_posix_glob"
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      oIFS=$IFS
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      IFS=/
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      $posix_glob set -f
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      set fnord $dstdir
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      shift
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      $posix_glob set +f
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      IFS=$oIFS
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      prefixes=
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for d
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      do
413ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik	test X"$d" = X && continue
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	prefix=$prefix$d
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	if test -d "$prefix"; then
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  prefixes=
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	else
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  if $posix_mkdir; then
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    (umask=$mkdir_umask &&
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    # Don't fail if two instances are running concurrently.
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    test -d "$prefix" || exit 1
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  else
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    case $prefix in
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	      *) qprefix=$prefix;;
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    esac
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    prefixes="$prefixes '$qprefix'"
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  fi
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	fi
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	prefix=$prefix/
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      done
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if test -n "$prefixes"; then
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# Don't fail if two instances are running concurrently.
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	(umask $mkdir_umask &&
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	 eval "\$doit_exec \$mkdirprog $prefixes") ||
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  test -d "$dstdir" || exit 1
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	obsolete_mkdir_used=true
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fi
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fi
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fi
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if test -n "$dir_arg"; then
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else
451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # Make a couple of temp file names in the proper directory.
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    dsttmp=$dstdir/_inst.$$_
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    rmtmp=$dstdir/_rm.$$_
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # Trap to clean up those temp files at exit.
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # Copy the file name to the temp name.
460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # and set any options; do chmod last to preserve setuid bits.
463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    #
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # If any of these fail, we abort the whole thing.  If we want to
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # ignore errors from any of these, just make sure not to ignore
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # errors from the above "$doit $cpprog $src $dsttmp" command.
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    #
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    # If -C, don't bother to copy if it wouldn't change the file.
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if $copy_on_change &&
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       eval "$initialize_posix_glob" &&
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       $posix_glob set -f &&
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       set X $old && old=:$2:$4:$5:$6 &&
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       set X $new && new=:$2:$4:$5:$6 &&
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       $posix_glob set +f &&
483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       test "$old" = "$new" &&
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    then
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      rm -f "$dsttmp"
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # Rename the file to the real destination.
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # The rename failed, perhaps because mv can't rename something else
493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # to itself, or perhaps because mv is so ancient that it does not
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      # support -f.
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# Now remove or move aside any old file at destination location.
497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# We try this two ways since rm can't unlink itself on some
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# systems and the destination file might be busy for other
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# reasons.  In this case, the final cleanup might fail but the new
500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# file should still install successfully.
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	{
502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  test ! -f "$dst" ||
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  $doit $rmcmd -f "$dst" 2>/dev/null ||
504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  } ||
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  { echo "$0: cannot unlink or rename $dst" >&2
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	    (exit 1); exit 1
509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	  }
510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	} &&
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	# Now rename the file to the real destination.
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project	$doit $mvcmd "$dsttmp" "$dst"
514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fi || exit 1
516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    trap '' 0
518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fi
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectdone
520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# Local variables:
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# eval: (add-hook 'write-file-hooks 'time-stamp)
523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# time-stamp-start: "scriptversion="
524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# time-stamp-format: "%:y-%02m-%02d.%02H"
5255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott# time-stamp-time-zone: "UTC"
5265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott# time-stamp-end: "; # UTC"
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# End:
528