Blame install-sh

Packit Bot 4c90e1
#!/bin/sh
Packit Bot 4c90e1
# install - install a program, script, or datafile
Packit Bot 4c90e1
Packit Bot 3f3c20
scriptversion=2018-03-11.20; # UTC
Packit Bot 4c90e1
Packit Bot 4c90e1
# This originates from X11R5 (mit/util/scripts/install.sh), which was
Packit Bot 4c90e1
# later released in X11R6 (xc/config/util/install.sh) with the
Packit Bot 4c90e1
# following copyright and license.
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# Copyright (C) 1994 X Consortium
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# Permission is hereby granted, free of charge, to any person obtaining a copy
Packit Bot 4c90e1
# of this software and associated documentation files (the "Software"), to
Packit Bot 4c90e1
# deal in the Software without restriction, including without limitation the
Packit Bot 4c90e1
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit Bot 4c90e1
# sell copies of the Software, and to permit persons to whom the Software is
Packit Bot 4c90e1
# furnished to do so, subject to the following conditions:
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# The above copyright notice and this permission notice shall be included in
Packit Bot 4c90e1
# all copies or substantial portions of the Software.
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Bot 4c90e1
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Bot 4c90e1
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Bot 4c90e1
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Bot 4c90e1
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
Packit Bot 4c90e1
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# Except as contained in this notice, the name of the X Consortium shall not
Packit Bot 4c90e1
# be used in advertising or otherwise to promote the sale, use or other deal-
Packit Bot 4c90e1
# ings in this Software without prior written authorization from the X Consor-
Packit Bot 4c90e1
# tium.
Packit Bot 4c90e1
#
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# FSF changes to this file are in the public domain.
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# Calling this script install-sh is preferred over install.sh, to prevent
Packit Bot 4c90e1
# 'make' implicit rules from creating a file called install from it
Packit Bot 4c90e1
# when there is no Makefile.
Packit Bot 4c90e1
#
Packit Bot 4c90e1
# This script is compatible with the BSD install script, but was written
Packit Bot 4c90e1
# from scratch.
Packit Bot 4c90e1
Packit Bot 4c90e1
tab='	'
Packit Bot 4c90e1
nl='
Packit Bot 4c90e1
'
Packit Bot 4c90e1
IFS=" $tab$nl"
Packit Bot 4c90e1
Packit Bot 4c90e1
# Set DOITPROG to "echo" to test this script.
Packit Bot 4c90e1
Packit Bot 4c90e1
doit=${DOITPROG-}
Packit Bot 4c90e1
doit_exec=${doit:-exec}
Packit Bot 4c90e1
Packit Bot 4c90e1
# Put in absolute file names if you don't have them in your path;
Packit Bot 4c90e1
# or use environment vars.
Packit Bot 4c90e1
Packit Bot 4c90e1
chgrpprog=${CHGRPPROG-chgrp}
Packit Bot 4c90e1
chmodprog=${CHMODPROG-chmod}
Packit Bot 4c90e1
chownprog=${CHOWNPROG-chown}
Packit Bot 4c90e1
cmpprog=${CMPPROG-cmp}
Packit Bot 4c90e1
cpprog=${CPPROG-cp}
Packit Bot 4c90e1
mkdirprog=${MKDIRPROG-mkdir}
Packit Bot 4c90e1
mvprog=${MVPROG-mv}
Packit Bot 4c90e1
rmprog=${RMPROG-rm}
Packit Bot 4c90e1
stripprog=${STRIPPROG-strip}
Packit Bot 4c90e1
Packit Bot 4c90e1
posix_mkdir=
Packit Bot 4c90e1
Packit Bot 4c90e1
# Desired mode of installed file.
Packit Bot 4c90e1
mode=0755
Packit Bot 4c90e1
Packit Bot 4c90e1
chgrpcmd=
Packit Bot 4c90e1
chmodcmd=$chmodprog
Packit Bot 4c90e1
chowncmd=
Packit Bot 4c90e1
mvcmd=$mvprog
Packit Bot 4c90e1
rmcmd="$rmprog -f"
Packit Bot 4c90e1
stripcmd=
Packit Bot 4c90e1
Packit Bot 4c90e1
src=
Packit Bot 4c90e1
dst=
Packit Bot 4c90e1
dir_arg=
Packit Bot 4c90e1
dst_arg=
Packit Bot 4c90e1
Packit Bot 4c90e1
copy_on_change=false
Packit Bot 4c90e1
is_target_a_directory=possibly
Packit Bot 4c90e1
Packit Bot 4c90e1
usage="\
Packit Bot 4c90e1
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
Packit Bot 4c90e1
   or: $0 [OPTION]... SRCFILES... DIRECTORY
Packit Bot 4c90e1
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
Packit Bot 4c90e1
   or: $0 [OPTION]... -d DIRECTORIES...
Packit Bot 4c90e1
Packit Bot 4c90e1
In the 1st form, copy SRCFILE to DSTFILE.
Packit Bot 4c90e1
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
Packit Bot 4c90e1
In the 4th, create DIRECTORIES.
Packit Bot 4c90e1
Packit Bot 4c90e1
Options:
Packit Bot 4c90e1
     --help     display this help and exit.
Packit Bot 4c90e1
     --version  display version info and exit.
Packit Bot 4c90e1
Packit Bot 4c90e1
  -c            (ignored)
Packit Bot 4c90e1
  -C            install only if different (preserve the last data modification time)
Packit Bot 4c90e1
  -d            create directories instead of installing files.
Packit Bot 4c90e1
  -g GROUP      $chgrpprog installed files to GROUP.
Packit Bot 4c90e1
  -m MODE       $chmodprog installed files to MODE.
Packit Bot 4c90e1
  -o USER       $chownprog installed files to USER.
Packit Bot 4c90e1
  -s            $stripprog installed files.
Packit Bot 4c90e1
  -t DIRECTORY  install into DIRECTORY.
Packit Bot 4c90e1
  -T            report an error if DSTFILE is a directory.
Packit Bot 4c90e1
Packit Bot 4c90e1
Environment variables override the default commands:
Packit Bot 4c90e1
  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
Packit Bot 4c90e1
  RMPROG STRIPPROG
Packit Bot 4c90e1
"
Packit Bot 4c90e1
Packit Bot 4c90e1
while test $# -ne 0; do
Packit Bot 4c90e1
  case $1 in
Packit Bot 4c90e1
    -c) ;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -C) copy_on_change=true;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -d) dir_arg=true;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -g) chgrpcmd="$chgrpprog $2"
Packit Bot 4c90e1
        shift;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    --help) echo "$usage"; exit $?;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -m) mode=$2
Packit Bot 4c90e1
        case $mode in
Packit Bot 4c90e1
          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
Packit Bot 4c90e1
            echo "$0: invalid mode: $mode" >&2
Packit Bot 4c90e1
            exit 1;;
Packit Bot 4c90e1
        esac
Packit Bot 4c90e1
        shift;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -o) chowncmd="$chownprog $2"
Packit Bot 4c90e1
        shift;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -s) stripcmd=$stripprog;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -t)
Packit Bot 4c90e1
        is_target_a_directory=always
Packit Bot 4c90e1
        dst_arg=$2
Packit Bot 4c90e1
        # Protect names problematic for 'test' and other utilities.
Packit Bot 4c90e1
        case $dst_arg in
Packit Bot 4c90e1
          -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit Bot 4c90e1
        esac
Packit Bot 4c90e1
        shift;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -T) is_target_a_directory=never;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    --version) echo "$0 $scriptversion"; exit $?;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    --) shift
Packit Bot 4c90e1
        break;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    -*) echo "$0: invalid option: $1" >&2
Packit Bot 4c90e1
        exit 1;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    *)  break;;
Packit Bot 4c90e1
  esac
Packit Bot 4c90e1
  shift
Packit Bot 4c90e1
done
Packit Bot 4c90e1
Packit Bot 4c90e1
# We allow the use of options -d and -T together, by making -d
Packit Bot 4c90e1
# take the precedence; this is for compatibility with GNU install.
Packit Bot 4c90e1
Packit Bot 4c90e1
if test -n "$dir_arg"; then
Packit Bot 4c90e1
  if test -n "$dst_arg"; then
Packit Bot 4c90e1
    echo "$0: target directory not allowed when installing a directory." >&2
Packit Bot 4c90e1
    exit 1
Packit Bot 4c90e1
  fi
Packit Bot 4c90e1
fi
Packit Bot 4c90e1
Packit Bot 4c90e1
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
Packit Bot 4c90e1
  # When -d is used, all remaining arguments are directories to create.
Packit Bot 4c90e1
  # When -t is used, the destination is already specified.
Packit Bot 4c90e1
  # Otherwise, the last argument is the destination.  Remove it from $@.
Packit Bot 4c90e1
  for arg
Packit Bot 4c90e1
  do
Packit Bot 4c90e1
    if test -n "$dst_arg"; then
Packit Bot 4c90e1
      # $@ is not empty: it contains at least $arg.
Packit Bot 4c90e1
      set fnord "$@" "$dst_arg"
Packit Bot 4c90e1
      shift # fnord
Packit Bot 4c90e1
    fi
Packit Bot 4c90e1
    shift # arg
Packit Bot 4c90e1
    dst_arg=$arg
Packit Bot 4c90e1
    # Protect names problematic for 'test' and other utilities.
Packit Bot 4c90e1
    case $dst_arg in
Packit Bot 4c90e1
      -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit Bot 4c90e1
    esac
Packit Bot 4c90e1
  done
Packit Bot 4c90e1
fi
Packit Bot 4c90e1
Packit Bot 4c90e1
if test $# -eq 0; then
Packit Bot 4c90e1
  if test -z "$dir_arg"; then
Packit Bot 4c90e1
    echo "$0: no input file specified." >&2
Packit Bot 4c90e1
    exit 1
Packit Bot 4c90e1
  fi
Packit Bot 4c90e1
  # It's OK to call 'install-sh -d' without argument.
Packit Bot 4c90e1
  # This can happen when creating conditional directories.
Packit Bot 4c90e1
  exit 0
Packit Bot 4c90e1
fi
Packit Bot 4c90e1
Packit Bot 4c90e1
if test -z "$dir_arg"; then
Packit Bot 4c90e1
  if test $# -gt 1 || test "$is_target_a_directory" = always; then
Packit Bot 4c90e1
    if test ! -d "$dst_arg"; then
Packit Bot 4c90e1
      echo "$0: $dst_arg: Is not a directory." >&2
Packit Bot 4c90e1
      exit 1
Packit Bot 4c90e1
    fi
Packit Bot 4c90e1
  fi
Packit Bot 4c90e1
fi
Packit Bot 4c90e1
Packit Bot 4c90e1
if test -z "$dir_arg"; then
Packit Bot 4c90e1
  do_exit='(exit $ret); exit $ret'
Packit Bot 4c90e1
  trap "ret=129; $do_exit" 1
Packit Bot 4c90e1
  trap "ret=130; $do_exit" 2
Packit Bot 4c90e1
  trap "ret=141; $do_exit" 13
Packit Bot 4c90e1
  trap "ret=143; $do_exit" 15
Packit Bot 4c90e1
Packit Bot 4c90e1
  # Set umask so as not to create temps with too-generous modes.
Packit Bot 4c90e1
  # However, 'strip' requires both read and write access to temps.
Packit Bot 4c90e1
  case $mode in
Packit Bot 4c90e1
    # Optimize common cases.
Packit Bot 4c90e1
    *644) cp_umask=133;;
Packit Bot 4c90e1
    *755) cp_umask=22;;
Packit Bot 4c90e1
Packit Bot 4c90e1
    *[0-7])
Packit Bot 4c90e1
      if test -z "$stripcmd"; then
Packit Bot 4c90e1
        u_plus_rw=
Packit Bot 4c90e1
      else
Packit Bot 4c90e1
        u_plus_rw='% 200'
Packit Bot 4c90e1
      fi
Packit Bot 4c90e1
      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
Packit Bot 4c90e1
    *)
Packit Bot 4c90e1
      if test -z "$stripcmd"; then
Packit Bot 4c90e1
        u_plus_rw=
Packit Bot 4c90e1
      else
Packit Bot 4c90e1
        u_plus_rw=,u+rw
Packit Bot 4c90e1
      fi
Packit Bot 4c90e1
      cp_umask=$mode$u_plus_rw;;
Packit Bot 4c90e1
  esac
Packit Bot 4c90e1
fi
Packit Bot 4c90e1
Packit Bot 4c90e1
for src
Packit Bot 4c90e1
do
Packit Bot 4c90e1
  # Protect names problematic for 'test' and other utilities.
Packit Bot 4c90e1
  case $src in
Packit Bot 4c90e1
    -* | [=\(\)!]) src=./$src;;
Packit Bot 4c90e1
  esac
Packit Bot 4c90e1
Packit Bot 4c90e1
  if test -n "$dir_arg"; then
Packit Bot 4c90e1
    dst=$src
Packit Bot 4c90e1
    dstdir=$dst
Packit Bot 4c90e1
    test -d "$dstdir"
Packit Bot 4c90e1
    dstdir_status=$?
Packit Bot 4c90e1
  else
Packit Bot 4c90e1
Packit Bot 4c90e1
    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
Packit Bot 4c90e1
    # might cause directories to be created, which would be especially bad
Packit Bot 4c90e1
    # if $src (and thus $dsttmp) contains '*'.
Packit Bot 4c90e1
    if test ! -f "$src" && test ! -d "$src"; then
Packit Bot 4c90e1
      echo "$0: $src does not exist." >&2
Packit Bot 4c90e1
      exit 1
Packit Bot 4c90e1
    fi
Packit Bot 4c90e1
Packit Bot 4c90e1
    if test -z "$dst_arg"; then
Packit Bot 4c90e1
      echo "$0: no destination specified." >&2
Packit Bot 4c90e1
      exit 1
Packit Bot 4c90e1
    fi
Packit Bot 4c90e1
    dst=$dst_arg
Packit Bot 4c90e1
Packit Bot 3f3c20
    # If destination is a directory, append the input filename.
Packit Bot 4c90e1
    if test -d "$dst"; then
Packit Bot 4c90e1
      if test "$is_target_a_directory" = never; then
Packit Bot 4c90e1
        echo "$0: $dst_arg: Is a directory" >&2
Packit Bot 4c90e1
        exit 1
Packit Bot 4c90e1
      fi
Packit Bot 4c90e1
      dstdir=$dst
Packit Bot 3f3c20
      dstbase=`basename "$src"`
Packit Bot 3f3c20
      case $dst in
Packit Bot 3f3c20
	*/) dst=$dst$dstbase;;
Packit Bot 3f3c20
	*)  dst=$dst/$dstbase;;
Packit Bot 3f3c20
      esac
Packit Bot 4c90e1
      dstdir_status=0
Packit Bot 4c90e1
    else
Packit Bot 4c90e1
      dstdir=`dirname "$dst"`
Packit Bot 4c90e1
      test -d "$dstdir"
Packit Bot 4c90e1
      dstdir_status=$?
Packit Bot 4c90e1
    fi
Packit Bot 4c90e1
  fi
Packit Bot 4c90e1
Packit Bot 3f3c20
  case $dstdir in
Packit Bot 3f3c20
    */) dstdirslash=$dstdir;;
Packit Bot 3f3c20
    *)  dstdirslash=$dstdir/;;
Packit Bot 3f3c20
  esac
Packit Bot 3f3c20
Packit Bot 4c90e1
  obsolete_mkdir_used=false
Packit Bot 4c90e1
Packit Bot 4c90e1
  if test $dstdir_status != 0; then
Packit Bot 4c90e1
    case $posix_mkdir in
Packit Bot 4c90e1
      '')
Packit Bot 4c90e1
        # Create intermediate dirs using mode 755 as modified by the umask.
Packit Bot 4c90e1
        # This is like FreeBSD 'install' as of 1997-10-28.
Packit Bot 4c90e1
        umask=`umask`
Packit Bot 4c90e1
        case $stripcmd.$umask in
Packit Bot 4c90e1
          # Optimize common cases.
Packit Bot 4c90e1
          *[2367][2367]) mkdir_umask=$umask;;
Packit Bot 4c90e1
          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
Packit Bot 4c90e1
Packit Bot 4c90e1
          *[0-7])
Packit Bot 4c90e1
            mkdir_umask=`expr $umask + 22 \
Packit Bot 4c90e1
              - $umask % 100 % 40 + $umask % 20 \
Packit Bot 4c90e1
              - $umask % 10 % 4 + $umask % 2
Packit Bot 4c90e1
            `;;
Packit Bot 4c90e1
          *) mkdir_umask=$umask,go-w;;
Packit Bot 4c90e1
        esac
Packit Bot 4c90e1
Packit Bot 4c90e1
        # With -d, create the new directory with the user-specified mode.
Packit Bot 4c90e1
        # Otherwise, rely on $mkdir_umask.
Packit Bot 4c90e1
        if test -n "$dir_arg"; then
Packit Bot 4c90e1
          mkdir_mode=-m$mode
Packit Bot 4c90e1
        else
Packit Bot 4c90e1
          mkdir_mode=
Packit Bot 4c90e1
        fi
Packit Bot 4c90e1
Packit Bot 4c90e1
        posix_mkdir=false
Packit Bot 4c90e1
        case $umask in
Packit Bot 4c90e1
          *[123567][0-7][0-7])
Packit Bot 4c90e1
            # POSIX mkdir -p sets u+wx bits regardless of umask, which
Packit Bot 4c90e1
            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
Packit Bot 4c90e1
            ;;
Packit Bot 4c90e1
          *)
Packit Bot 3f3c20
            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
Packit Bot 3f3c20
            # here however when possible just to lower collision chance.
Packit Bot 4c90e1
            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
Packit Bot 3f3c20
Packit Bot 4c90e1
            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
Packit Bot 4c90e1
Packit Bot 3f3c20
            # Because "mkdir -p" follows existing symlinks and we likely work
Packit Bot 3f3c20
            # directly in world-writeable /tmp, make sure that the '$tmpdir'
Packit Bot 3f3c20
            # directory is successfully created first before we actually test
Packit Bot 3f3c20
            # 'mkdir -p' feature.
Packit Bot 4c90e1
            if (umask $mkdir_umask &&
Packit Bot 4c90e1
                $mkdirprog $mkdir_mode "$tmpdir" &&
Packit Bot 4c90e1
                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
Packit Bot 4c90e1
            then
Packit Bot 4c90e1
              if test -z "$dir_arg" || {
Packit Bot 4c90e1
                   # Check for POSIX incompatibilities with -m.
Packit Bot 4c90e1
                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
Packit Bot 4c90e1
                   # other-writable bit of parent directory when it shouldn't.
Packit Bot 4c90e1
                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
Packit Bot 4c90e1
                   test_tmpdir="$tmpdir/a"
Packit Bot 4c90e1
                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
Packit Bot 4c90e1
                   case $ls_ld_tmpdir in
Packit Bot 4c90e1
                     d????-?r-*) different_mode=700;;
Packit Bot 4c90e1
                     d????-?--*) different_mode=755;;
Packit Bot 4c90e1
                     *) false;;
Packit Bot 4c90e1
                   esac &&
Packit Bot 4c90e1
                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
Packit Bot 4c90e1
                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
Packit Bot 4c90e1
                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
Packit Bot 4c90e1
                   }
Packit Bot 4c90e1
                 }
Packit Bot 4c90e1
              then posix_mkdir=:
Packit Bot 4c90e1
              fi
Packit Bot 4c90e1
              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
Packit Bot 4c90e1
            else
Packit Bot 4c90e1
              # Remove any dirs left behind by ancient mkdir implementations.
Packit Bot 4c90e1
              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
Packit Bot 4c90e1
            fi
Packit Bot 4c90e1
            trap '' 0;;
Packit Bot 4c90e1
        esac;;
Packit Bot 4c90e1
    esac
Packit Bot 4c90e1
Packit Bot 4c90e1
    if
Packit Bot 4c90e1
      $posix_mkdir && (
Packit Bot 4c90e1
        umask $mkdir_umask &&
Packit Bot 4c90e1
        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
Packit Bot 4c90e1
      )
Packit Bot 4c90e1
    then :
Packit Bot 4c90e1
    else
Packit Bot 4c90e1
Packit Bot 4c90e1
      # The umask is ridiculous, or mkdir does not conform to POSIX,
Packit Bot 4c90e1
      # or it failed possibly due to a race condition.  Create the
Packit Bot 4c90e1
      # directory the slow way, step by step, checking for races as we go.
Packit Bot 4c90e1
Packit Bot 4c90e1
      case $dstdir in
Packit Bot 4c90e1
        /*) prefix='/';;
Packit Bot 4c90e1
        [-=\(\)!]*) prefix='./';;
Packit Bot 4c90e1
        *)  prefix='';;
Packit Bot 4c90e1
      esac
Packit Bot 4c90e1
Packit Bot 4c90e1
      oIFS=$IFS
Packit Bot 4c90e1
      IFS=/
Packit Bot 4c90e1
      set -f
Packit Bot 4c90e1
      set fnord $dstdir
Packit Bot 4c90e1
      shift
Packit Bot 4c90e1
      set +f
Packit Bot 4c90e1
      IFS=$oIFS
Packit Bot 4c90e1
Packit Bot 4c90e1
      prefixes=
Packit Bot 4c90e1
Packit Bot 4c90e1
      for d
Packit Bot 4c90e1
      do
Packit Bot 4c90e1
        test X"$d" = X && continue
Packit Bot 4c90e1
Packit Bot 4c90e1
        prefix=$prefix$d
Packit Bot 4c90e1
        if test -d "$prefix"; then
Packit Bot 4c90e1
          prefixes=
Packit Bot 4c90e1
        else
Packit Bot 4c90e1
          if $posix_mkdir; then
Packit Bot 4c90e1
            (umask=$mkdir_umask &&
Packit Bot 4c90e1
             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
Packit Bot 4c90e1
            # Don't fail if two instances are running concurrently.
Packit Bot 4c90e1
            test -d "$prefix" || exit 1
Packit Bot 4c90e1
          else
Packit Bot 4c90e1
            case $prefix in
Packit Bot 4c90e1
              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
Packit Bot 4c90e1
              *) qprefix=$prefix;;
Packit Bot 4c90e1
            esac
Packit Bot 4c90e1
            prefixes="$prefixes '$qprefix'"
Packit Bot 4c90e1
          fi
Packit Bot 4c90e1
        fi
Packit Bot 4c90e1
        prefix=$prefix/
Packit Bot 4c90e1
      done
Packit Bot 4c90e1
Packit Bot 4c90e1
      if test -n "$prefixes"; then
Packit Bot 4c90e1
        # Don't fail if two instances are running concurrently.
Packit Bot 4c90e1
        (umask $mkdir_umask &&
Packit Bot 4c90e1
         eval "\$doit_exec \$mkdirprog $prefixes") ||
Packit Bot 4c90e1
          test -d "$dstdir" || exit 1
Packit Bot 4c90e1
        obsolete_mkdir_used=true
Packit Bot 4c90e1
      fi
Packit Bot 4c90e1
    fi
Packit Bot 4c90e1
  fi
Packit Bot 4c90e1
Packit Bot 4c90e1
  if test -n "$dir_arg"; then
Packit Bot 4c90e1
    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
Packit Bot 4c90e1
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
Packit Bot 4c90e1
    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
Packit Bot 4c90e1
      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
Packit Bot 4c90e1
  else
Packit Bot 4c90e1
Packit Bot 4c90e1
    # Make a couple of temp file names in the proper directory.
Packit Bot 3f3c20
    dsttmp=${dstdirslash}_inst.$$_
Packit Bot 3f3c20
    rmtmp=${dstdirslash}_rm.$$_
Packit Bot 4c90e1
Packit Bot 4c90e1
    # Trap to clean up those temp files at exit.
Packit Bot 4c90e1
    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
Packit Bot 4c90e1
Packit Bot 4c90e1
    # Copy the file name to the temp name.
Packit Bot 4c90e1
    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
Packit Bot 4c90e1
Packit Bot 4c90e1
    # and set any options; do chmod last to preserve setuid bits.
Packit Bot 4c90e1
    #
Packit Bot 4c90e1
    # If any of these fail, we abort the whole thing.  If we want to
Packit Bot 4c90e1
    # ignore errors from any of these, just make sure not to ignore
Packit Bot 4c90e1
    # errors from the above "$doit $cpprog $src $dsttmp" command.
Packit Bot 4c90e1
    #
Packit Bot 4c90e1
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
Packit Bot 4c90e1
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
Packit Bot 4c90e1
    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
Packit Bot 4c90e1
    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
Packit Bot 4c90e1
Packit Bot 4c90e1
    # If -C, don't bother to copy if it wouldn't change the file.
Packit Bot 4c90e1
    if $copy_on_change &&
Packit Bot 4c90e1
       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
Packit Bot 4c90e1
       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
Packit Bot 4c90e1
       set -f &&
Packit Bot 4c90e1
       set X $old && old=:$2:$4:$5:$6 &&
Packit Bot 4c90e1
       set X $new && new=:$2:$4:$5:$6 &&
Packit Bot 4c90e1
       set +f &&
Packit Bot 4c90e1
       test "$old" = "$new" &&
Packit Bot 4c90e1
       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
Packit Bot 4c90e1
    then
Packit Bot 4c90e1
      rm -f "$dsttmp"
Packit Bot 4c90e1
    else
Packit Bot 4c90e1
      # Rename the file to the real destination.
Packit Bot 4c90e1
      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
Packit Bot 4c90e1
Packit Bot 4c90e1
      # The rename failed, perhaps because mv can't rename something else
Packit Bot 4c90e1
      # to itself, or perhaps because mv is so ancient that it does not
Packit Bot 4c90e1
      # support -f.
Packit Bot 4c90e1
      {
Packit Bot 4c90e1
        # Now remove or move aside any old file at destination location.
Packit Bot 4c90e1
        # We try this two ways since rm can't unlink itself on some
Packit Bot 4c90e1
        # systems and the destination file might be busy for other
Packit Bot 4c90e1
        # reasons.  In this case, the final cleanup might fail but the new
Packit Bot 4c90e1
        # file should still install successfully.
Packit Bot 4c90e1
        {
Packit Bot 4c90e1
          test ! -f "$dst" ||
Packit Bot 4c90e1
          $doit $rmcmd -f "$dst" 2>/dev/null ||
Packit Bot 4c90e1
          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
Packit Bot 4c90e1
            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
Packit Bot 4c90e1
          } ||
Packit Bot 4c90e1
          { echo "$0: cannot unlink or rename $dst" >&2
Packit Bot 4c90e1
            (exit 1); exit 1
Packit Bot 4c90e1
          }
Packit Bot 4c90e1
        } &&
Packit Bot 4c90e1
Packit Bot 4c90e1
        # Now rename the file to the real destination.
Packit Bot 4c90e1
        $doit $mvcmd "$dsttmp" "$dst"
Packit Bot 4c90e1
      }
Packit Bot 4c90e1
    fi || exit 1
Packit Bot 4c90e1
Packit Bot 4c90e1
    trap '' 0
Packit Bot 4c90e1
  fi
Packit Bot 4c90e1
done
Packit Bot 4c90e1
Packit Bot 4c90e1
# Local variables:
Packit Bot 3f3c20
# eval: (add-hook 'before-save-hook 'time-stamp)
Packit Bot 4c90e1
# time-stamp-start: "scriptversion="
Packit Bot 4c90e1
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit Bot 3f3c20
# time-stamp-time-zone: "UTC0"
Packit Bot 4c90e1
# time-stamp-end: "; # UTC"
Packit Bot 4c90e1
# End: