Blame install-sh

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