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