#! /bin/sh
#
# 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=:

[ -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
