1c0abf9e6Sopenharmony_ci#!/bin/sh 2c0abf9e6Sopenharmony_ci# install - install a program, script, or datafile 3c0abf9e6Sopenharmony_ci 4c0abf9e6Sopenharmony_ciscriptversion=2020-11-14.01; # UTC 5c0abf9e6Sopenharmony_ci 6c0abf9e6Sopenharmony_ci# This originates from X11R5 (mit/util/scripts/install.sh), which was 7c0abf9e6Sopenharmony_ci# later released in X11R6 (xc/config/util/install.sh) with the 8c0abf9e6Sopenharmony_ci# following copyright and license. 9c0abf9e6Sopenharmony_ci# 10c0abf9e6Sopenharmony_ci# Copyright (C) 1994 X Consortium 11c0abf9e6Sopenharmony_ci# 12c0abf9e6Sopenharmony_ci# Permission is hereby granted, free of charge, to any person obtaining a copy 13c0abf9e6Sopenharmony_ci# of this software and associated documentation files (the "Software"), to 14c0abf9e6Sopenharmony_ci# deal in the Software without restriction, including without limitation the 15c0abf9e6Sopenharmony_ci# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16c0abf9e6Sopenharmony_ci# sell copies of the Software, and to permit persons to whom the Software is 17c0abf9e6Sopenharmony_ci# furnished to do so, subject to the following conditions: 18c0abf9e6Sopenharmony_ci# 19c0abf9e6Sopenharmony_ci# The above copyright notice and this permission notice shall be included in 20c0abf9e6Sopenharmony_ci# all copies or substantial portions of the Software. 21c0abf9e6Sopenharmony_ci# 22c0abf9e6Sopenharmony_ci# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23c0abf9e6Sopenharmony_ci# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24c0abf9e6Sopenharmony_ci# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25c0abf9e6Sopenharmony_ci# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26c0abf9e6Sopenharmony_ci# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27c0abf9e6Sopenharmony_ci# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28c0abf9e6Sopenharmony_ci# 29c0abf9e6Sopenharmony_ci# Except as contained in this notice, the name of the X Consortium shall not 30c0abf9e6Sopenharmony_ci# be used in advertising or otherwise to promote the sale, use or other deal- 31c0abf9e6Sopenharmony_ci# ings in this Software without prior written authorization from the X Consor- 32c0abf9e6Sopenharmony_ci# tium. 33c0abf9e6Sopenharmony_ci# 34c0abf9e6Sopenharmony_ci# 35c0abf9e6Sopenharmony_ci# FSF changes to this file are in the public domain. 36c0abf9e6Sopenharmony_ci# 37c0abf9e6Sopenharmony_ci# Calling this script install-sh is preferred over install.sh, to prevent 38c0abf9e6Sopenharmony_ci# 'make' implicit rules from creating a file called install from it 39c0abf9e6Sopenharmony_ci# when there is no Makefile. 40c0abf9e6Sopenharmony_ci# 41c0abf9e6Sopenharmony_ci# This script is compatible with the BSD install script, but was written 42c0abf9e6Sopenharmony_ci# from scratch. 43c0abf9e6Sopenharmony_ci 44c0abf9e6Sopenharmony_citab=' ' 45c0abf9e6Sopenharmony_cinl=' 46c0abf9e6Sopenharmony_ci' 47c0abf9e6Sopenharmony_ciIFS=" $tab$nl" 48c0abf9e6Sopenharmony_ci 49c0abf9e6Sopenharmony_ci# Set DOITPROG to "echo" to test this script. 50c0abf9e6Sopenharmony_ci 51c0abf9e6Sopenharmony_cidoit=${DOITPROG-} 52c0abf9e6Sopenharmony_cidoit_exec=${doit:-exec} 53c0abf9e6Sopenharmony_ci 54c0abf9e6Sopenharmony_ci# Put in absolute file names if you don't have them in your path; 55c0abf9e6Sopenharmony_ci# or use environment vars. 56c0abf9e6Sopenharmony_ci 57c0abf9e6Sopenharmony_cichgrpprog=${CHGRPPROG-chgrp} 58c0abf9e6Sopenharmony_cichmodprog=${CHMODPROG-chmod} 59c0abf9e6Sopenharmony_cichownprog=${CHOWNPROG-chown} 60c0abf9e6Sopenharmony_cicmpprog=${CMPPROG-cmp} 61c0abf9e6Sopenharmony_cicpprog=${CPPROG-cp} 62c0abf9e6Sopenharmony_cimkdirprog=${MKDIRPROG-mkdir} 63c0abf9e6Sopenharmony_cimvprog=${MVPROG-mv} 64c0abf9e6Sopenharmony_cirmprog=${RMPROG-rm} 65c0abf9e6Sopenharmony_cistripprog=${STRIPPROG-strip} 66c0abf9e6Sopenharmony_ci 67c0abf9e6Sopenharmony_ciposix_mkdir= 68c0abf9e6Sopenharmony_ci 69c0abf9e6Sopenharmony_ci# Desired mode of installed file. 70c0abf9e6Sopenharmony_cimode=0755 71c0abf9e6Sopenharmony_ci 72c0abf9e6Sopenharmony_ci# Create dirs (including intermediate dirs) using mode 755. 73c0abf9e6Sopenharmony_ci# This is like GNU 'install' as of coreutils 8.32 (2020). 74c0abf9e6Sopenharmony_cimkdir_umask=22 75c0abf9e6Sopenharmony_ci 76c0abf9e6Sopenharmony_cibackupsuffix= 77c0abf9e6Sopenharmony_cichgrpcmd= 78c0abf9e6Sopenharmony_cichmodcmd=$chmodprog 79c0abf9e6Sopenharmony_cichowncmd= 80c0abf9e6Sopenharmony_cimvcmd=$mvprog 81c0abf9e6Sopenharmony_cirmcmd="$rmprog -f" 82c0abf9e6Sopenharmony_cistripcmd= 83c0abf9e6Sopenharmony_ci 84c0abf9e6Sopenharmony_cisrc= 85c0abf9e6Sopenharmony_cidst= 86c0abf9e6Sopenharmony_cidir_arg= 87c0abf9e6Sopenharmony_cidst_arg= 88c0abf9e6Sopenharmony_ci 89c0abf9e6Sopenharmony_cicopy_on_change=false 90c0abf9e6Sopenharmony_ciis_target_a_directory=possibly 91c0abf9e6Sopenharmony_ci 92c0abf9e6Sopenharmony_ciusage="\ 93c0abf9e6Sopenharmony_ciUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 94c0abf9e6Sopenharmony_ci or: $0 [OPTION]... SRCFILES... DIRECTORY 95c0abf9e6Sopenharmony_ci or: $0 [OPTION]... -t DIRECTORY SRCFILES... 96c0abf9e6Sopenharmony_ci or: $0 [OPTION]... -d DIRECTORIES... 97c0abf9e6Sopenharmony_ci 98c0abf9e6Sopenharmony_ciIn the 1st form, copy SRCFILE to DSTFILE. 99c0abf9e6Sopenharmony_ciIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 100c0abf9e6Sopenharmony_ciIn the 4th, create DIRECTORIES. 101c0abf9e6Sopenharmony_ci 102c0abf9e6Sopenharmony_ciOptions: 103c0abf9e6Sopenharmony_ci --help display this help and exit. 104c0abf9e6Sopenharmony_ci --version display version info and exit. 105c0abf9e6Sopenharmony_ci 106c0abf9e6Sopenharmony_ci -c (ignored) 107c0abf9e6Sopenharmony_ci -C install only if different (preserve data modification time) 108c0abf9e6Sopenharmony_ci -d create directories instead of installing files. 109c0abf9e6Sopenharmony_ci -g GROUP $chgrpprog installed files to GROUP. 110c0abf9e6Sopenharmony_ci -m MODE $chmodprog installed files to MODE. 111c0abf9e6Sopenharmony_ci -o USER $chownprog installed files to USER. 112c0abf9e6Sopenharmony_ci -p pass -p to $cpprog. 113c0abf9e6Sopenharmony_ci -s $stripprog installed files. 114c0abf9e6Sopenharmony_ci -S SUFFIX attempt to back up existing files, with suffix SUFFIX. 115c0abf9e6Sopenharmony_ci -t DIRECTORY install into DIRECTORY. 116c0abf9e6Sopenharmony_ci -T report an error if DSTFILE is a directory. 117c0abf9e6Sopenharmony_ci 118c0abf9e6Sopenharmony_ciEnvironment variables override the default commands: 119c0abf9e6Sopenharmony_ci CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 120c0abf9e6Sopenharmony_ci RMPROG STRIPPROG 121c0abf9e6Sopenharmony_ci 122c0abf9e6Sopenharmony_ciBy default, rm is invoked with -f; when overridden with RMPROG, 123c0abf9e6Sopenharmony_ciit's up to you to specify -f if you want it. 124c0abf9e6Sopenharmony_ci 125c0abf9e6Sopenharmony_ciIf -S is not specified, no backups are attempted. 126c0abf9e6Sopenharmony_ci 127c0abf9e6Sopenharmony_ciEmail bug reports to bug-automake@gnu.org. 128c0abf9e6Sopenharmony_ciAutomake home page: https://www.gnu.org/software/automake/ 129c0abf9e6Sopenharmony_ci" 130c0abf9e6Sopenharmony_ci 131c0abf9e6Sopenharmony_ciwhile test $# -ne 0; do 132c0abf9e6Sopenharmony_ci case $1 in 133c0abf9e6Sopenharmony_ci -c) ;; 134c0abf9e6Sopenharmony_ci 135c0abf9e6Sopenharmony_ci -C) copy_on_change=true;; 136c0abf9e6Sopenharmony_ci 137c0abf9e6Sopenharmony_ci -d) dir_arg=true;; 138c0abf9e6Sopenharmony_ci 139c0abf9e6Sopenharmony_ci -g) chgrpcmd="$chgrpprog $2" 140c0abf9e6Sopenharmony_ci shift;; 141c0abf9e6Sopenharmony_ci 142c0abf9e6Sopenharmony_ci --help) echo "$usage"; exit $?;; 143c0abf9e6Sopenharmony_ci 144c0abf9e6Sopenharmony_ci -m) mode=$2 145c0abf9e6Sopenharmony_ci case $mode in 146c0abf9e6Sopenharmony_ci *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 147c0abf9e6Sopenharmony_ci echo "$0: invalid mode: $mode" >&2 148c0abf9e6Sopenharmony_ci exit 1;; 149c0abf9e6Sopenharmony_ci esac 150c0abf9e6Sopenharmony_ci shift;; 151c0abf9e6Sopenharmony_ci 152c0abf9e6Sopenharmony_ci -o) chowncmd="$chownprog $2" 153c0abf9e6Sopenharmony_ci shift;; 154c0abf9e6Sopenharmony_ci 155c0abf9e6Sopenharmony_ci -p) cpprog="$cpprog -p";; 156c0abf9e6Sopenharmony_ci 157c0abf9e6Sopenharmony_ci -s) stripcmd=$stripprog;; 158c0abf9e6Sopenharmony_ci 159c0abf9e6Sopenharmony_ci -S) backupsuffix="$2" 160c0abf9e6Sopenharmony_ci shift;; 161c0abf9e6Sopenharmony_ci 162c0abf9e6Sopenharmony_ci -t) 163c0abf9e6Sopenharmony_ci is_target_a_directory=always 164c0abf9e6Sopenharmony_ci dst_arg=$2 165c0abf9e6Sopenharmony_ci # Protect names problematic for 'test' and other utilities. 166c0abf9e6Sopenharmony_ci case $dst_arg in 167c0abf9e6Sopenharmony_ci -* | [=\(\)!]) dst_arg=./$dst_arg;; 168c0abf9e6Sopenharmony_ci esac 169c0abf9e6Sopenharmony_ci shift;; 170c0abf9e6Sopenharmony_ci 171c0abf9e6Sopenharmony_ci -T) is_target_a_directory=never;; 172c0abf9e6Sopenharmony_ci 173c0abf9e6Sopenharmony_ci --version) echo "$0 $scriptversion"; exit $?;; 174c0abf9e6Sopenharmony_ci 175c0abf9e6Sopenharmony_ci --) shift 176c0abf9e6Sopenharmony_ci break;; 177c0abf9e6Sopenharmony_ci 178c0abf9e6Sopenharmony_ci -*) echo "$0: invalid option: $1" >&2 179c0abf9e6Sopenharmony_ci exit 1;; 180c0abf9e6Sopenharmony_ci 181c0abf9e6Sopenharmony_ci *) break;; 182c0abf9e6Sopenharmony_ci esac 183c0abf9e6Sopenharmony_ci shift 184c0abf9e6Sopenharmony_cidone 185c0abf9e6Sopenharmony_ci 186c0abf9e6Sopenharmony_ci# We allow the use of options -d and -T together, by making -d 187c0abf9e6Sopenharmony_ci# take the precedence; this is for compatibility with GNU install. 188c0abf9e6Sopenharmony_ci 189c0abf9e6Sopenharmony_ciif test -n "$dir_arg"; then 190c0abf9e6Sopenharmony_ci if test -n "$dst_arg"; then 191c0abf9e6Sopenharmony_ci echo "$0: target directory not allowed when installing a directory." >&2 192c0abf9e6Sopenharmony_ci exit 1 193c0abf9e6Sopenharmony_ci fi 194c0abf9e6Sopenharmony_cifi 195c0abf9e6Sopenharmony_ci 196c0abf9e6Sopenharmony_ciif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 197c0abf9e6Sopenharmony_ci # When -d is used, all remaining arguments are directories to create. 198c0abf9e6Sopenharmony_ci # When -t is used, the destination is already specified. 199c0abf9e6Sopenharmony_ci # Otherwise, the last argument is the destination. Remove it from $@. 200c0abf9e6Sopenharmony_ci for arg 201c0abf9e6Sopenharmony_ci do 202c0abf9e6Sopenharmony_ci if test -n "$dst_arg"; then 203c0abf9e6Sopenharmony_ci # $@ is not empty: it contains at least $arg. 204c0abf9e6Sopenharmony_ci set fnord "$@" "$dst_arg" 205c0abf9e6Sopenharmony_ci shift # fnord 206c0abf9e6Sopenharmony_ci fi 207c0abf9e6Sopenharmony_ci shift # arg 208c0abf9e6Sopenharmony_ci dst_arg=$arg 209c0abf9e6Sopenharmony_ci # Protect names problematic for 'test' and other utilities. 210c0abf9e6Sopenharmony_ci case $dst_arg in 211c0abf9e6Sopenharmony_ci -* | [=\(\)!]) dst_arg=./$dst_arg;; 212c0abf9e6Sopenharmony_ci esac 213c0abf9e6Sopenharmony_ci done 214c0abf9e6Sopenharmony_cifi 215c0abf9e6Sopenharmony_ci 216c0abf9e6Sopenharmony_ciif test $# -eq 0; then 217c0abf9e6Sopenharmony_ci if test -z "$dir_arg"; then 218c0abf9e6Sopenharmony_ci echo "$0: no input file specified." >&2 219c0abf9e6Sopenharmony_ci exit 1 220c0abf9e6Sopenharmony_ci fi 221c0abf9e6Sopenharmony_ci # It's OK to call 'install-sh -d' without argument. 222c0abf9e6Sopenharmony_ci # This can happen when creating conditional directories. 223c0abf9e6Sopenharmony_ci exit 0 224c0abf9e6Sopenharmony_cifi 225c0abf9e6Sopenharmony_ci 226c0abf9e6Sopenharmony_ciif test -z "$dir_arg"; then 227c0abf9e6Sopenharmony_ci if test $# -gt 1 || test "$is_target_a_directory" = always; then 228c0abf9e6Sopenharmony_ci if test ! -d "$dst_arg"; then 229c0abf9e6Sopenharmony_ci echo "$0: $dst_arg: Is not a directory." >&2 230c0abf9e6Sopenharmony_ci exit 1 231c0abf9e6Sopenharmony_ci fi 232c0abf9e6Sopenharmony_ci fi 233c0abf9e6Sopenharmony_cifi 234c0abf9e6Sopenharmony_ci 235c0abf9e6Sopenharmony_ciif test -z "$dir_arg"; then 236c0abf9e6Sopenharmony_ci do_exit='(exit $ret); exit $ret' 237c0abf9e6Sopenharmony_ci trap "ret=129; $do_exit" 1 238c0abf9e6Sopenharmony_ci trap "ret=130; $do_exit" 2 239c0abf9e6Sopenharmony_ci trap "ret=141; $do_exit" 13 240c0abf9e6Sopenharmony_ci trap "ret=143; $do_exit" 15 241c0abf9e6Sopenharmony_ci 242c0abf9e6Sopenharmony_ci # Set umask so as not to create temps with too-generous modes. 243c0abf9e6Sopenharmony_ci # However, 'strip' requires both read and write access to temps. 244c0abf9e6Sopenharmony_ci case $mode in 245c0abf9e6Sopenharmony_ci # Optimize common cases. 246c0abf9e6Sopenharmony_ci *644) cp_umask=133;; 247c0abf9e6Sopenharmony_ci *755) cp_umask=22;; 248c0abf9e6Sopenharmony_ci 249c0abf9e6Sopenharmony_ci *[0-7]) 250c0abf9e6Sopenharmony_ci if test -z "$stripcmd"; then 251c0abf9e6Sopenharmony_ci u_plus_rw= 252c0abf9e6Sopenharmony_ci else 253c0abf9e6Sopenharmony_ci u_plus_rw='% 200' 254c0abf9e6Sopenharmony_ci fi 255c0abf9e6Sopenharmony_ci cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 256c0abf9e6Sopenharmony_ci *) 257c0abf9e6Sopenharmony_ci if test -z "$stripcmd"; then 258c0abf9e6Sopenharmony_ci u_plus_rw= 259c0abf9e6Sopenharmony_ci else 260c0abf9e6Sopenharmony_ci u_plus_rw=,u+rw 261c0abf9e6Sopenharmony_ci fi 262c0abf9e6Sopenharmony_ci cp_umask=$mode$u_plus_rw;; 263c0abf9e6Sopenharmony_ci esac 264c0abf9e6Sopenharmony_cifi 265c0abf9e6Sopenharmony_ci 266c0abf9e6Sopenharmony_cifor src 267c0abf9e6Sopenharmony_cido 268c0abf9e6Sopenharmony_ci # Protect names problematic for 'test' and other utilities. 269c0abf9e6Sopenharmony_ci case $src in 270c0abf9e6Sopenharmony_ci -* | [=\(\)!]) src=./$src;; 271c0abf9e6Sopenharmony_ci esac 272c0abf9e6Sopenharmony_ci 273c0abf9e6Sopenharmony_ci if test -n "$dir_arg"; then 274c0abf9e6Sopenharmony_ci dst=$src 275c0abf9e6Sopenharmony_ci dstdir=$dst 276c0abf9e6Sopenharmony_ci test -d "$dstdir" 277c0abf9e6Sopenharmony_ci dstdir_status=$? 278c0abf9e6Sopenharmony_ci # Don't chown directories that already exist. 279c0abf9e6Sopenharmony_ci if test $dstdir_status = 0; then 280c0abf9e6Sopenharmony_ci chowncmd="" 281c0abf9e6Sopenharmony_ci fi 282c0abf9e6Sopenharmony_ci else 283c0abf9e6Sopenharmony_ci 284c0abf9e6Sopenharmony_ci # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 285c0abf9e6Sopenharmony_ci # might cause directories to be created, which would be especially bad 286c0abf9e6Sopenharmony_ci # if $src (and thus $dsttmp) contains '*'. 287c0abf9e6Sopenharmony_ci if test ! -f "$src" && test ! -d "$src"; then 288c0abf9e6Sopenharmony_ci echo "$0: $src does not exist." >&2 289c0abf9e6Sopenharmony_ci exit 1 290c0abf9e6Sopenharmony_ci fi 291c0abf9e6Sopenharmony_ci 292c0abf9e6Sopenharmony_ci if test -z "$dst_arg"; then 293c0abf9e6Sopenharmony_ci echo "$0: no destination specified." >&2 294c0abf9e6Sopenharmony_ci exit 1 295c0abf9e6Sopenharmony_ci fi 296c0abf9e6Sopenharmony_ci dst=$dst_arg 297c0abf9e6Sopenharmony_ci 298c0abf9e6Sopenharmony_ci # If destination is a directory, append the input filename. 299c0abf9e6Sopenharmony_ci if test -d "$dst"; then 300c0abf9e6Sopenharmony_ci if test "$is_target_a_directory" = never; then 301c0abf9e6Sopenharmony_ci echo "$0: $dst_arg: Is a directory" >&2 302c0abf9e6Sopenharmony_ci exit 1 303c0abf9e6Sopenharmony_ci fi 304c0abf9e6Sopenharmony_ci dstdir=$dst 305c0abf9e6Sopenharmony_ci dstbase=`basename "$src"` 306c0abf9e6Sopenharmony_ci case $dst in 307c0abf9e6Sopenharmony_ci */) dst=$dst$dstbase;; 308c0abf9e6Sopenharmony_ci *) dst=$dst/$dstbase;; 309c0abf9e6Sopenharmony_ci esac 310c0abf9e6Sopenharmony_ci dstdir_status=0 311c0abf9e6Sopenharmony_ci else 312c0abf9e6Sopenharmony_ci dstdir=`dirname "$dst"` 313c0abf9e6Sopenharmony_ci test -d "$dstdir" 314c0abf9e6Sopenharmony_ci dstdir_status=$? 315c0abf9e6Sopenharmony_ci fi 316c0abf9e6Sopenharmony_ci fi 317c0abf9e6Sopenharmony_ci 318c0abf9e6Sopenharmony_ci case $dstdir in 319c0abf9e6Sopenharmony_ci */) dstdirslash=$dstdir;; 320c0abf9e6Sopenharmony_ci *) dstdirslash=$dstdir/;; 321c0abf9e6Sopenharmony_ci esac 322c0abf9e6Sopenharmony_ci 323c0abf9e6Sopenharmony_ci obsolete_mkdir_used=false 324c0abf9e6Sopenharmony_ci 325c0abf9e6Sopenharmony_ci if test $dstdir_status != 0; then 326c0abf9e6Sopenharmony_ci case $posix_mkdir in 327c0abf9e6Sopenharmony_ci '') 328c0abf9e6Sopenharmony_ci # With -d, create the new directory with the user-specified mode. 329c0abf9e6Sopenharmony_ci # Otherwise, rely on $mkdir_umask. 330c0abf9e6Sopenharmony_ci if test -n "$dir_arg"; then 331c0abf9e6Sopenharmony_ci mkdir_mode=-m$mode 332c0abf9e6Sopenharmony_ci else 333c0abf9e6Sopenharmony_ci mkdir_mode= 334c0abf9e6Sopenharmony_ci fi 335c0abf9e6Sopenharmony_ci 336c0abf9e6Sopenharmony_ci posix_mkdir=false 337c0abf9e6Sopenharmony_ci # The $RANDOM variable is not portable (e.g., dash). Use it 338c0abf9e6Sopenharmony_ci # here however when possible just to lower collision chance. 339c0abf9e6Sopenharmony_ci tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 340c0abf9e6Sopenharmony_ci 341c0abf9e6Sopenharmony_ci trap ' 342c0abf9e6Sopenharmony_ci ret=$? 343c0abf9e6Sopenharmony_ci rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null 344c0abf9e6Sopenharmony_ci exit $ret 345c0abf9e6Sopenharmony_ci ' 0 346c0abf9e6Sopenharmony_ci 347c0abf9e6Sopenharmony_ci # Because "mkdir -p" follows existing symlinks and we likely work 348c0abf9e6Sopenharmony_ci # directly in world-writeable /tmp, make sure that the '$tmpdir' 349c0abf9e6Sopenharmony_ci # directory is successfully created first before we actually test 350c0abf9e6Sopenharmony_ci # 'mkdir -p'. 351c0abf9e6Sopenharmony_ci if (umask $mkdir_umask && 352c0abf9e6Sopenharmony_ci $mkdirprog $mkdir_mode "$tmpdir" && 353c0abf9e6Sopenharmony_ci exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 354c0abf9e6Sopenharmony_ci then 355c0abf9e6Sopenharmony_ci if test -z "$dir_arg" || { 356c0abf9e6Sopenharmony_ci # Check for POSIX incompatibilities with -m. 357c0abf9e6Sopenharmony_ci # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 358c0abf9e6Sopenharmony_ci # other-writable bit of parent directory when it shouldn't. 359c0abf9e6Sopenharmony_ci # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 360c0abf9e6Sopenharmony_ci test_tmpdir="$tmpdir/a" 361c0abf9e6Sopenharmony_ci ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 362c0abf9e6Sopenharmony_ci case $ls_ld_tmpdir in 363c0abf9e6Sopenharmony_ci d????-?r-*) different_mode=700;; 364c0abf9e6Sopenharmony_ci d????-?--*) different_mode=755;; 365c0abf9e6Sopenharmony_ci *) false;; 366c0abf9e6Sopenharmony_ci esac && 367c0abf9e6Sopenharmony_ci $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 368c0abf9e6Sopenharmony_ci ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 369c0abf9e6Sopenharmony_ci test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 370c0abf9e6Sopenharmony_ci } 371c0abf9e6Sopenharmony_ci } 372c0abf9e6Sopenharmony_ci then posix_mkdir=: 373c0abf9e6Sopenharmony_ci fi 374c0abf9e6Sopenharmony_ci rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 375c0abf9e6Sopenharmony_ci else 376c0abf9e6Sopenharmony_ci # Remove any dirs left behind by ancient mkdir implementations. 377c0abf9e6Sopenharmony_ci rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 378c0abf9e6Sopenharmony_ci fi 379c0abf9e6Sopenharmony_ci trap '' 0;; 380c0abf9e6Sopenharmony_ci esac 381c0abf9e6Sopenharmony_ci 382c0abf9e6Sopenharmony_ci if 383c0abf9e6Sopenharmony_ci $posix_mkdir && ( 384c0abf9e6Sopenharmony_ci umask $mkdir_umask && 385c0abf9e6Sopenharmony_ci $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 386c0abf9e6Sopenharmony_ci ) 387c0abf9e6Sopenharmony_ci then : 388c0abf9e6Sopenharmony_ci else 389c0abf9e6Sopenharmony_ci 390c0abf9e6Sopenharmony_ci # mkdir does not conform to POSIX, 391c0abf9e6Sopenharmony_ci # or it failed possibly due to a race condition. Create the 392c0abf9e6Sopenharmony_ci # directory the slow way, step by step, checking for races as we go. 393c0abf9e6Sopenharmony_ci 394c0abf9e6Sopenharmony_ci case $dstdir in 395c0abf9e6Sopenharmony_ci /*) prefix='/';; 396c0abf9e6Sopenharmony_ci [-=\(\)!]*) prefix='./';; 397c0abf9e6Sopenharmony_ci *) prefix='';; 398c0abf9e6Sopenharmony_ci esac 399c0abf9e6Sopenharmony_ci 400c0abf9e6Sopenharmony_ci oIFS=$IFS 401c0abf9e6Sopenharmony_ci IFS=/ 402c0abf9e6Sopenharmony_ci set -f 403c0abf9e6Sopenharmony_ci set fnord $dstdir 404c0abf9e6Sopenharmony_ci shift 405c0abf9e6Sopenharmony_ci set +f 406c0abf9e6Sopenharmony_ci IFS=$oIFS 407c0abf9e6Sopenharmony_ci 408c0abf9e6Sopenharmony_ci prefixes= 409c0abf9e6Sopenharmony_ci 410c0abf9e6Sopenharmony_ci for d 411c0abf9e6Sopenharmony_ci do 412c0abf9e6Sopenharmony_ci test X"$d" = X && continue 413c0abf9e6Sopenharmony_ci 414c0abf9e6Sopenharmony_ci prefix=$prefix$d 415c0abf9e6Sopenharmony_ci if test -d "$prefix"; then 416c0abf9e6Sopenharmony_ci prefixes= 417c0abf9e6Sopenharmony_ci else 418c0abf9e6Sopenharmony_ci if $posix_mkdir; then 419c0abf9e6Sopenharmony_ci (umask $mkdir_umask && 420c0abf9e6Sopenharmony_ci $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 421c0abf9e6Sopenharmony_ci # Don't fail if two instances are running concurrently. 422c0abf9e6Sopenharmony_ci test -d "$prefix" || exit 1 423c0abf9e6Sopenharmony_ci else 424c0abf9e6Sopenharmony_ci case $prefix in 425c0abf9e6Sopenharmony_ci *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 426c0abf9e6Sopenharmony_ci *) qprefix=$prefix;; 427c0abf9e6Sopenharmony_ci esac 428c0abf9e6Sopenharmony_ci prefixes="$prefixes '$qprefix'" 429c0abf9e6Sopenharmony_ci fi 430c0abf9e6Sopenharmony_ci fi 431c0abf9e6Sopenharmony_ci prefix=$prefix/ 432c0abf9e6Sopenharmony_ci done 433c0abf9e6Sopenharmony_ci 434c0abf9e6Sopenharmony_ci if test -n "$prefixes"; then 435c0abf9e6Sopenharmony_ci # Don't fail if two instances are running concurrently. 436c0abf9e6Sopenharmony_ci (umask $mkdir_umask && 437c0abf9e6Sopenharmony_ci eval "\$doit_exec \$mkdirprog $prefixes") || 438c0abf9e6Sopenharmony_ci test -d "$dstdir" || exit 1 439c0abf9e6Sopenharmony_ci obsolete_mkdir_used=true 440c0abf9e6Sopenharmony_ci fi 441c0abf9e6Sopenharmony_ci fi 442c0abf9e6Sopenharmony_ci fi 443c0abf9e6Sopenharmony_ci 444c0abf9e6Sopenharmony_ci if test -n "$dir_arg"; then 445c0abf9e6Sopenharmony_ci { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 446c0abf9e6Sopenharmony_ci { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 447c0abf9e6Sopenharmony_ci { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 448c0abf9e6Sopenharmony_ci test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 449c0abf9e6Sopenharmony_ci else 450c0abf9e6Sopenharmony_ci 451c0abf9e6Sopenharmony_ci # Make a couple of temp file names in the proper directory. 452c0abf9e6Sopenharmony_ci dsttmp=${dstdirslash}_inst.$$_ 453c0abf9e6Sopenharmony_ci rmtmp=${dstdirslash}_rm.$$_ 454c0abf9e6Sopenharmony_ci 455c0abf9e6Sopenharmony_ci # Trap to clean up those temp files at exit. 456c0abf9e6Sopenharmony_ci trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 457c0abf9e6Sopenharmony_ci 458c0abf9e6Sopenharmony_ci # Copy the file name to the temp name. 459c0abf9e6Sopenharmony_ci (umask $cp_umask && 460c0abf9e6Sopenharmony_ci { test -z "$stripcmd" || { 461c0abf9e6Sopenharmony_ci # Create $dsttmp read-write so that cp doesn't create it read-only, 462c0abf9e6Sopenharmony_ci # which would cause strip to fail. 463c0abf9e6Sopenharmony_ci if test -z "$doit"; then 464c0abf9e6Sopenharmony_ci : >"$dsttmp" # No need to fork-exec 'touch'. 465c0abf9e6Sopenharmony_ci else 466c0abf9e6Sopenharmony_ci $doit touch "$dsttmp" 467c0abf9e6Sopenharmony_ci fi 468c0abf9e6Sopenharmony_ci } 469c0abf9e6Sopenharmony_ci } && 470c0abf9e6Sopenharmony_ci $doit_exec $cpprog "$src" "$dsttmp") && 471c0abf9e6Sopenharmony_ci 472c0abf9e6Sopenharmony_ci # and set any options; do chmod last to preserve setuid bits. 473c0abf9e6Sopenharmony_ci # 474c0abf9e6Sopenharmony_ci # If any of these fail, we abort the whole thing. If we want to 475c0abf9e6Sopenharmony_ci # ignore errors from any of these, just make sure not to ignore 476c0abf9e6Sopenharmony_ci # errors from the above "$doit $cpprog $src $dsttmp" command. 477c0abf9e6Sopenharmony_ci # 478c0abf9e6Sopenharmony_ci { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 479c0abf9e6Sopenharmony_ci { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 480c0abf9e6Sopenharmony_ci { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 481c0abf9e6Sopenharmony_ci { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 482c0abf9e6Sopenharmony_ci 483c0abf9e6Sopenharmony_ci # If -C, don't bother to copy if it wouldn't change the file. 484c0abf9e6Sopenharmony_ci if $copy_on_change && 485c0abf9e6Sopenharmony_ci old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 486c0abf9e6Sopenharmony_ci new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 487c0abf9e6Sopenharmony_ci set -f && 488c0abf9e6Sopenharmony_ci set X $old && old=:$2:$4:$5:$6 && 489c0abf9e6Sopenharmony_ci set X $new && new=:$2:$4:$5:$6 && 490c0abf9e6Sopenharmony_ci set +f && 491c0abf9e6Sopenharmony_ci test "$old" = "$new" && 492c0abf9e6Sopenharmony_ci $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 493c0abf9e6Sopenharmony_ci then 494c0abf9e6Sopenharmony_ci rm -f "$dsttmp" 495c0abf9e6Sopenharmony_ci else 496c0abf9e6Sopenharmony_ci # If $backupsuffix is set, and the file being installed 497c0abf9e6Sopenharmony_ci # already exists, attempt a backup. Don't worry if it fails, 498c0abf9e6Sopenharmony_ci # e.g., if mv doesn't support -f. 499c0abf9e6Sopenharmony_ci if test -n "$backupsuffix" && test -f "$dst"; then 500c0abf9e6Sopenharmony_ci $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null 501c0abf9e6Sopenharmony_ci fi 502c0abf9e6Sopenharmony_ci 503c0abf9e6Sopenharmony_ci # Rename the file to the real destination. 504c0abf9e6Sopenharmony_ci $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 505c0abf9e6Sopenharmony_ci 506c0abf9e6Sopenharmony_ci # The rename failed, perhaps because mv can't rename something else 507c0abf9e6Sopenharmony_ci # to itself, or perhaps because mv is so ancient that it does not 508c0abf9e6Sopenharmony_ci # support -f. 509c0abf9e6Sopenharmony_ci { 510c0abf9e6Sopenharmony_ci # Now remove or move aside any old file at destination location. 511c0abf9e6Sopenharmony_ci # We try this two ways since rm can't unlink itself on some 512c0abf9e6Sopenharmony_ci # systems and the destination file might be busy for other 513c0abf9e6Sopenharmony_ci # reasons. In this case, the final cleanup might fail but the new 514c0abf9e6Sopenharmony_ci # file should still install successfully. 515c0abf9e6Sopenharmony_ci { 516c0abf9e6Sopenharmony_ci test ! -f "$dst" || 517c0abf9e6Sopenharmony_ci $doit $rmcmd "$dst" 2>/dev/null || 518c0abf9e6Sopenharmony_ci { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 519c0abf9e6Sopenharmony_ci { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } 520c0abf9e6Sopenharmony_ci } || 521c0abf9e6Sopenharmony_ci { echo "$0: cannot unlink or rename $dst" >&2 522c0abf9e6Sopenharmony_ci (exit 1); exit 1 523c0abf9e6Sopenharmony_ci } 524c0abf9e6Sopenharmony_ci } && 525c0abf9e6Sopenharmony_ci 526c0abf9e6Sopenharmony_ci # Now rename the file to the real destination. 527c0abf9e6Sopenharmony_ci $doit $mvcmd "$dsttmp" "$dst" 528c0abf9e6Sopenharmony_ci } 529c0abf9e6Sopenharmony_ci fi || exit 1 530c0abf9e6Sopenharmony_ci 531c0abf9e6Sopenharmony_ci trap '' 0 532c0abf9e6Sopenharmony_ci fi 533c0abf9e6Sopenharmony_cidone 534c0abf9e6Sopenharmony_ci 535c0abf9e6Sopenharmony_ci# Local variables: 536c0abf9e6Sopenharmony_ci# eval: (add-hook 'before-save-hook 'time-stamp) 537c0abf9e6Sopenharmony_ci# time-stamp-start: "scriptversion=" 538c0abf9e6Sopenharmony_ci# time-stamp-format: "%:y-%02m-%02d.%02H" 539c0abf9e6Sopenharmony_ci# time-stamp-time-zone: "UTC0" 540c0abf9e6Sopenharmony_ci# time-stamp-end: "; # UTC" 541c0abf9e6Sopenharmony_ci# End: 542