#! /bin/bash
#
# Copyright (c) 2000-2001 Silicon Graphics, Inc.  All Rights Reserved.
#
# This script emulates bsd install and also recognises
# two environment variables, with the following semantics :-
#
# $DIST_MANIFEST - if set, the name of the file to append manifest
#                  information in the following format:
#                  File     :  f mode owner group src target
#                  Directory:  d mode owner group target
#                  Symlink  :  l linkval target
#
# $DIST_ROOT     - if set, prepend to target
#
# The sematics of all combinations of these two variables
# are as follows:
#
# $DIST_MANIFEST?  $DIST_ROOT? |   Copy?  Append Manifest?
# -----------------------------+--------------------------
#       not set       not set  |    yes        no
#       not set       set      |    yes        no
#       set           not set  |    no         yes
#       set           set      |    yes        yes
#
_usage() {
    echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory"
    echo "or     $prog [-D] [-o owner] [-g group] [-m mode] file directory/file"
    echo "or     $prog [-o owner] [-g group] [-m mode] file [file ...] directory"
    echo "or     $prog -S file target  (creates \"target\" symlink)"
    echo "or     $prog -T lt_arg [-o owner] [-g group] [-m mode] libtool.lai directory"
    echo ""
    echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the"
    echo "behaviour of this command - see comments in the script."
    echo "The -D flag is only available for the second usage, and causes"
    echo "the target directory to be created before installing the file."
    echo ""
    exit 1
}

_chown ()
{
    _st=255
    if [ $# -eq 3 ] ; then
	chown $1:$2 $3
	_st=$?
	if [ $_st -ne 0 ] ; then
	    if [ $REAL_UID != '0' ] ; then
		if [ ! -f $DIST_ROOT/.chown.quiet ] ; then
		    echo '==============================================='
		    echo Ownership of files under ${DIST_ROOT:-/}
		    echo cannot be changed
		    echo '==============================================='
		    if [ -n "$DIST_ROOT" ] ; then
			touch $DIST_ROOT/.chown.quiet
		    fi
		fi
	       _st=0
	    fi     
	fi
    fi

    return $_st
}


_manifest ()
{ 
    echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null}
}

prog=`basename $0`
HERE=`pwd`
dflag=false
Dflag=false
Sflag=false
Tflag=false
DIRMODE=755
FILEMODE=644
OWNER=`id -u`
GROUP=`id -g`
REAL_UID=$OWNER

# default is to install and don't append manifest
INSTALL=true
MANIFEST=:

: ${DIST_ROOT:=${DESTDIR}}

[ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false
[ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest"

[ $# -eq 0 ] && _usage

if $INSTALL
then
    CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
else
    CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
fi

[ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true

while getopts "Dcm:d:S:o:g:T:" c $*
do
   case $c in
   c)
	;;
   g)
	GROUP=$OPTARG
	;;
   o)
	OWNER=$OPTARG
	;;
   m)
	DIRMODE=`expr $OPTARG`
	FILEMODE=$DIRMODE
	;;
   D) 
	Dflag=true
	;;
   S) 
	symlink=$OPTARG
	Sflag=true
	;;
   d) 
	dir=$DIST_ROOT/$OPTARG
	dflag=true
	;;
   T)
	lt_install=$OPTARG
	Tflag=true
	;;
   *)
   	_usage
	;;
   esac
done

shift `expr $OPTIND - 1`

status=0
if $dflag
then
    #
    # first usage
    #
    $MKDIR -p $dir 
    status=$?
    if [ $status -eq 0 ]
    then
	$CHMOD $DIRMODE $dir
	status=$?
    fi
    if [ $status -eq 0 ]
    then
	$CHOWN $OWNER $GROUP $dir
	status=$?
    fi
    $MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT}
elif $Sflag
then
    #
    # fourth usage (symlink)
    #
    if [ $# -ne 1 ]
    then
    	_usage
    else
    	target=$DIST_ROOT/$1
    fi
    $LN -s -f $symlink $target
    status=$?
    $MANIFEST l $symlink ${target#$DIST_ROOT} 
elif $Tflag
then
    #
    # -T (install libs built by libtool)
    #
    if [ $# -ne 2 ]
    then
	_usage
    else
	libtool_lai=$1
	# source the libtool variables
	if [ ! -f $libtool_lai ]
	then
		echo "$prog: Unable to find libtool library file $libtool_lai"
		exit 2
	fi
	. ./$libtool_lai
	target=$DIST_ROOT/$2
    fi
    case $lt_install in
    so_dot_version)
	# Loop until we find libfoo.so.x.y.z, then break out.
	for solib in $library_names
	do
		# does it have enough parts?  libfoo.so.x.y.z == 5
		cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
		if [ $cnt -eq 5 ]
		then
			install_name=$target/$solib
			$CP $solib $install_name
			status=$?
			$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$solib ${install_name#$DIST_ROOT}
			break
		fi
	done
	;;

    so_*)
	case $lt_install in
	so_dot_current)
		# ln -s libfoo.so.x.y.z to libfoo.so.x
		from_parts=5  # libfoo.so.x.y.z
		to_parts=3    # libfoo.so.x
		;;
	so_base)
		# ln -s libfoo.so.x to libfoo.so
		from_parts=3  # libfoo.so.x
		to_parts=2    # libfoo.so
		;;
	*)
		echo "$prog: -T $lt_install invalid"
		exit 2
		;;
	esac

	# Loop until we find the names, then break out.
	for solib in $library_names
	do
		# does it have enough parts?
		cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
		if [ $cnt -eq $from_parts ]
		then
			from_name=$solib
		elif [ $cnt -eq $to_parts ]
		then
			to_name=$solib
		fi

		if [ -n "$from_name" ] && [ -n "$to_name" ]
		then
			install_name=$target/$to_name
			$LN -s -f $from_name $install_name
			status=$?
			$MANIFEST l $from_name ${install_name#$DIST_ROOT}
			break
		fi
	done
	;;
    old_lib)
	install_name=$target/$old_library
	$CP $old_library $install_name
	status=$?
	$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$old_library ${install_name#$DIST_ROOT}
	;;
    *)
	echo "$prog: -T $lt_install invalid"
	exit 2
	;;
    esac

    case $lt_install in
    old_lib|so_dot_version)
	if [ $status -eq 0 ]
	then
		$CHMOD $FILEMODE $install_name
		$CHOWN $OWNER $GROUP $install_name
	fi
	;;
    esac

else
    list=""
    dir=""
    if [ $# -eq 2 ]
    then
	#
	# second usage
	#
	f=$1
	dir=$DIST_ROOT/$2
	if $Dflag
	then
	    mkdir -p `dirname $dir`
	fi
	$CP $f $dir
	status=$?
	if [ $status -eq 0 ]
	then 
	    if [ -f $dir/$f ]
	    then
		$CHMOD $FILEMODE $dir/$f
		status=$?
		if [ $status -eq 0 ]
		then
		    $CHOWN $OWNER $GROUP $dir/$f
		    status=$?
		fi
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
	    else
		$CHMOD $FILEMODE $dir
		status=$?
		if [ $status -eq 0 ]
		then
		    $CHOWN $OWNER $GROUP $dir
		    status=$?
		fi
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT}
	    fi
	fi
    else
	#
	# third usage
	#
	n=1
	while [ $# -gt 0 ]
	do
	    if [ $# -gt 1 ]
	    then
		list="$list $1"
	    else
		dir=$DIST_ROOT/$1
	    fi
	    shift
	done

	# echo DIR=$dir list=\"$list\"
	for f in $list
	do
	    $CP $f $dir
	    status=$?
	    if [ $status -eq 0 ]
	    then
		$CHMOD $FILEMODE $dir/$f
		status=$?
		if [ $status -eq 0 ]
		then
		    $CHOWN $OWNER $GROUP $dir/$f
		    status=$?
		fi
		$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
	    fi
	    [ $status -ne 0 ] && break
	done
    fi
fi

exit $status
