176404edcSAsim Jamshed#!/bin/sh 276404edcSAsim Jamshed# install - install a program, script, or datafile 376404edcSAsim Jamshed 4d270d183SAsim Jamshedscriptversion=2013-12-25.23; # UTC 576404edcSAsim Jamshed 676404edcSAsim Jamshed# This originates from X11R5 (mit/util/scripts/install.sh), which was 776404edcSAsim Jamshed# later released in X11R6 (xc/config/util/install.sh) with the 876404edcSAsim Jamshed# following copyright and license. 976404edcSAsim Jamshed# 1076404edcSAsim Jamshed# Copyright (C) 1994 X Consortium 1176404edcSAsim Jamshed# 1276404edcSAsim Jamshed# Permission is hereby granted, free of charge, to any person obtaining a copy 1376404edcSAsim Jamshed# of this software and associated documentation files (the "Software"), to 1476404edcSAsim Jamshed# deal in the Software without restriction, including without limitation the 1576404edcSAsim Jamshed# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1676404edcSAsim Jamshed# sell copies of the Software, and to permit persons to whom the Software is 1776404edcSAsim Jamshed# furnished to do so, subject to the following conditions: 1876404edcSAsim Jamshed# 1976404edcSAsim Jamshed# The above copyright notice and this permission notice shall be included in 2076404edcSAsim Jamshed# all copies or substantial portions of the Software. 2176404edcSAsim Jamshed# 2276404edcSAsim Jamshed# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2376404edcSAsim Jamshed# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2476404edcSAsim Jamshed# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2576404edcSAsim Jamshed# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2676404edcSAsim Jamshed# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2776404edcSAsim Jamshed# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2876404edcSAsim Jamshed# 2976404edcSAsim Jamshed# Except as contained in this notice, the name of the X Consortium shall not 3076404edcSAsim Jamshed# be used in advertising or otherwise to promote the sale, use or other deal- 3176404edcSAsim Jamshed# ings in this Software without prior written authorization from the X Consor- 3276404edcSAsim Jamshed# tium. 3376404edcSAsim Jamshed# 3476404edcSAsim Jamshed# 3576404edcSAsim Jamshed# FSF changes to this file are in the public domain. 3676404edcSAsim Jamshed# 3776404edcSAsim Jamshed# Calling this script install-sh is preferred over install.sh, to prevent 38d270d183SAsim Jamshed# 'make' implicit rules from creating a file called install from it 3976404edcSAsim Jamshed# when there is no Makefile. 4076404edcSAsim Jamshed# 4176404edcSAsim Jamshed# This script is compatible with the BSD install script, but was written 4276404edcSAsim Jamshed# from scratch. 4376404edcSAsim Jamshed 44d270d183SAsim Jamshedtab=' ' 4576404edcSAsim Jamshednl=' 4676404edcSAsim Jamshed' 47d270d183SAsim JamshedIFS=" $tab$nl" 4876404edcSAsim Jamshed 49d270d183SAsim Jamshed# Set DOITPROG to "echo" to test this script. 5076404edcSAsim Jamshed 5176404edcSAsim Jamsheddoit=${DOITPROG-} 52d270d183SAsim Jamsheddoit_exec=${doit:-exec} 5376404edcSAsim Jamshed 5476404edcSAsim Jamshed# Put in absolute file names if you don't have them in your path; 5576404edcSAsim Jamshed# or use environment vars. 5676404edcSAsim Jamshed 5776404edcSAsim Jamshedchgrpprog=${CHGRPPROG-chgrp} 5876404edcSAsim Jamshedchmodprog=${CHMODPROG-chmod} 5976404edcSAsim Jamshedchownprog=${CHOWNPROG-chown} 6076404edcSAsim Jamshedcmpprog=${CMPPROG-cmp} 6176404edcSAsim Jamshedcpprog=${CPPROG-cp} 6276404edcSAsim Jamshedmkdirprog=${MKDIRPROG-mkdir} 6376404edcSAsim Jamshedmvprog=${MVPROG-mv} 6476404edcSAsim Jamshedrmprog=${RMPROG-rm} 6576404edcSAsim Jamshedstripprog=${STRIPPROG-strip} 6676404edcSAsim Jamshed 6776404edcSAsim Jamshedposix_mkdir= 6876404edcSAsim Jamshed 6976404edcSAsim Jamshed# Desired mode of installed file. 7076404edcSAsim Jamshedmode=0755 7176404edcSAsim Jamshed 7276404edcSAsim Jamshedchgrpcmd= 7376404edcSAsim Jamshedchmodcmd=$chmodprog 7476404edcSAsim Jamshedchowncmd= 7576404edcSAsim Jamshedmvcmd=$mvprog 7676404edcSAsim Jamshedrmcmd="$rmprog -f" 7776404edcSAsim Jamshedstripcmd= 7876404edcSAsim Jamshed 7976404edcSAsim Jamshedsrc= 8076404edcSAsim Jamsheddst= 8176404edcSAsim Jamsheddir_arg= 8276404edcSAsim Jamsheddst_arg= 8376404edcSAsim Jamshed 8476404edcSAsim Jamshedcopy_on_change=false 85d270d183SAsim Jamshedis_target_a_directory=possibly 8676404edcSAsim Jamshed 8776404edcSAsim Jamshedusage="\ 8876404edcSAsim JamshedUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 8976404edcSAsim Jamshed or: $0 [OPTION]... SRCFILES... DIRECTORY 9076404edcSAsim Jamshed or: $0 [OPTION]... -t DIRECTORY SRCFILES... 9176404edcSAsim Jamshed or: $0 [OPTION]... -d DIRECTORIES... 9276404edcSAsim Jamshed 9376404edcSAsim JamshedIn the 1st form, copy SRCFILE to DSTFILE. 9476404edcSAsim JamshedIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 9576404edcSAsim JamshedIn the 4th, create DIRECTORIES. 9676404edcSAsim Jamshed 9776404edcSAsim JamshedOptions: 9876404edcSAsim Jamshed --help display this help and exit. 9976404edcSAsim Jamshed --version display version info and exit. 10076404edcSAsim Jamshed 10176404edcSAsim Jamshed -c (ignored) 10276404edcSAsim Jamshed -C install only if different (preserve the last data modification time) 10376404edcSAsim Jamshed -d create directories instead of installing files. 10476404edcSAsim Jamshed -g GROUP $chgrpprog installed files to GROUP. 10576404edcSAsim Jamshed -m MODE $chmodprog installed files to MODE. 10676404edcSAsim Jamshed -o USER $chownprog installed files to USER. 10776404edcSAsim Jamshed -s $stripprog installed files. 10876404edcSAsim Jamshed -t DIRECTORY install into DIRECTORY. 10976404edcSAsim Jamshed -T report an error if DSTFILE is a directory. 11076404edcSAsim Jamshed 11176404edcSAsim JamshedEnvironment variables override the default commands: 11276404edcSAsim Jamshed CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 11376404edcSAsim Jamshed RMPROG STRIPPROG 11476404edcSAsim Jamshed" 11576404edcSAsim Jamshed 11676404edcSAsim Jamshedwhile test $# -ne 0; do 11776404edcSAsim Jamshed case $1 in 11876404edcSAsim Jamshed -c) ;; 11976404edcSAsim Jamshed 12076404edcSAsim Jamshed -C) copy_on_change=true;; 12176404edcSAsim Jamshed 12276404edcSAsim Jamshed -d) dir_arg=true;; 12376404edcSAsim Jamshed 12476404edcSAsim Jamshed -g) chgrpcmd="$chgrpprog $2" 12576404edcSAsim Jamshed shift;; 12676404edcSAsim Jamshed 12776404edcSAsim Jamshed --help) echo "$usage"; exit $?;; 12876404edcSAsim Jamshed 12976404edcSAsim Jamshed -m) mode=$2 13076404edcSAsim Jamshed case $mode in 131d270d183SAsim Jamshed *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 13276404edcSAsim Jamshed echo "$0: invalid mode: $mode" >&2 13376404edcSAsim Jamshed exit 1;; 13476404edcSAsim Jamshed esac 13576404edcSAsim Jamshed shift;; 13676404edcSAsim Jamshed 13776404edcSAsim Jamshed -o) chowncmd="$chownprog $2" 13876404edcSAsim Jamshed shift;; 13976404edcSAsim Jamshed 14076404edcSAsim Jamshed -s) stripcmd=$stripprog;; 14176404edcSAsim Jamshed 142d270d183SAsim Jamshed -t) 143d270d183SAsim Jamshed is_target_a_directory=always 144d270d183SAsim Jamshed dst_arg=$2 145d270d183SAsim Jamshed # Protect names problematic for 'test' and other utilities. 14676404edcSAsim Jamshed case $dst_arg in 14776404edcSAsim Jamshed -* | [=\(\)!]) dst_arg=./$dst_arg;; 14876404edcSAsim Jamshed esac 14976404edcSAsim Jamshed shift;; 15076404edcSAsim Jamshed 151d270d183SAsim Jamshed -T) is_target_a_directory=never;; 15276404edcSAsim Jamshed 15376404edcSAsim Jamshed --version) echo "$0 $scriptversion"; exit $?;; 15476404edcSAsim Jamshed 15576404edcSAsim Jamshed --) shift 15676404edcSAsim Jamshed break;; 15776404edcSAsim Jamshed 15876404edcSAsim Jamshed -*) echo "$0: invalid option: $1" >&2 15976404edcSAsim Jamshed exit 1;; 16076404edcSAsim Jamshed 16176404edcSAsim Jamshed *) break;; 16276404edcSAsim Jamshed esac 16376404edcSAsim Jamshed shift 16476404edcSAsim Jamsheddone 16576404edcSAsim Jamshed 166d270d183SAsim Jamshed# We allow the use of options -d and -T together, by making -d 167d270d183SAsim Jamshed# take the precedence; this is for compatibility with GNU install. 168d270d183SAsim Jamshed 169d270d183SAsim Jamshedif test -n "$dir_arg"; then 170d270d183SAsim Jamshed if test -n "$dst_arg"; then 171d270d183SAsim Jamshed echo "$0: target directory not allowed when installing a directory." >&2 172d270d183SAsim Jamshed exit 1 173d270d183SAsim Jamshed fi 174d270d183SAsim Jamshedfi 175d270d183SAsim Jamshed 17676404edcSAsim Jamshedif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 17776404edcSAsim Jamshed # When -d is used, all remaining arguments are directories to create. 17876404edcSAsim Jamshed # When -t is used, the destination is already specified. 17976404edcSAsim Jamshed # Otherwise, the last argument is the destination. Remove it from $@. 18076404edcSAsim Jamshed for arg 18176404edcSAsim Jamshed do 18276404edcSAsim Jamshed if test -n "$dst_arg"; then 18376404edcSAsim Jamshed # $@ is not empty: it contains at least $arg. 18476404edcSAsim Jamshed set fnord "$@" "$dst_arg" 18576404edcSAsim Jamshed shift # fnord 18676404edcSAsim Jamshed fi 18776404edcSAsim Jamshed shift # arg 18876404edcSAsim Jamshed dst_arg=$arg 189d270d183SAsim Jamshed # Protect names problematic for 'test' and other utilities. 19076404edcSAsim Jamshed case $dst_arg in 19176404edcSAsim Jamshed -* | [=\(\)!]) dst_arg=./$dst_arg;; 19276404edcSAsim Jamshed esac 19376404edcSAsim Jamshed done 19476404edcSAsim Jamshedfi 19576404edcSAsim Jamshed 19676404edcSAsim Jamshedif test $# -eq 0; then 19776404edcSAsim Jamshed if test -z "$dir_arg"; then 19876404edcSAsim Jamshed echo "$0: no input file specified." >&2 19976404edcSAsim Jamshed exit 1 20076404edcSAsim Jamshed fi 201d270d183SAsim Jamshed # It's OK to call 'install-sh -d' without argument. 20276404edcSAsim Jamshed # This can happen when creating conditional directories. 20376404edcSAsim Jamshed exit 0 20476404edcSAsim Jamshedfi 20576404edcSAsim Jamshed 20676404edcSAsim Jamshedif test -z "$dir_arg"; then 207d270d183SAsim Jamshed if test $# -gt 1 || test "$is_target_a_directory" = always; then 208d270d183SAsim Jamshed if test ! -d "$dst_arg"; then 209d270d183SAsim Jamshed echo "$0: $dst_arg: Is not a directory." >&2 210d270d183SAsim Jamshed exit 1 211d270d183SAsim Jamshed fi 212d270d183SAsim Jamshed fi 213d270d183SAsim Jamshedfi 214d270d183SAsim Jamshed 215d270d183SAsim Jamshedif test -z "$dir_arg"; then 21676404edcSAsim Jamshed do_exit='(exit $ret); exit $ret' 21776404edcSAsim Jamshed trap "ret=129; $do_exit" 1 21876404edcSAsim Jamshed trap "ret=130; $do_exit" 2 21976404edcSAsim Jamshed trap "ret=141; $do_exit" 13 22076404edcSAsim Jamshed trap "ret=143; $do_exit" 15 22176404edcSAsim Jamshed 22276404edcSAsim Jamshed # Set umask so as not to create temps with too-generous modes. 22376404edcSAsim Jamshed # However, 'strip' requires both read and write access to temps. 22476404edcSAsim Jamshed case $mode in 22576404edcSAsim Jamshed # Optimize common cases. 22676404edcSAsim Jamshed *644) cp_umask=133;; 22776404edcSAsim Jamshed *755) cp_umask=22;; 22876404edcSAsim Jamshed 22976404edcSAsim Jamshed *[0-7]) 23076404edcSAsim Jamshed if test -z "$stripcmd"; then 23176404edcSAsim Jamshed u_plus_rw= 23276404edcSAsim Jamshed else 23376404edcSAsim Jamshed u_plus_rw='% 200' 23476404edcSAsim Jamshed fi 23576404edcSAsim Jamshed cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 23676404edcSAsim Jamshed *) 23776404edcSAsim Jamshed if test -z "$stripcmd"; then 23876404edcSAsim Jamshed u_plus_rw= 23976404edcSAsim Jamshed else 24076404edcSAsim Jamshed u_plus_rw=,u+rw 24176404edcSAsim Jamshed fi 24276404edcSAsim Jamshed cp_umask=$mode$u_plus_rw;; 24376404edcSAsim Jamshed esac 24476404edcSAsim Jamshedfi 24576404edcSAsim Jamshed 24676404edcSAsim Jamshedfor src 24776404edcSAsim Jamsheddo 248d270d183SAsim Jamshed # Protect names problematic for 'test' and other utilities. 24976404edcSAsim Jamshed case $src in 25076404edcSAsim Jamshed -* | [=\(\)!]) src=./$src;; 25176404edcSAsim Jamshed esac 25276404edcSAsim Jamshed 25376404edcSAsim Jamshed if test -n "$dir_arg"; then 25476404edcSAsim Jamshed dst=$src 25576404edcSAsim Jamshed dstdir=$dst 25676404edcSAsim Jamshed test -d "$dstdir" 25776404edcSAsim Jamshed dstdir_status=$? 25876404edcSAsim Jamshed else 25976404edcSAsim Jamshed 26076404edcSAsim Jamshed # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 26176404edcSAsim Jamshed # might cause directories to be created, which would be especially bad 26276404edcSAsim Jamshed # if $src (and thus $dsttmp) contains '*'. 26376404edcSAsim Jamshed if test ! -f "$src" && test ! -d "$src"; then 26476404edcSAsim Jamshed echo "$0: $src does not exist." >&2 26576404edcSAsim Jamshed exit 1 26676404edcSAsim Jamshed fi 26776404edcSAsim Jamshed 26876404edcSAsim Jamshed if test -z "$dst_arg"; then 26976404edcSAsim Jamshed echo "$0: no destination specified." >&2 27076404edcSAsim Jamshed exit 1 27176404edcSAsim Jamshed fi 27276404edcSAsim Jamshed dst=$dst_arg 27376404edcSAsim Jamshed 27476404edcSAsim Jamshed # If destination is a directory, append the input filename; won't work 27576404edcSAsim Jamshed # if double slashes aren't ignored. 27676404edcSAsim Jamshed if test -d "$dst"; then 277d270d183SAsim Jamshed if test "$is_target_a_directory" = never; then 27876404edcSAsim Jamshed echo "$0: $dst_arg: Is a directory" >&2 27976404edcSAsim Jamshed exit 1 28076404edcSAsim Jamshed fi 28176404edcSAsim Jamshed dstdir=$dst 28276404edcSAsim Jamshed dst=$dstdir/`basename "$src"` 28376404edcSAsim Jamshed dstdir_status=0 28476404edcSAsim Jamshed else 285d270d183SAsim Jamshed dstdir=`dirname "$dst"` 28676404edcSAsim Jamshed test -d "$dstdir" 28776404edcSAsim Jamshed dstdir_status=$? 28876404edcSAsim Jamshed fi 28976404edcSAsim Jamshed fi 29076404edcSAsim Jamshed 29176404edcSAsim Jamshed obsolete_mkdir_used=false 29276404edcSAsim Jamshed 29376404edcSAsim Jamshed if test $dstdir_status != 0; then 29476404edcSAsim Jamshed case $posix_mkdir in 29576404edcSAsim Jamshed '') 29676404edcSAsim Jamshed # Create intermediate dirs using mode 755 as modified by the umask. 29776404edcSAsim Jamshed # This is like FreeBSD 'install' as of 1997-10-28. 29876404edcSAsim Jamshed umask=`umask` 29976404edcSAsim Jamshed case $stripcmd.$umask in 30076404edcSAsim Jamshed # Optimize common cases. 30176404edcSAsim Jamshed *[2367][2367]) mkdir_umask=$umask;; 30276404edcSAsim Jamshed .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 30376404edcSAsim Jamshed 30476404edcSAsim Jamshed *[0-7]) 30576404edcSAsim Jamshed mkdir_umask=`expr $umask + 22 \ 30676404edcSAsim Jamshed - $umask % 100 % 40 + $umask % 20 \ 30776404edcSAsim Jamshed - $umask % 10 % 4 + $umask % 2 30876404edcSAsim Jamshed `;; 30976404edcSAsim Jamshed *) mkdir_umask=$umask,go-w;; 31076404edcSAsim Jamshed esac 31176404edcSAsim Jamshed 31276404edcSAsim Jamshed # With -d, create the new directory with the user-specified mode. 31376404edcSAsim Jamshed # Otherwise, rely on $mkdir_umask. 31476404edcSAsim Jamshed if test -n "$dir_arg"; then 31576404edcSAsim Jamshed mkdir_mode=-m$mode 31676404edcSAsim Jamshed else 31776404edcSAsim Jamshed mkdir_mode= 31876404edcSAsim Jamshed fi 31976404edcSAsim Jamshed 32076404edcSAsim Jamshed posix_mkdir=false 32176404edcSAsim Jamshed case $umask in 32276404edcSAsim Jamshed *[123567][0-7][0-7]) 32376404edcSAsim Jamshed # POSIX mkdir -p sets u+wx bits regardless of umask, which 32476404edcSAsim Jamshed # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 32576404edcSAsim Jamshed ;; 32676404edcSAsim Jamshed *) 32776404edcSAsim Jamshed tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 32876404edcSAsim Jamshed trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 32976404edcSAsim Jamshed 33076404edcSAsim Jamshed if (umask $mkdir_umask && 33176404edcSAsim Jamshed exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 33276404edcSAsim Jamshed then 33376404edcSAsim Jamshed if test -z "$dir_arg" || { 33476404edcSAsim Jamshed # Check for POSIX incompatibilities with -m. 33576404edcSAsim Jamshed # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 336d270d183SAsim Jamshed # other-writable bit of parent directory when it shouldn't. 33776404edcSAsim Jamshed # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 33876404edcSAsim Jamshed ls_ld_tmpdir=`ls -ld "$tmpdir"` 33976404edcSAsim Jamshed case $ls_ld_tmpdir in 34076404edcSAsim Jamshed d????-?r-*) different_mode=700;; 34176404edcSAsim Jamshed d????-?--*) different_mode=755;; 34276404edcSAsim Jamshed *) false;; 34376404edcSAsim Jamshed esac && 34476404edcSAsim Jamshed $mkdirprog -m$different_mode -p -- "$tmpdir" && { 34576404edcSAsim Jamshed ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 34676404edcSAsim Jamshed test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 34776404edcSAsim Jamshed } 34876404edcSAsim Jamshed } 34976404edcSAsim Jamshed then posix_mkdir=: 35076404edcSAsim Jamshed fi 35176404edcSAsim Jamshed rmdir "$tmpdir/d" "$tmpdir" 35276404edcSAsim Jamshed else 35376404edcSAsim Jamshed # Remove any dirs left behind by ancient mkdir implementations. 35476404edcSAsim Jamshed rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 35576404edcSAsim Jamshed fi 35676404edcSAsim Jamshed trap '' 0;; 35776404edcSAsim Jamshed esac;; 35876404edcSAsim Jamshed esac 35976404edcSAsim Jamshed 36076404edcSAsim Jamshed if 36176404edcSAsim Jamshed $posix_mkdir && ( 36276404edcSAsim Jamshed umask $mkdir_umask && 36376404edcSAsim Jamshed $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 36476404edcSAsim Jamshed ) 36576404edcSAsim Jamshed then : 36676404edcSAsim Jamshed else 36776404edcSAsim Jamshed 36876404edcSAsim Jamshed # The umask is ridiculous, or mkdir does not conform to POSIX, 36976404edcSAsim Jamshed # or it failed possibly due to a race condition. Create the 37076404edcSAsim Jamshed # directory the slow way, step by step, checking for races as we go. 37176404edcSAsim Jamshed 37276404edcSAsim Jamshed case $dstdir in 37376404edcSAsim Jamshed /*) prefix='/';; 37476404edcSAsim Jamshed [-=\(\)!]*) prefix='./';; 37576404edcSAsim Jamshed *) prefix='';; 37676404edcSAsim Jamshed esac 37776404edcSAsim Jamshed 37876404edcSAsim Jamshed oIFS=$IFS 37976404edcSAsim Jamshed IFS=/ 380d270d183SAsim Jamshed set -f 38176404edcSAsim Jamshed set fnord $dstdir 38276404edcSAsim Jamshed shift 383d270d183SAsim Jamshed set +f 38476404edcSAsim Jamshed IFS=$oIFS 38576404edcSAsim Jamshed 38676404edcSAsim Jamshed prefixes= 38776404edcSAsim Jamshed 38876404edcSAsim Jamshed for d 38976404edcSAsim Jamshed do 39076404edcSAsim Jamshed test X"$d" = X && continue 39176404edcSAsim Jamshed 39276404edcSAsim Jamshed prefix=$prefix$d 39376404edcSAsim Jamshed if test -d "$prefix"; then 39476404edcSAsim Jamshed prefixes= 39576404edcSAsim Jamshed else 39676404edcSAsim Jamshed if $posix_mkdir; then 39776404edcSAsim Jamshed (umask=$mkdir_umask && 39876404edcSAsim Jamshed $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 39976404edcSAsim Jamshed # Don't fail if two instances are running concurrently. 40076404edcSAsim Jamshed test -d "$prefix" || exit 1 40176404edcSAsim Jamshed else 40276404edcSAsim Jamshed case $prefix in 40376404edcSAsim Jamshed *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 40476404edcSAsim Jamshed *) qprefix=$prefix;; 40576404edcSAsim Jamshed esac 40676404edcSAsim Jamshed prefixes="$prefixes '$qprefix'" 40776404edcSAsim Jamshed fi 40876404edcSAsim Jamshed fi 40976404edcSAsim Jamshed prefix=$prefix/ 41076404edcSAsim Jamshed done 41176404edcSAsim Jamshed 41276404edcSAsim Jamshed if test -n "$prefixes"; then 41376404edcSAsim Jamshed # Don't fail if two instances are running concurrently. 41476404edcSAsim Jamshed (umask $mkdir_umask && 41576404edcSAsim Jamshed eval "\$doit_exec \$mkdirprog $prefixes") || 41676404edcSAsim Jamshed test -d "$dstdir" || exit 1 41776404edcSAsim Jamshed obsolete_mkdir_used=true 41876404edcSAsim Jamshed fi 41976404edcSAsim Jamshed fi 42076404edcSAsim Jamshed fi 42176404edcSAsim Jamshed 42276404edcSAsim Jamshed if test -n "$dir_arg"; then 42376404edcSAsim Jamshed { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 42476404edcSAsim Jamshed { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 42576404edcSAsim Jamshed { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 42676404edcSAsim Jamshed test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 42776404edcSAsim Jamshed else 42876404edcSAsim Jamshed 42976404edcSAsim Jamshed # Make a couple of temp file names in the proper directory. 43076404edcSAsim Jamshed dsttmp=$dstdir/_inst.$$_ 43176404edcSAsim Jamshed rmtmp=$dstdir/_rm.$$_ 43276404edcSAsim Jamshed 43376404edcSAsim Jamshed # Trap to clean up those temp files at exit. 43476404edcSAsim Jamshed trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 43576404edcSAsim Jamshed 43676404edcSAsim Jamshed # Copy the file name to the temp name. 43776404edcSAsim Jamshed (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 43876404edcSAsim Jamshed 43976404edcSAsim Jamshed # and set any options; do chmod last to preserve setuid bits. 44076404edcSAsim Jamshed # 44176404edcSAsim Jamshed # If any of these fail, we abort the whole thing. If we want to 44276404edcSAsim Jamshed # ignore errors from any of these, just make sure not to ignore 44376404edcSAsim Jamshed # errors from the above "$doit $cpprog $src $dsttmp" command. 44476404edcSAsim Jamshed # 44576404edcSAsim Jamshed { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 44676404edcSAsim Jamshed { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 44776404edcSAsim Jamshed { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 44876404edcSAsim Jamshed { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 44976404edcSAsim Jamshed 45076404edcSAsim Jamshed # If -C, don't bother to copy if it wouldn't change the file. 45176404edcSAsim Jamshed if $copy_on_change && 45276404edcSAsim Jamshed old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 45376404edcSAsim Jamshed new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 454d270d183SAsim Jamshed set -f && 45576404edcSAsim Jamshed set X $old && old=:$2:$4:$5:$6 && 45676404edcSAsim Jamshed set X $new && new=:$2:$4:$5:$6 && 457d270d183SAsim Jamshed set +f && 45876404edcSAsim Jamshed test "$old" = "$new" && 45976404edcSAsim Jamshed $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 46076404edcSAsim Jamshed then 46176404edcSAsim Jamshed rm -f "$dsttmp" 46276404edcSAsim Jamshed else 46376404edcSAsim Jamshed # Rename the file to the real destination. 46476404edcSAsim Jamshed $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 46576404edcSAsim Jamshed 46676404edcSAsim Jamshed # The rename failed, perhaps because mv can't rename something else 46776404edcSAsim Jamshed # to itself, or perhaps because mv is so ancient that it does not 46876404edcSAsim Jamshed # support -f. 46976404edcSAsim Jamshed { 47076404edcSAsim Jamshed # Now remove or move aside any old file at destination location. 47176404edcSAsim Jamshed # We try this two ways since rm can't unlink itself on some 47276404edcSAsim Jamshed # systems and the destination file might be busy for other 47376404edcSAsim Jamshed # reasons. In this case, the final cleanup might fail but the new 47476404edcSAsim Jamshed # file should still install successfully. 47576404edcSAsim Jamshed { 47676404edcSAsim Jamshed test ! -f "$dst" || 47776404edcSAsim Jamshed $doit $rmcmd -f "$dst" 2>/dev/null || 47876404edcSAsim Jamshed { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 47976404edcSAsim Jamshed { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 48076404edcSAsim Jamshed } || 48176404edcSAsim Jamshed { echo "$0: cannot unlink or rename $dst" >&2 48276404edcSAsim Jamshed (exit 1); exit 1 48376404edcSAsim Jamshed } 48476404edcSAsim Jamshed } && 48576404edcSAsim Jamshed 48676404edcSAsim Jamshed # Now rename the file to the real destination. 48776404edcSAsim Jamshed $doit $mvcmd "$dsttmp" "$dst" 48876404edcSAsim Jamshed } 48976404edcSAsim Jamshed fi || exit 1 49076404edcSAsim Jamshed 49176404edcSAsim Jamshed trap '' 0 49276404edcSAsim Jamshed fi 49376404edcSAsim Jamsheddone 49476404edcSAsim Jamshed 49576404edcSAsim Jamshed# Local variables: 49676404edcSAsim Jamshed# eval: (add-hook 'write-file-hooks 'time-stamp) 49776404edcSAsim Jamshed# time-stamp-start: "scriptversion=" 49876404edcSAsim Jamshed# time-stamp-format: "%:y-%02m-%02d.%02H" 49976404edcSAsim Jamshed# time-stamp-time-zone: "UTC" 50076404edcSAsim Jamshed# time-stamp-end: "; # UTC" 50176404edcSAsim Jamshed# End: 502