#!/sbin/sh
#
#       @(#)startup.sh 1.67 99/01/22 SMI
#
# Copyright (c) 1992-1999 Sun Microsystems, Inc.  All Rights Reserved. Sun
# considers its source code as an unpublished, proprietary trade secret, and
# it is available only under strict license provisions.  This copyright
# notice is placed here only to protect Sun in the event the source is
# deemed a published work.  Dissassembly, decompilation, or other means of
# reducing the object code to human readable form is prohibited by the
# license agreement under which this code is provided to the user or company
# in possession of this copy.
#
# RESTRICTED RIGHTS LEGEND: Use, duplication, or disclosure by the Government
# is subject to restrictions as set forth in subparagraph (c)(1)(ii) of the
# Rights in Technical Data and Computer Software clause at DFARS 52.227-7013
# and in similar clauses in the FAR and NASA FAR Supplement.
#

### Acknowledge existence
echo "Solaris Web Start 3.0 installer"

SHELL=/sbin/sh
TEXTDOMAIN=SUNW_INSTALL_SCRIPTS
PATH=/sbin:/usr/sbin/install.d:${PATH}

PLATFORM=`/sbin/uname -p`

### Make the home directory a writable area
HOME=/tmp/root
export SHELL TEXTDOMAIN PATH PLATFORM HOME

# Local Variables
KDMCONFIG_NOGUI=/tmp/root/var/tmp/kdmconfig.nogui
OWCONFIG_FILE=/tmp/root/etc/openwin/server/etc/OWconfig
RUN_WIN=1
RUN_KDM=0

#
# Search for the sysid configuration file
# on the bootparams.
#
bootparams_sysid_config()
{
	MOUNT_CONFIG_DIR=/tmp/sysid_config.$$
	mkdir ${MOUNT_CONFIG_DIR}

	#
	# Check for a 'sysid_config' bootparams entry
	#
	set -- `/sbin/bpgetfile -retries 1 sysid_config`
	if [ $1"X" != "X" ]; then
		mount -o ro -F nfs $2:$3  \
			${MOUNT_CONFIG_DIR} >/dev/null 2>&1
					 
		if [ $? -eq 0 ]; then
			if [ -f ${MOUNT_CONFIG_DIR}/sysidcfg ]; then
				cp ${MOUNT_CONFIG_DIR}/sysidcfg /etc
				chmod 0600 /etc/sysidcfg
				echo "Using sysid configuration file ${2}:${3}/sysidcfg"
				return 0
			fi
			umount ${MOUNT_CONFIG_DIR}
		fi
	fi
	rmdir ${MOUNT_CONFIG_DIR}

	return 1
}

#
# Search for the sysid configuration file
# in DHCP.
#
dhcp_sysid_config()
{
	MOUNT_CONFIG_DIR=/tmp/sysid_config.$$
	mkdir ${MOUNT_CONFIG_DIR}

	#
	# Check for a 'sysid_config' bootparams entry
	#
	set -- `/sbin/dhcpinfo SsysidCF`
	if [ $1"X" != "X" ]; then
		mount -o ro -F nfs $1  \
			${MOUNT_CONFIG_DIR} >/dev/null 2>&1
					 
		if [ $? -eq 0 ]; then
			if [ -f ${MOUNT_CONFIG_DIR}/sysidcfg ]; then
				cp ${MOUNT_CONFIG_DIR}/sysidcfg /etc
				chmod 0600 /etc/sysidcfg
				echo "Using sysid configuration file ${1}/sysidcfg"
				return 0
			fi
			umount ${MOUNT_CONFIG_DIR}
		fi
	fi
	rmdir ${MOUNT_CONFIG_DIR}

	return 1
}

#
# Search for the sysid configuration file
# on the local floppy drive.  Try to mount
# PCFS first and then UFS
#
floppy_sysid_config()
{
	MOUNT_CONFIG_DIR=/tmp/sysid_config.$$

    # Check to see if there is a floppy in the drive (silently)
    #
    /usr/bin/eject -q floppy >/dev/null 2>&1

    if [ $? -eq 0 ]; then
        # Make the mount point directory used in searching
        # for the profile
        #
        if [ ! -d ${MOUNT_CONFIG_DIR} ]; then
            mkdir ${MOUNT_CONFIG_DIR} 2>/dev/null
        fi

        # Try to mount the floppy first as PCFS, then as UFS
        #
        mount -o ro,foldcase -F pcfs /dev/diskette ${MOUNT_CONFIG_DIR} \
                            >/dev/null 2>&1
        status=$?
        if [ ${status} -ne 0 ]; then
            mount -o ro -F ufs  /dev/diskette ${MOUNT_CONFIG_DIR} \
                            >/dev/null 2>&1
            status=$?
        fi

	if [ ${status} -eq 0 ]; then
		if [ -f ${MOUNT_CONFIG_DIR}/sysidcfg ]; then
			cp ${MOUNT_CONFIG_DIR}/sysidcfg /etc
			chmod 0600 /etc/sysidcfg
			echo "Using sysid configuration file from local floppy"
			# since the sysidcfg file was copied to /etc/sysidcfg
			# we can unmount the floppy and remove the
			# mount point before returning
			umount ${MOUNT_CONFIG_DIR}
			rmdir ${MOUNT_CONFIG_DIR}
			return 0
		fi
		umount ${MOUNT_CONFIG_DIR}
	fi

	rmdir ${MOUNT_CONFIG_DIR}
	fi

	return 1
}

# Export net boot configuration strategy. _INIT_NET_IF is set to the
# interface name of the netbooted interface if this is a net boot.
# _INIT_NET_STRATEGY is set to the network configuration strategy.
set -- `/sbin/netstrategy`
if [ $? -eq 0 ]; then
	if [ "$1" = "nfs" -o "$1" = "cachefs" ]; then
		_INIT_NET_IF="$2"
	fi
	_INIT_NET_STRATEGY="$3"
	export _INIT_NET_IF _INIT_NET_STRATEGY 
fi

### CD into our home dir
cd ${HOME}

#
# If the run level is changed after invocation, shell should
# be run
#
if [ -f /tmp/.sh ]; then
	exec ${SHELL}
else
	touch /tmp/.sh
fi

##########
# Make sure all configuration necessary is completed in order
# to run the window system

#
# Search for the sysidtool configuration
# in the following order
#	floppy (PCFS)
#	floppy (UFS)
#	network (bootparams or DHCP)
#
#echo "Searching for sysid configuration file..."
floppy_sysid_config
if [ $? -ne 0 ]; then
	# Look for sysidcfg via DHCP only if the network is using DHCP
	if [ "X${_INIT_NET_STRATEGY}" = "Xdhcp" ]; then
		dhcp_sysid_config
	else
		bootparams_sysid_config
	fi
#	if [ $? -ne 0 ]; then
#		echo "No sysid configuration file found"
#	fi
fi


#
# Configure the frame buffer links
#
fbdev=`ls /devices\`/usr/sbin/prtconf -F 2>&1\`* 2>/dev/null`

if [ $? -ne 0 ]; then
        RUN_WIN=0
else
        set `echo ${fbdev}`
        rm -f /dev/fb
        ln -s $1 /dev/fb

        # XXX temporary
        # NOTE: Why is this temporary and what is its purpose?
        #
        cd /dev/fbs
        for nm in *
        do
                if [ ! -h /dev/$nm ]; then
                        ln -s /dev/fbs/$nm /dev/$nm
                fi
        done

        # The code below for handling leo framebuffer configuration
        # should be generalized into a callout which can be
        # used for any framebuffer

        echo ${fbdev} | grep "SUNW\,leo" >/dev/null 2>&1
        if [ $? -eq 0 ]; then
                if [ -x /etc/rc2.d/S91leoconfig ]; then
                        /etc/rc2.d/S91leoconfig
                fi
        fi

        echo ${fbdev} | grep "PFU\,aga" >/dev/null 2>&1
        if [ $? -eq 0 ]; then
                 if [ -x /etc/rc2.d/S91agaconfig ]; then
                                 /etc/rc2.d/S91agaconfig start
                 fi
        fi

        echo ${fbdev} | grep "SUNW\,afb" >/dev/null 2>&1
        if [ $? -eq 0 ]; then
                if [ -x /etc/rc2.d/S91afbinit ]; then
                        /etc/rc2.d/S91afbinit
                fi
        fi

	echo ${fbdev} | grep "SUNW\,Expert3D" >/dev/null 2>&1
	if [ $? -eq 0 ]; then
		if [ -x /etc/rc2.d/S91ifbinit ]; then
			/etc/rc2.d/S91ifbinit start
		fi
	fi

        cd ${HOME}

        case "${PLATFORM}" in
        ppc|i386)
                RUN_KDM=1
                ;;
        esac
fi

#
# Remove un-needed /dev symlinks, since each one uses a page in tmpfs.
#
rm -f /tmp/dev/pts/4? /tmp/dev/pts/3? /tmp/dev/pts/2? /tmp/dev/pts/1?
rm -f /tmp/dev/win1?? /tmp/dev/win[1-9]? /tmp/dev/win[5-9]
rm -f /tmp/dev/ptyp[5-9] /tmp/dev/ptyp[a-f]
rm -f /tmp/dev/ttyp[5-9] /tmp/dev/ttyp[a-f]
rm -f /tmp/dev/ptyq* /tmp/dev/ptyr* /tmp/dev/ttyq* /tmp/dev/ttyr*

TotalRAM=`/usr/sbin/prtconf | grep '^Memory size: ' | \
		sed -e 's/^Memory size: //' -e 's/ .*$//' `

MemUnit=`/usr/sbin/prtconf | grep '^Memory size: ' | \
		sed -e 's/^Memory size: [0-9][0-9]* //' `

case $MemUnit in
	Kilobytes) TotalRAM=`expr $TotalRAM / 1000` ;;
	Megabytes) ;;
	Gigabytes) TotalRAM=`expr $TotalRAM \* 1000` ;;
	*)	   TotalRAM=0 ;;
esac
if [ "$TotalRAM" -lt "64" ]
then
  	echo "64Mb of memory is required for Solaris."
	echo "${TotalRAM}Mb was found."
	echo "Exiting"
	exec sh
fi

### Ask for which locale to run in
### and source out the locale vars
getLocale /tmp/.localeFile
. /tmp/.localeFile

### Make sure there is a MULTI variable set
if [ -z $MULTI ]; then
	MULTI=NO
fi

if [ $MULTI = "YES" ]; then
	if [ "${PLATFORM}" = "i386" ]; then
		#
		# For i386, we know what the terminal type will be. Avoid asking the
		# question inside of sysidnet
		#
		TERM=sun-color; export TERM
		/usr/sbin/sysidconfig
		#
		# Now decide, based on which files kdmconfig created
		# whether to bring up the GUI or CUI.
		#
		if [ ! -f ${OWCONFIG_FILE} ]; then
		  RUN_WIN=0
		elif [ -f ${KDMCONFIG_NOGUI} ]; then
		  RUN_WIN=0
		fi
	else
	#	#
		# Configure the frame buffer links
		#
		fbdev=`ls /devices\`/usr/sbin/prtconf -F 2>&1\`* 2>/dev/null`

		if [ $? -ne 0 ]; then
			RUN_WIN=0
		else
			set `echo ${fbdev}`
			rm -f /dev/fb
			ln -s $1 /dev/fb

			# XXX temporary
			# NOTE: Why is this temporary and what is its purpose?
			#
			cd /dev/fbs
			for nm in *
			do
				if [ ! -h /dev/$nm ]; then
					ln -s /dev/fbs/$nm /dev/$nm
				fi
			done
	
			# The code below for handling leo framebuffer configuration
			# should be generalized into a callout which can be
			# used for any framebuffer
	
			echo ${fbdev} | grep "SUNW\,leo" >/dev/null 2>&1
			if [ $? -eq 0 ]; then
				if [ -x /etc/rc2.d/S91leoconfig ]; then
					/etc/rc2.d/S91leoconfig
				fi
			fi

			echo ${fbdev} | grep "PFU\,aga" >/dev/null 2>&1
			if [ $? -eq 0 ]; then
				 if [ -x /etc/rc2.d/S91agaconfig ]; then
						 /etc/rc2.d/S91agaconfig start
				 fi
			fi


			cd ${HOME}

			if [ "${PLATFORM}" = "ppc" ]; then
				RUN_KDM=1
			fi
		fi
	fi
	if [ $RUN_WIN -eq 0  -o -f /tmp/.nowin ];then
		if [ ! -f /tmp/.nowin ];then
		  touch -f /tmp/.nowin
		fi
		/sbin/cd0_install
	else
	  	### Run setup root to set up our X vars
	  	/sbin/setupRoot $HOME
		PATH=$PATH:/usr/openwin/bin:/usr/dt/bin; export PATH
		OPENWINHOME=/usr/openwin; export OPENWINHOME
		/usr/openwin/bin/xinit /usr/dt/bin/Xsession -- -nobanner
	fi
else
  	if [ $RUN_WIN -eq 0 ];then
		if [ ! -f /tmp/.nowin ];then
			touch -f /tmp/.nowin
		fi
	fi
	/sbin/cd0_install
fi
