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