Blame config/install-sh

Packit Service 8bf002
#!/bin/sh
Packit Service 8bf002
# install - install a program, script, or datafile
Packit Service 8bf002
Packit Service 8bf002
scriptversion=2005-05-14.22
Packit Service 8bf002
Packit Service 8bf002
# This originates from X11R5 (mit/util/scripts/install.sh), which was
Packit Service 8bf002
# later released in X11R6 (xc/config/util/install.sh) with the
Packit Service 8bf002
# following copyright and license.
Packit Service 8bf002
#
Packit Service 8bf002
# Copyright (C) 1994 X Consortium
Packit Service 8bf002
#
Packit Service 8bf002
# Permission is hereby granted, free of charge, to any person obtaining a copy
Packit Service 8bf002
# of this software and associated documentation files (the "Software"), to
Packit Service 8bf002
# deal in the Software without restriction, including without limitation the
Packit Service 8bf002
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit Service 8bf002
# sell copies of the Software, and to permit persons to whom the Software is
Packit Service 8bf002
# furnished to do so, subject to the following conditions:
Packit Service 8bf002
#
Packit Service 8bf002
# The above copyright notice and this permission notice shall be included in
Packit Service 8bf002
# all copies or substantial portions of the Software.
Packit Service 8bf002
#
Packit Service 8bf002
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 8bf002
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 8bf002
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Service 8bf002
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Service 8bf002
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
Packit Service 8bf002
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 8bf002
#
Packit Service 8bf002
# Except as contained in this notice, the name of the X Consortium shall not
Packit Service 8bf002
# be used in advertising or otherwise to promote the sale, use or other deal-
Packit Service 8bf002
# ings in this Software without prior written authorization from the X Consor-
Packit Service 8bf002
# tium.
Packit Service 8bf002
#
Packit Service 8bf002
#
Packit Service 8bf002
# FSF changes to this file are in the public domain.
Packit Service 8bf002
#
Packit Service 8bf002
# Calling this script install-sh is preferred over install.sh, to prevent
Packit Service 8bf002
# `make' implicit rules from creating a file called install from it
Packit Service 8bf002
# when there is no Makefile.
Packit Service 8bf002
#
Packit Service 8bf002
# This script is compatible with the BSD install script, but was written
Packit Service 8bf002
# from scratch.  It can only install one file at a time, a restriction
Packit Service 8bf002
# shared with many OS's install programs.
Packit Service 8bf002
Packit Service 8bf002
# set DOITPROG to echo to test this script
Packit Service 8bf002
Packit Service 8bf002
# Don't use :- since 4.3BSD and earlier shells don't like it.
Packit Service 8bf002
doit="${DOITPROG-}"
Packit Service 8bf002
Packit Service 8bf002
# put in absolute paths if you don't have them in your path; or use env. vars.
Packit Service 8bf002
Packit Service 8bf002
mvprog="${MVPROG-mv}"
Packit Service 8bf002
cpprog="${CPPROG-cp}"
Packit Service 8bf002
chmodprog="${CHMODPROG-chmod}"
Packit Service 8bf002
chownprog="${CHOWNPROG-chown}"
Packit Service 8bf002
chgrpprog="${CHGRPPROG-chgrp}"
Packit Service 8bf002
stripprog="${STRIPPROG-strip}"
Packit Service 8bf002
rmprog="${RMPROG-rm}"
Packit Service 8bf002
mkdirprog="${MKDIRPROG-mkdir}"
Packit Service 8bf002
Packit Service 8bf002
chmodcmd="$chmodprog 0755"
Packit Service 8bf002
chowncmd=
Packit Service 8bf002
chgrpcmd=
Packit Service 8bf002
stripcmd=
Packit Service 8bf002
rmcmd="$rmprog -f"
Packit Service 8bf002
mvcmd="$mvprog"
Packit Service 8bf002
src=
Packit Service 8bf002
dst=
Packit Service 8bf002
dir_arg=
Packit Service 8bf002
dstarg=
Packit Service 8bf002
no_target_directory=
Packit Service 8bf002
Packit Service 8bf002
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
Packit Service 8bf002
   or: $0 [OPTION]... SRCFILES... DIRECTORY
Packit Service 8bf002
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
Packit Service 8bf002
   or: $0 [OPTION]... -d DIRECTORIES...
Packit Service 8bf002
Packit Service 8bf002
In the 1st form, copy SRCFILE to DSTFILE.
Packit Service 8bf002
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
Packit Service 8bf002
In the 4th, create DIRECTORIES.
Packit Service 8bf002
Packit Service 8bf002
Options:
Packit Service 8bf002
-c         (ignored)
Packit Service 8bf002
-d         create directories instead of installing files.
Packit Service 8bf002
-g GROUP   $chgrpprog installed files to GROUP.
Packit Service 8bf002
-m MODE    $chmodprog installed files to MODE.
Packit Service 8bf002
-o USER    $chownprog installed files to USER.
Packit Service 8bf002
-s         $stripprog installed files.
Packit Service 8bf002
-t DIRECTORY  install into DIRECTORY.
Packit Service 8bf002
-T         report an error if DSTFILE is a directory.
Packit Service 8bf002
--help     display this help and exit.
Packit Service 8bf002
--version  display version info and exit.
Packit Service 8bf002
Packit Service 8bf002
Environment variables override the default commands:
Packit Service 8bf002
  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
Packit Service 8bf002
"
Packit Service 8bf002
Packit Service 8bf002
while test -n "$1"; do
Packit Service 8bf002
  case $1 in
Packit Service 8bf002
    -c) shift
Packit Service 8bf002
        continue;;
Packit Service 8bf002
Packit Service 8bf002
    -d) dir_arg=true
Packit Service 8bf002
        shift
Packit Service 8bf002
        continue;;
Packit Service 8bf002
Packit Service 8bf002
    -g) chgrpcmd="$chgrpprog $2"
Packit Service 8bf002
        shift
Packit Service 8bf002
        shift
Packit Service 8bf002
        continue;;
Packit Service 8bf002
Packit Service 8bf002
    --help) echo "$usage"; exit $?;;
Packit Service 8bf002
Packit Service 8bf002
    -m) chmodcmd="$chmodprog $2"
Packit Service 8bf002
        shift
Packit Service 8bf002
        shift
Packit Service 8bf002
        continue;;
Packit Service 8bf002
Packit Service 8bf002
    -o) chowncmd="$chownprog $2"
Packit Service 8bf002
        shift
Packit Service 8bf002
        shift
Packit Service 8bf002
        continue;;
Packit Service 8bf002
Packit Service 8bf002
    -s) stripcmd=$stripprog
Packit Service 8bf002
        shift
Packit Service 8bf002
        continue;;
Packit Service 8bf002
Packit Service 8bf002
    -t) dstarg=$2
Packit Service 8bf002
	shift
Packit Service 8bf002
	shift
Packit Service 8bf002
	continue;;
Packit Service 8bf002
Packit Service 8bf002
    -T) no_target_directory=true
Packit Service 8bf002
	shift
Packit Service 8bf002
	continue;;
Packit Service 8bf002
Packit Service 8bf002
    --version) echo "$0 $scriptversion"; exit $?;;
Packit Service 8bf002
Packit Service 8bf002
    *)  # When -d is used, all remaining arguments are directories to create.
Packit Service 8bf002
	# When -t is used, the destination is already specified.
Packit Service 8bf002
	test -n "$dir_arg$dstarg" && break
Packit Service 8bf002
        # Otherwise, the last argument is the destination.  Remove it from $@.
Packit Service 8bf002
	for arg
Packit Service 8bf002
	do
Packit Service 8bf002
          if test -n "$dstarg"; then
Packit Service 8bf002
	    # $@ is not empty: it contains at least $arg.
Packit Service 8bf002
	    set fnord "$@" "$dstarg"
Packit Service 8bf002
	    shift # fnord
Packit Service 8bf002
	  fi
Packit Service 8bf002
	  shift # arg
Packit Service 8bf002
	  dstarg=$arg
Packit Service 8bf002
	done
Packit Service 8bf002
	break;;
Packit Service 8bf002
  esac
Packit Service 8bf002
done
Packit Service 8bf002
Packit Service 8bf002
if test -z "$1"; then
Packit Service 8bf002
  if test -z "$dir_arg"; then
Packit Service 8bf002
    echo "$0: no input file specified." >&2
Packit Service 8bf002
    exit 1
Packit Service 8bf002
  fi
Packit Service 8bf002
  # It's OK to call `install-sh -d' without argument.
Packit Service 8bf002
  # This can happen when creating conditional directories.
Packit Service 8bf002
  exit 0
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
for src
Packit Service 8bf002
do
Packit Service 8bf002
  # Protect names starting with `-'.
Packit Service 8bf002
  case $src in
Packit Service 8bf002
    -*) src=./$src ;;
Packit Service 8bf002
  esac
Packit Service 8bf002
Packit Service 8bf002
  if test -n "$dir_arg"; then
Packit Service 8bf002
    dst=$src
Packit Service 8bf002
    src=
Packit Service 8bf002
Packit Service 8bf002
    if test -d "$dst"; then
Packit Service 8bf002
      mkdircmd=:
Packit Service 8bf002
      chmodcmd=
Packit Service 8bf002
    else
Packit Service 8bf002
      mkdircmd=$mkdirprog
Packit Service 8bf002
    fi
Packit Service 8bf002
  else
Packit Service 8bf002
    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
Packit Service 8bf002
    # might cause directories to be created, which would be especially bad
Packit Service 8bf002
    # if $src (and thus $dsttmp) contains '*'.
Packit Service 8bf002
    if test ! -f "$src" && test ! -d "$src"; then
Packit Service 8bf002
      echo "$0: $src does not exist." >&2
Packit Service 8bf002
      exit 1
Packit Service 8bf002
    fi
Packit Service 8bf002
Packit Service 8bf002
    if test -z "$dstarg"; then
Packit Service 8bf002
      echo "$0: no destination specified." >&2
Packit Service 8bf002
      exit 1
Packit Service 8bf002
    fi
Packit Service 8bf002
Packit Service 8bf002
    dst=$dstarg
Packit Service 8bf002
    # Protect names starting with `-'.
Packit Service 8bf002
    case $dst in
Packit Service 8bf002
      -*) dst=./$dst ;;
Packit Service 8bf002
    esac
Packit Service 8bf002
Packit Service 8bf002
    # If destination is a directory, append the input filename; won't work
Packit Service 8bf002
    # if double slashes aren't ignored.
Packit Service 8bf002
    if test -d "$dst"; then
Packit Service 8bf002
      if test -n "$no_target_directory"; then
Packit Service 8bf002
	echo "$0: $dstarg: Is a directory" >&2
Packit Service 8bf002
	exit 1
Packit Service 8bf002
      fi
Packit Service 8bf002
      dst=$dst/`basename "$src"`
Packit Service 8bf002
    fi
Packit Service 8bf002
  fi
Packit Service 8bf002
Packit Service 8bf002
  # This sed command emulates the dirname command.
Packit Service 8bf002
  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
Packit Service 8bf002
Packit Service 8bf002
  # Make sure that the destination directory exists.
Packit Service 8bf002
Packit Service 8bf002
  # Skip lots of stat calls in the usual case.
Packit Service 8bf002
  if test ! -d "$dstdir"; then
Packit Service 8bf002
    defaultIFS='
Packit Service 8bf002
	 '
Packit Service 8bf002
    IFS="${IFS-$defaultIFS}"
Packit Service 8bf002
Packit Service 8bf002
    oIFS=$IFS
Packit Service 8bf002
    # Some sh's can't handle IFS=/ for some reason.
Packit Service 8bf002
    IFS='%'
Packit Service 8bf002
    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
Packit Service 8bf002
    shift
Packit Service 8bf002
    IFS=$oIFS
Packit Service 8bf002
Packit Service 8bf002
    pathcomp=
Packit Service 8bf002
Packit Service 8bf002
    while test $# -ne 0 ; do
Packit Service 8bf002
      pathcomp=$pathcomp$1
Packit Service 8bf002
      shift
Packit Service 8bf002
      if test ! -d "$pathcomp"; then
Packit Service 8bf002
        $mkdirprog "$pathcomp"
Packit Service 8bf002
	# mkdir can fail with a `File exist' error in case several
Packit Service 8bf002
	# install-sh are creating the directory concurrently.  This
Packit Service 8bf002
	# is OK.
Packit Service 8bf002
	test -d "$pathcomp" || exit
Packit Service 8bf002
      fi
Packit Service 8bf002
      pathcomp=$pathcomp/
Packit Service 8bf002
    done
Packit Service 8bf002
  fi
Packit Service 8bf002
Packit Service 8bf002
  if test -n "$dir_arg"; then
Packit Service 8bf002
    $doit $mkdircmd "$dst" \
Packit Service 8bf002
      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
Packit Service 8bf002
      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
Packit Service 8bf002
      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
Packit Service 8bf002
      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
Packit Service 8bf002
Packit Service 8bf002
  else
Packit Service 8bf002
    dstfile=`basename "$dst"`
Packit Service 8bf002
Packit Service 8bf002
    # Make a couple of temp file names in the proper directory.
Packit Service 8bf002
    dsttmp=$dstdir/_inst.$$_
Packit Service 8bf002
    rmtmp=$dstdir/_rm.$$_
Packit Service 8bf002
Packit Service 8bf002
    # Trap to clean up those temp files at exit.
Packit Service 8bf002
    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
Packit Service 8bf002
    trap '(exit $?); exit' 1 2 13 15
Packit Service 8bf002
Packit Service 8bf002
    # Copy the file name to the temp name.
Packit Service 8bf002
    $doit $cpprog "$src" "$dsttmp" &&
Packit Service 8bf002
Packit Service 8bf002
    # and set any options; do chmod last to preserve setuid bits.
Packit Service 8bf002
    #
Packit Service 8bf002
    # If any of these fail, we abort the whole thing.  If we want to
Packit Service 8bf002
    # ignore errors from any of these, just make sure not to ignore
Packit Service 8bf002
    # errors from the above "$doit $cpprog $src $dsttmp" command.
Packit Service 8bf002
    #
Packit Service 8bf002
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
Packit Service 8bf002
      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
Packit Service 8bf002
      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
Packit Service 8bf002
      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
Packit Service 8bf002
Packit Service 8bf002
    # Now rename the file to the real destination.
Packit Service 8bf002
    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
Packit Service 8bf002
      || {
Packit Service 8bf002
	   # The rename failed, perhaps because mv can't rename something else
Packit Service 8bf002
	   # to itself, or perhaps because mv is so ancient that it does not
Packit Service 8bf002
	   # support -f.
Packit Service 8bf002
Packit Service 8bf002
	   # Now remove or move aside any old file at destination location.
Packit Service 8bf002
	   # We try this two ways since rm can't unlink itself on some
Packit Service 8bf002
	   # systems and the destination file might be busy for other
Packit Service 8bf002
	   # reasons.  In this case, the final cleanup might fail but the new
Packit Service 8bf002
	   # file should still install successfully.
Packit Service 8bf002
	   {
Packit Service 8bf002
	     if test -f "$dstdir/$dstfile"; then
Packit Service 8bf002
	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
Packit Service 8bf002
	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
Packit Service 8bf002
	       || {
Packit Service 8bf002
		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
Packit Service 8bf002
		 (exit 1); exit 1
Packit Service 8bf002
	       }
Packit Service 8bf002
	     else
Packit Service 8bf002
	       :
Packit Service 8bf002
	     fi
Packit Service 8bf002
	   } &&
Packit Service 8bf002
Packit Service 8bf002
	   # Now rename the file to the real destination.
Packit Service 8bf002
	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
Packit Service 8bf002
	 }
Packit Service 8bf002
    }
Packit Service 8bf002
  fi || { (exit 1); exit 1; }
Packit Service 8bf002
done
Packit Service 8bf002
Packit Service 8bf002
# The final little trick to "correctly" pass the exit status to the exit trap.
Packit Service 8bf002
{
Packit Service 8bf002
  (exit 0); exit 0
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
# Local variables:
Packit Service 8bf002
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit Service 8bf002
# time-stamp-start: "scriptversion="
Packit Service 8bf002
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit Service 8bf002
# time-stamp-end: "$"
Packit Service 8bf002
# End: