199ca880aSopenharmony_ci#!/bin/sh 299ca880aSopenharmony_ci# install - install a program, script, or datafile 399ca880aSopenharmony_ci 499ca880aSopenharmony_ciscriptversion=2018-03-11.20; # UTC 599ca880aSopenharmony_ci 699ca880aSopenharmony_ci# This originates from X11R5 (mit/util/scripts/install.sh), which was 799ca880aSopenharmony_ci# later released in X11R6 (xc/config/util/install.sh) with the 899ca880aSopenharmony_ci# following copyright and license. 999ca880aSopenharmony_ci# 1099ca880aSopenharmony_ci# Copyright (C) 1994 X Consortium 1199ca880aSopenharmony_ci# 1299ca880aSopenharmony_ci# Permission is hereby granted, free of charge, to any person obtaining a copy 1399ca880aSopenharmony_ci# of this software and associated documentation files (the "Software"), to 1499ca880aSopenharmony_ci# deal in the Software without restriction, including without limitation the 1599ca880aSopenharmony_ci# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1699ca880aSopenharmony_ci# sell copies of the Software, and to permit persons to whom the Software is 1799ca880aSopenharmony_ci# furnished to do so, subject to the following conditions: 1899ca880aSopenharmony_ci# 1999ca880aSopenharmony_ci# The above copyright notice and this permission notice shall be included in 2099ca880aSopenharmony_ci# all copies or substantial portions of the Software. 2199ca880aSopenharmony_ci# 2299ca880aSopenharmony_ci# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2399ca880aSopenharmony_ci# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2499ca880aSopenharmony_ci# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2599ca880aSopenharmony_ci# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2699ca880aSopenharmony_ci# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2799ca880aSopenharmony_ci# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2899ca880aSopenharmony_ci# 2999ca880aSopenharmony_ci# Except as contained in this notice, the name of the X Consortium shall not 3099ca880aSopenharmony_ci# be used in advertising or otherwise to promote the sale, use or other deal- 3199ca880aSopenharmony_ci# ings in this Software without prior written authorization from the X Consor- 3299ca880aSopenharmony_ci# tium. 3399ca880aSopenharmony_ci# 3499ca880aSopenharmony_ci# 3599ca880aSopenharmony_ci# FSF changes to this file are in the public domain. 3699ca880aSopenharmony_ci# 3799ca880aSopenharmony_ci# Calling this script install-sh is preferred over install.sh, to prevent 3899ca880aSopenharmony_ci# 'make' implicit rules from creating a file called install from it 3999ca880aSopenharmony_ci# when there is no Makefile. 4099ca880aSopenharmony_ci# 4199ca880aSopenharmony_ci# This script is compatible with the BSD install script, but was written 4299ca880aSopenharmony_ci# from scratch. 4399ca880aSopenharmony_ci 4499ca880aSopenharmony_citab=' ' 4599ca880aSopenharmony_cinl=' 4699ca880aSopenharmony_ci' 4799ca880aSopenharmony_ciIFS=" $tab$nl" 4899ca880aSopenharmony_ci 4999ca880aSopenharmony_ci# Set DOITPROG to "echo" to test this script. 5099ca880aSopenharmony_ci 5199ca880aSopenharmony_cidoit=${DOITPROG-} 5299ca880aSopenharmony_cidoit_exec=${doit:-exec} 5399ca880aSopenharmony_ci 5499ca880aSopenharmony_ci# Put in absolute file names if you don't have them in your path; 5599ca880aSopenharmony_ci# or use environment vars. 5699ca880aSopenharmony_ci 5799ca880aSopenharmony_cichgrpprog=${CHGRPPROG-chgrp} 5899ca880aSopenharmony_cichmodprog=${CHMODPROG-chmod} 5999ca880aSopenharmony_cichownprog=${CHOWNPROG-chown} 6099ca880aSopenharmony_cicmpprog=${CMPPROG-cmp} 6199ca880aSopenharmony_cicpprog=${CPPROG-cp} 6299ca880aSopenharmony_cimkdirprog=${MKDIRPROG-mkdir} 6399ca880aSopenharmony_cimvprog=${MVPROG-mv} 6499ca880aSopenharmony_cirmprog=${RMPROG-rm} 6599ca880aSopenharmony_cistripprog=${STRIPPROG-strip} 6699ca880aSopenharmony_ci 6799ca880aSopenharmony_ciposix_mkdir= 6899ca880aSopenharmony_ci 6999ca880aSopenharmony_ci# Desired mode of installed file. 7099ca880aSopenharmony_cimode=0755 7199ca880aSopenharmony_ci 7299ca880aSopenharmony_cichgrpcmd= 7399ca880aSopenharmony_cichmodcmd=$chmodprog 7499ca880aSopenharmony_cichowncmd= 7599ca880aSopenharmony_cimvcmd=$mvprog 7699ca880aSopenharmony_cirmcmd="$rmprog -f" 7799ca880aSopenharmony_cistripcmd= 7899ca880aSopenharmony_ci 7999ca880aSopenharmony_cisrc= 8099ca880aSopenharmony_cidst= 8199ca880aSopenharmony_cidir_arg= 8299ca880aSopenharmony_cidst_arg= 8399ca880aSopenharmony_ci 8499ca880aSopenharmony_cicopy_on_change=false 8599ca880aSopenharmony_ciis_target_a_directory=possibly 8699ca880aSopenharmony_ci 8799ca880aSopenharmony_ciusage="\ 8899ca880aSopenharmony_ciUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 8999ca880aSopenharmony_ci or: $0 [OPTION]... SRCFILES... DIRECTORY 9099ca880aSopenharmony_ci or: $0 [OPTION]... -t DIRECTORY SRCFILES... 9199ca880aSopenharmony_ci or: $0 [OPTION]... -d DIRECTORIES... 9299ca880aSopenharmony_ci 9399ca880aSopenharmony_ciIn the 1st form, copy SRCFILE to DSTFILE. 9499ca880aSopenharmony_ciIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 9599ca880aSopenharmony_ciIn the 4th, create DIRECTORIES. 9699ca880aSopenharmony_ci 9799ca880aSopenharmony_ciOptions: 9899ca880aSopenharmony_ci --help display this help and exit. 9999ca880aSopenharmony_ci --version display version info and exit. 10099ca880aSopenharmony_ci 10199ca880aSopenharmony_ci -c (ignored) 10299ca880aSopenharmony_ci -C install only if different (preserve the last data modification time) 10399ca880aSopenharmony_ci -d create directories instead of installing files. 10499ca880aSopenharmony_ci -g GROUP $chgrpprog installed files to GROUP. 10599ca880aSopenharmony_ci -m MODE $chmodprog installed files to MODE. 10699ca880aSopenharmony_ci -o USER $chownprog installed files to USER. 10799ca880aSopenharmony_ci -s $stripprog installed files. 10899ca880aSopenharmony_ci -t DIRECTORY install into DIRECTORY. 10999ca880aSopenharmony_ci -T report an error if DSTFILE is a directory. 11099ca880aSopenharmony_ci 11199ca880aSopenharmony_ciEnvironment variables override the default commands: 11299ca880aSopenharmony_ci CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 11399ca880aSopenharmony_ci RMPROG STRIPPROG 11499ca880aSopenharmony_ci" 11599ca880aSopenharmony_ci 11699ca880aSopenharmony_ciwhile test $# -ne 0; do 11799ca880aSopenharmony_ci case $1 in 11899ca880aSopenharmony_ci -c) ;; 11999ca880aSopenharmony_ci 12099ca880aSopenharmony_ci -C) copy_on_change=true;; 12199ca880aSopenharmony_ci 12299ca880aSopenharmony_ci -d) dir_arg=true;; 12399ca880aSopenharmony_ci 12499ca880aSopenharmony_ci -g) chgrpcmd="$chgrpprog $2" 12599ca880aSopenharmony_ci shift;; 12699ca880aSopenharmony_ci 12799ca880aSopenharmony_ci --help) echo "$usage"; exit $?;; 12899ca880aSopenharmony_ci 12999ca880aSopenharmony_ci -m) mode=$2 13099ca880aSopenharmony_ci case $mode in 13199ca880aSopenharmony_ci *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 13299ca880aSopenharmony_ci echo "$0: invalid mode: $mode" >&2 13399ca880aSopenharmony_ci exit 1;; 13499ca880aSopenharmony_ci esac 13599ca880aSopenharmony_ci shift;; 13699ca880aSopenharmony_ci 13799ca880aSopenharmony_ci -o) chowncmd="$chownprog $2" 13899ca880aSopenharmony_ci shift;; 13999ca880aSopenharmony_ci 14099ca880aSopenharmony_ci -s) stripcmd=$stripprog;; 14199ca880aSopenharmony_ci 14299ca880aSopenharmony_ci -t) 14399ca880aSopenharmony_ci is_target_a_directory=always 14499ca880aSopenharmony_ci dst_arg=$2 14599ca880aSopenharmony_ci # Protect names problematic for 'test' and other utilities. 14699ca880aSopenharmony_ci case $dst_arg in 14799ca880aSopenharmony_ci -* | [=\(\)!]) dst_arg=./$dst_arg;; 14899ca880aSopenharmony_ci esac 14999ca880aSopenharmony_ci shift;; 15099ca880aSopenharmony_ci 15199ca880aSopenharmony_ci -T) is_target_a_directory=never;; 15299ca880aSopenharmony_ci 15399ca880aSopenharmony_ci --version) echo "$0 $scriptversion"; exit $?;; 15499ca880aSopenharmony_ci 15599ca880aSopenharmony_ci --) shift 15699ca880aSopenharmony_ci break;; 15799ca880aSopenharmony_ci 15899ca880aSopenharmony_ci -*) echo "$0: invalid option: $1" >&2 15999ca880aSopenharmony_ci exit 1;; 16099ca880aSopenharmony_ci 16199ca880aSopenharmony_ci *) break;; 16299ca880aSopenharmony_ci esac 16399ca880aSopenharmony_ci shift 16499ca880aSopenharmony_cidone 16599ca880aSopenharmony_ci 16699ca880aSopenharmony_ci# We allow the use of options -d and -T together, by making -d 16799ca880aSopenharmony_ci# take the precedence; this is for compatibility with GNU install. 16899ca880aSopenharmony_ci 16999ca880aSopenharmony_ciif test -n "$dir_arg"; then 17099ca880aSopenharmony_ci if test -n "$dst_arg"; then 17199ca880aSopenharmony_ci echo "$0: target directory not allowed when installing a directory." >&2 17299ca880aSopenharmony_ci exit 1 17399ca880aSopenharmony_ci fi 17499ca880aSopenharmony_cifi 17599ca880aSopenharmony_ci 17699ca880aSopenharmony_ciif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 17799ca880aSopenharmony_ci # When -d is used, all remaining arguments are directories to create. 17899ca880aSopenharmony_ci # When -t is used, the destination is already specified. 17999ca880aSopenharmony_ci # Otherwise, the last argument is the destination. Remove it from $@. 18099ca880aSopenharmony_ci for arg 18199ca880aSopenharmony_ci do 18299ca880aSopenharmony_ci if test -n "$dst_arg"; then 18399ca880aSopenharmony_ci # $@ is not empty: it contains at least $arg. 18499ca880aSopenharmony_ci set fnord "$@" "$dst_arg" 18599ca880aSopenharmony_ci shift # fnord 18699ca880aSopenharmony_ci fi 18799ca880aSopenharmony_ci shift # arg 18899ca880aSopenharmony_ci dst_arg=$arg 18999ca880aSopenharmony_ci # Protect names problematic for 'test' and other utilities. 19099ca880aSopenharmony_ci case $dst_arg in 19199ca880aSopenharmony_ci -* | [=\(\)!]) dst_arg=./$dst_arg;; 19299ca880aSopenharmony_ci esac 19399ca880aSopenharmony_ci done 19499ca880aSopenharmony_cifi 19599ca880aSopenharmony_ci 19699ca880aSopenharmony_ciif test $# -eq 0; then 19799ca880aSopenharmony_ci if test -z "$dir_arg"; then 19899ca880aSopenharmony_ci echo "$0: no input file specified." >&2 19999ca880aSopenharmony_ci exit 1 20099ca880aSopenharmony_ci fi 20199ca880aSopenharmony_ci # It's OK to call 'install-sh -d' without argument. 20299ca880aSopenharmony_ci # This can happen when creating conditional directories. 20399ca880aSopenharmony_ci exit 0 20499ca880aSopenharmony_cifi 20599ca880aSopenharmony_ci 20699ca880aSopenharmony_ciif test -z "$dir_arg"; then 20799ca880aSopenharmony_ci if test $# -gt 1 || test "$is_target_a_directory" = always; then 20899ca880aSopenharmony_ci if test ! -d "$dst_arg"; then 20999ca880aSopenharmony_ci echo "$0: $dst_arg: Is not a directory." >&2 21099ca880aSopenharmony_ci exit 1 21199ca880aSopenharmony_ci fi 21299ca880aSopenharmony_ci fi 21399ca880aSopenharmony_cifi 21499ca880aSopenharmony_ci 21599ca880aSopenharmony_ciif test -z "$dir_arg"; then 21699ca880aSopenharmony_ci do_exit='(exit $ret); exit $ret' 21799ca880aSopenharmony_ci trap "ret=129; $do_exit" 1 21899ca880aSopenharmony_ci trap "ret=130; $do_exit" 2 21999ca880aSopenharmony_ci trap "ret=141; $do_exit" 13 22099ca880aSopenharmony_ci trap "ret=143; $do_exit" 15 22199ca880aSopenharmony_ci 22299ca880aSopenharmony_ci # Set umask so as not to create temps with too-generous modes. 22399ca880aSopenharmony_ci # However, 'strip' requires both read and write access to temps. 22499ca880aSopenharmony_ci case $mode in 22599ca880aSopenharmony_ci # Optimize common cases. 22699ca880aSopenharmony_ci *644) cp_umask=133;; 22799ca880aSopenharmony_ci *755) cp_umask=22;; 22899ca880aSopenharmony_ci 22999ca880aSopenharmony_ci *[0-7]) 23099ca880aSopenharmony_ci if test -z "$stripcmd"; then 23199ca880aSopenharmony_ci u_plus_rw= 23299ca880aSopenharmony_ci else 23399ca880aSopenharmony_ci u_plus_rw='% 200' 23499ca880aSopenharmony_ci fi 23599ca880aSopenharmony_ci cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 23699ca880aSopenharmony_ci *) 23799ca880aSopenharmony_ci if test -z "$stripcmd"; then 23899ca880aSopenharmony_ci u_plus_rw= 23999ca880aSopenharmony_ci else 24099ca880aSopenharmony_ci u_plus_rw=,u+rw 24199ca880aSopenharmony_ci fi 24299ca880aSopenharmony_ci cp_umask=$mode$u_plus_rw;; 24399ca880aSopenharmony_ci esac 24499ca880aSopenharmony_cifi 24599ca880aSopenharmony_ci 24699ca880aSopenharmony_cifor src 24799ca880aSopenharmony_cido 24899ca880aSopenharmony_ci # Protect names problematic for 'test' and other utilities. 24999ca880aSopenharmony_ci case $src in 25099ca880aSopenharmony_ci -* | [=\(\)!]) src=./$src;; 25199ca880aSopenharmony_ci esac 25299ca880aSopenharmony_ci 25399ca880aSopenharmony_ci if test -n "$dir_arg"; then 25499ca880aSopenharmony_ci dst=$src 25599ca880aSopenharmony_ci dstdir=$dst 25699ca880aSopenharmony_ci test -d "$dstdir" 25799ca880aSopenharmony_ci dstdir_status=$? 25899ca880aSopenharmony_ci else 25999ca880aSopenharmony_ci 26099ca880aSopenharmony_ci # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 26199ca880aSopenharmony_ci # might cause directories to be created, which would be especially bad 26299ca880aSopenharmony_ci # if $src (and thus $dsttmp) contains '*'. 26399ca880aSopenharmony_ci if test ! -f "$src" && test ! -d "$src"; then 26499ca880aSopenharmony_ci echo "$0: $src does not exist." >&2 26599ca880aSopenharmony_ci exit 1 26699ca880aSopenharmony_ci fi 26799ca880aSopenharmony_ci 26899ca880aSopenharmony_ci if test -z "$dst_arg"; then 26999ca880aSopenharmony_ci echo "$0: no destination specified." >&2 27099ca880aSopenharmony_ci exit 1 27199ca880aSopenharmony_ci fi 27299ca880aSopenharmony_ci dst=$dst_arg 27399ca880aSopenharmony_ci 27499ca880aSopenharmony_ci # If destination is a directory, append the input filename. 27599ca880aSopenharmony_ci if test -d "$dst"; then 27699ca880aSopenharmony_ci if test "$is_target_a_directory" = never; then 27799ca880aSopenharmony_ci echo "$0: $dst_arg: Is a directory" >&2 27899ca880aSopenharmony_ci exit 1 27999ca880aSopenharmony_ci fi 28099ca880aSopenharmony_ci dstdir=$dst 28199ca880aSopenharmony_ci dstbase=`basename "$src"` 28299ca880aSopenharmony_ci case $dst in 28399ca880aSopenharmony_ci */) dst=$dst$dstbase;; 28499ca880aSopenharmony_ci *) dst=$dst/$dstbase;; 28599ca880aSopenharmony_ci esac 28699ca880aSopenharmony_ci dstdir_status=0 28799ca880aSopenharmony_ci else 28899ca880aSopenharmony_ci dstdir=`dirname "$dst"` 28999ca880aSopenharmony_ci test -d "$dstdir" 29099ca880aSopenharmony_ci dstdir_status=$? 29199ca880aSopenharmony_ci fi 29299ca880aSopenharmony_ci fi 29399ca880aSopenharmony_ci 29499ca880aSopenharmony_ci case $dstdir in 29599ca880aSopenharmony_ci */) dstdirslash=$dstdir;; 29699ca880aSopenharmony_ci *) dstdirslash=$dstdir/;; 29799ca880aSopenharmony_ci esac 29899ca880aSopenharmony_ci 29999ca880aSopenharmony_ci obsolete_mkdir_used=false 30099ca880aSopenharmony_ci 30199ca880aSopenharmony_ci if test $dstdir_status != 0; then 30299ca880aSopenharmony_ci case $posix_mkdir in 30399ca880aSopenharmony_ci '') 30499ca880aSopenharmony_ci # Create intermediate dirs using mode 755 as modified by the umask. 30599ca880aSopenharmony_ci # This is like FreeBSD 'install' as of 1997-10-28. 30699ca880aSopenharmony_ci umask=`umask` 30799ca880aSopenharmony_ci case $stripcmd.$umask in 30899ca880aSopenharmony_ci # Optimize common cases. 30999ca880aSopenharmony_ci *[2367][2367]) mkdir_umask=$umask;; 31099ca880aSopenharmony_ci .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 31199ca880aSopenharmony_ci 31299ca880aSopenharmony_ci *[0-7]) 31399ca880aSopenharmony_ci mkdir_umask=`expr $umask + 22 \ 31499ca880aSopenharmony_ci - $umask % 100 % 40 + $umask % 20 \ 31599ca880aSopenharmony_ci - $umask % 10 % 4 + $umask % 2 31699ca880aSopenharmony_ci `;; 31799ca880aSopenharmony_ci *) mkdir_umask=$umask,go-w;; 31899ca880aSopenharmony_ci esac 31999ca880aSopenharmony_ci 32099ca880aSopenharmony_ci # With -d, create the new directory with the user-specified mode. 32199ca880aSopenharmony_ci # Otherwise, rely on $mkdir_umask. 32299ca880aSopenharmony_ci if test -n "$dir_arg"; then 32399ca880aSopenharmony_ci mkdir_mode=-m$mode 32499ca880aSopenharmony_ci else 32599ca880aSopenharmony_ci mkdir_mode= 32699ca880aSopenharmony_ci fi 32799ca880aSopenharmony_ci 32899ca880aSopenharmony_ci posix_mkdir=false 32999ca880aSopenharmony_ci case $umask in 33099ca880aSopenharmony_ci *[123567][0-7][0-7]) 33199ca880aSopenharmony_ci # POSIX mkdir -p sets u+wx bits regardless of umask, which 33299ca880aSopenharmony_ci # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 33399ca880aSopenharmony_ci ;; 33499ca880aSopenharmony_ci *) 33599ca880aSopenharmony_ci # Note that $RANDOM variable is not portable (e.g. dash); Use it 33699ca880aSopenharmony_ci # here however when possible just to lower collision chance. 33799ca880aSopenharmony_ci tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 33899ca880aSopenharmony_ci 33999ca880aSopenharmony_ci trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 34099ca880aSopenharmony_ci 34199ca880aSopenharmony_ci # Because "mkdir -p" follows existing symlinks and we likely work 34299ca880aSopenharmony_ci # directly in world-writeable /tmp, make sure that the '$tmpdir' 34399ca880aSopenharmony_ci # directory is successfully created first before we actually test 34499ca880aSopenharmony_ci # 'mkdir -p' feature. 34599ca880aSopenharmony_ci if (umask $mkdir_umask && 34699ca880aSopenharmony_ci $mkdirprog $mkdir_mode "$tmpdir" && 34799ca880aSopenharmony_ci exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 34899ca880aSopenharmony_ci then 34999ca880aSopenharmony_ci if test -z "$dir_arg" || { 35099ca880aSopenharmony_ci # Check for POSIX incompatibilities with -m. 35199ca880aSopenharmony_ci # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35299ca880aSopenharmony_ci # other-writable bit of parent directory when it shouldn't. 35399ca880aSopenharmony_ci # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35499ca880aSopenharmony_ci test_tmpdir="$tmpdir/a" 35599ca880aSopenharmony_ci ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 35699ca880aSopenharmony_ci case $ls_ld_tmpdir in 35799ca880aSopenharmony_ci d????-?r-*) different_mode=700;; 35899ca880aSopenharmony_ci d????-?--*) different_mode=755;; 35999ca880aSopenharmony_ci *) false;; 36099ca880aSopenharmony_ci esac && 36199ca880aSopenharmony_ci $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 36299ca880aSopenharmony_ci ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 36399ca880aSopenharmony_ci test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36499ca880aSopenharmony_ci } 36599ca880aSopenharmony_ci } 36699ca880aSopenharmony_ci then posix_mkdir=: 36799ca880aSopenharmony_ci fi 36899ca880aSopenharmony_ci rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 36999ca880aSopenharmony_ci else 37099ca880aSopenharmony_ci # Remove any dirs left behind by ancient mkdir implementations. 37199ca880aSopenharmony_ci rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 37299ca880aSopenharmony_ci fi 37399ca880aSopenharmony_ci trap '' 0;; 37499ca880aSopenharmony_ci esac;; 37599ca880aSopenharmony_ci esac 37699ca880aSopenharmony_ci 37799ca880aSopenharmony_ci if 37899ca880aSopenharmony_ci $posix_mkdir && ( 37999ca880aSopenharmony_ci umask $mkdir_umask && 38099ca880aSopenharmony_ci $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38199ca880aSopenharmony_ci ) 38299ca880aSopenharmony_ci then : 38399ca880aSopenharmony_ci else 38499ca880aSopenharmony_ci 38599ca880aSopenharmony_ci # The umask is ridiculous, or mkdir does not conform to POSIX, 38699ca880aSopenharmony_ci # or it failed possibly due to a race condition. Create the 38799ca880aSopenharmony_ci # directory the slow way, step by step, checking for races as we go. 38899ca880aSopenharmony_ci 38999ca880aSopenharmony_ci case $dstdir in 39099ca880aSopenharmony_ci /*) prefix='/';; 39199ca880aSopenharmony_ci [-=\(\)!]*) prefix='./';; 39299ca880aSopenharmony_ci *) prefix='';; 39399ca880aSopenharmony_ci esac 39499ca880aSopenharmony_ci 39599ca880aSopenharmony_ci oIFS=$IFS 39699ca880aSopenharmony_ci IFS=/ 39799ca880aSopenharmony_ci set -f 39899ca880aSopenharmony_ci set fnord $dstdir 39999ca880aSopenharmony_ci shift 40099ca880aSopenharmony_ci set +f 40199ca880aSopenharmony_ci IFS=$oIFS 40299ca880aSopenharmony_ci 40399ca880aSopenharmony_ci prefixes= 40499ca880aSopenharmony_ci 40599ca880aSopenharmony_ci for d 40699ca880aSopenharmony_ci do 40799ca880aSopenharmony_ci test X"$d" = X && continue 40899ca880aSopenharmony_ci 40999ca880aSopenharmony_ci prefix=$prefix$d 41099ca880aSopenharmony_ci if test -d "$prefix"; then 41199ca880aSopenharmony_ci prefixes= 41299ca880aSopenharmony_ci else 41399ca880aSopenharmony_ci if $posix_mkdir; then 41499ca880aSopenharmony_ci (umask=$mkdir_umask && 41599ca880aSopenharmony_ci $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 41699ca880aSopenharmony_ci # Don't fail if two instances are running concurrently. 41799ca880aSopenharmony_ci test -d "$prefix" || exit 1 41899ca880aSopenharmony_ci else 41999ca880aSopenharmony_ci case $prefix in 42099ca880aSopenharmony_ci *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42199ca880aSopenharmony_ci *) qprefix=$prefix;; 42299ca880aSopenharmony_ci esac 42399ca880aSopenharmony_ci prefixes="$prefixes '$qprefix'" 42499ca880aSopenharmony_ci fi 42599ca880aSopenharmony_ci fi 42699ca880aSopenharmony_ci prefix=$prefix/ 42799ca880aSopenharmony_ci done 42899ca880aSopenharmony_ci 42999ca880aSopenharmony_ci if test -n "$prefixes"; then 43099ca880aSopenharmony_ci # Don't fail if two instances are running concurrently. 43199ca880aSopenharmony_ci (umask $mkdir_umask && 43299ca880aSopenharmony_ci eval "\$doit_exec \$mkdirprog $prefixes") || 43399ca880aSopenharmony_ci test -d "$dstdir" || exit 1 43499ca880aSopenharmony_ci obsolete_mkdir_used=true 43599ca880aSopenharmony_ci fi 43699ca880aSopenharmony_ci fi 43799ca880aSopenharmony_ci fi 43899ca880aSopenharmony_ci 43999ca880aSopenharmony_ci if test -n "$dir_arg"; then 44099ca880aSopenharmony_ci { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44199ca880aSopenharmony_ci { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44299ca880aSopenharmony_ci { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44399ca880aSopenharmony_ci test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 44499ca880aSopenharmony_ci else 44599ca880aSopenharmony_ci 44699ca880aSopenharmony_ci # Make a couple of temp file names in the proper directory. 44799ca880aSopenharmony_ci dsttmp=${dstdirslash}_inst.$$_ 44899ca880aSopenharmony_ci rmtmp=${dstdirslash}_rm.$$_ 44999ca880aSopenharmony_ci 45099ca880aSopenharmony_ci # Trap to clean up those temp files at exit. 45199ca880aSopenharmony_ci trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45299ca880aSopenharmony_ci 45399ca880aSopenharmony_ci # Copy the file name to the temp name. 45499ca880aSopenharmony_ci (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 45599ca880aSopenharmony_ci 45699ca880aSopenharmony_ci # and set any options; do chmod last to preserve setuid bits. 45799ca880aSopenharmony_ci # 45899ca880aSopenharmony_ci # If any of these fail, we abort the whole thing. If we want to 45999ca880aSopenharmony_ci # ignore errors from any of these, just make sure not to ignore 46099ca880aSopenharmony_ci # errors from the above "$doit $cpprog $src $dsttmp" command. 46199ca880aSopenharmony_ci # 46299ca880aSopenharmony_ci { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46399ca880aSopenharmony_ci { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 46499ca880aSopenharmony_ci { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 46599ca880aSopenharmony_ci { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 46699ca880aSopenharmony_ci 46799ca880aSopenharmony_ci # If -C, don't bother to copy if it wouldn't change the file. 46899ca880aSopenharmony_ci if $copy_on_change && 46999ca880aSopenharmony_ci old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 47099ca880aSopenharmony_ci new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47199ca880aSopenharmony_ci set -f && 47299ca880aSopenharmony_ci set X $old && old=:$2:$4:$5:$6 && 47399ca880aSopenharmony_ci set X $new && new=:$2:$4:$5:$6 && 47499ca880aSopenharmony_ci set +f && 47599ca880aSopenharmony_ci test "$old" = "$new" && 47699ca880aSopenharmony_ci $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 47799ca880aSopenharmony_ci then 47899ca880aSopenharmony_ci rm -f "$dsttmp" 47999ca880aSopenharmony_ci else 48099ca880aSopenharmony_ci # Rename the file to the real destination. 48199ca880aSopenharmony_ci $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 48299ca880aSopenharmony_ci 48399ca880aSopenharmony_ci # The rename failed, perhaps because mv can't rename something else 48499ca880aSopenharmony_ci # to itself, or perhaps because mv is so ancient that it does not 48599ca880aSopenharmony_ci # support -f. 48699ca880aSopenharmony_ci { 48799ca880aSopenharmony_ci # Now remove or move aside any old file at destination location. 48899ca880aSopenharmony_ci # We try this two ways since rm can't unlink itself on some 48999ca880aSopenharmony_ci # systems and the destination file might be busy for other 49099ca880aSopenharmony_ci # reasons. In this case, the final cleanup might fail but the new 49199ca880aSopenharmony_ci # file should still install successfully. 49299ca880aSopenharmony_ci { 49399ca880aSopenharmony_ci test ! -f "$dst" || 49499ca880aSopenharmony_ci $doit $rmcmd -f "$dst" 2>/dev/null || 49599ca880aSopenharmony_ci { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 49699ca880aSopenharmony_ci { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 49799ca880aSopenharmony_ci } || 49899ca880aSopenharmony_ci { echo "$0: cannot unlink or rename $dst" >&2 49999ca880aSopenharmony_ci (exit 1); exit 1 50099ca880aSopenharmony_ci } 50199ca880aSopenharmony_ci } && 50299ca880aSopenharmony_ci 50399ca880aSopenharmony_ci # Now rename the file to the real destination. 50499ca880aSopenharmony_ci $doit $mvcmd "$dsttmp" "$dst" 50599ca880aSopenharmony_ci } 50699ca880aSopenharmony_ci fi || exit 1 50799ca880aSopenharmony_ci 50899ca880aSopenharmony_ci trap '' 0 50999ca880aSopenharmony_ci fi 51099ca880aSopenharmony_cidone 51199ca880aSopenharmony_ci 51299ca880aSopenharmony_ci# Local variables: 51399ca880aSopenharmony_ci# eval: (add-hook 'before-save-hook 'time-stamp) 51499ca880aSopenharmony_ci# time-stamp-start: "scriptversion=" 51599ca880aSopenharmony_ci# time-stamp-format: "%:y-%02m-%02d.%02H" 51699ca880aSopenharmony_ci# time-stamp-time-zone: "UTC0" 51799ca880aSopenharmony_ci# time-stamp-end: "; # UTC" 51899ca880aSopenharmony_ci# End: 519