#!/bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh)
# and was modified by Aleksey Cheusov <vle@gmx.net>.
#
# Copyright 1991 by the Massachusetts Institute of Technology
# Copyright 2013-2014 by Aleksey Cheusov <vle@gmx.net>
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission.  M.I.T. makes no representations about the
# suitability of this software for any purpose.  It is provided "as is"
# without express or implied warranty.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch.  It can only install one file at a time, a restriction
# shared with many OS's install programs.


# set DOITPROG to echo to test this script
doit="${DOITPROG-}"

# put in absolute paths if you don't have them in your path; or use env. vars.

mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
lnsprog="${LNSPROG-ln -f -s}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"

instcmd="$mvprog"
chmodcmd=mkcchmod; mod=0755;
chowncmd=":"
chgrpcmd=":"
stripcmd=":"
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=""
dst=""
dir_arg=""

set -e

mkcchgrp () { $chgrpprog "$grp" "$@"; }
mkcchown () { $chownprog "$own" "$@"; }
mkcchmod () { $chmodprog "$mod" "$@"; }

while [ x"$1" != x ]; do
    case "$1" in
	-c) instcmd="$cpprog"
	    shift
	    continue;;

	-l) instcmd="$lnsprog"
	    shift
	    continue;;

	-d) dir_arg=true
	    shift
	    continue;;

	-m) mod="$2"
	    chmodcmd=mkcchmod
	    shift
	    shift
	    continue;;

	-o) own="$2"
	    chowncmd=mkcchown
	    shift
	    shift
	    continue;;

	-g) grp="$2"
	    chgrpcmd=mkcchgrp
	    shift
	    shift
	    continue;;

	-s) stripcmd="$stripprog"
	    shift
	    continue;;

	*)  if [ x"$src" = x ]; then
		src="$1"
	    else
		dst="$1"
	    fi
	    shift
	    continue;;
    esac
done

if test "_$instcmd" = "_$lnsprog"; then
    chowncmd=:
    chgrpcmd=:
    chmodcmd=:
    stripcmd=:
fi

if [ x"$src" = x ]; then
    echo "install:	no input file specified"
    exit 1
fi

if [ x"$dir_arg" != x ]; then
    dst="$src"

    if [ -d "$dst" ]; then
	instcmd=:
	chmodcmd=:
    else
	instcmd="$mkdirprog -p"
    fi
else

# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad 
# if $src (and thus $dsttmp) contains '*'.

    if [ -f "$src" -o -d "$src" ]; then
	true
    else
	echo "install:  $src does not exist"
	exit 1
    fi

    if [ x"$dst" = x ]; then
	echo "install:	no destination specified"
	exit 1
    fi

# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic

    if [ -d "$dst" ]; then
	dst="$dst"/`basename "$src"`
    fi
fi

##
dstdir=`dirname "$dst"`

if [ x"$dir_arg" != x ]; then
    $doit $instcmd "$dst"

    $doit $chowncmd "$dst"
    $doit $chgrpcmd "$dst"
    $doit $stripcmd "$dst"
    $doit $chmodcmd "$dst"
else
# Make sure that the destination directory exists.
    if [ ! -d "$dstdir" ]; then
	$mkdirprog -p "$dstdir"
    fi

# No renaming of the final executable
    dstfile=`basename "$dst"`

# Make a temp file name in the proper directory.

    dsttmp="$dstdir/#inst.$$#"

# Move or copy the file name to the temp name

    $doit $instcmd "$src" "$dsttmp"

    trap "rm -f '${dsttmp}'" 0

# and set any options; do chmod last to preserve setuid bits

# If any of these fail, we abort the whole thing.  If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.

    $doit $chowncmd "$dsttmp"
    $doit $chgrpcmd "$dsttmp"
    $doit $stripcmd "$dsttmp"
    $doit $chmodcmd "$dsttmp"

# Now rename the file to the real destination.

    $doit $rmcmd -f "$dstdir/$dstfile"
    $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
fi
