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