Blame install-sh

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