#!/sbin/sh
#
#ident	"@(#)startup.sh	1.83	03/03/25 SMI"
#
# Copyright (c) 1992-1995 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.
#
# NOTE:	run as the runlevel 234 process; invoked from the inittab; invokes
#	sysconfig with all necessary environment setup
#

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

PLATFORM=`/sbin/uname -p`

# make home dir to a writeable place
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

# where to store locale variables
LOCFILE=/tmp/.localeFile


#
# Read the LANG and LC_MESSAGES from /etc/default/init and use it
#
locale_from_init()
{
	# where to source variables from
	SRCFILE=$1

	#
	# Source in all LANG, LC_*, and TZ settings and export them
	# Make sure LANG doesn't already have a value (it is initially C).
	#
	LANG=""
	. $SRCFILE
	export TZ
	export LANG LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME

	#
	# If LANG was set, make sure to explicitly set all LC_* values
	#
	if [ "${LANG}" ]; then
		LC_COLLATE=${LANG}
		LC_CTYPE=${LANG}
		LC_MESSAGES=${LANG}
		LC_MONETARY=${LANG}
		LC_NUMERIC=${LANG}
		LC_TIME=${LANG}
	fi
}

# determines if we are on the locale console, or
# on a serial console (i.e. tip'd into ttya)
# if we are, we know what the terminal type should
# be.
if [ -x /sbin/getconsole ] ; then
    CONSOLE_TERM=`/sbin/getconsole`
    if [ $? = 0 ] ; then
	ON_CONSOLE=$YES
	TERM=$CONSOLE_TERM;export TERM
    else 
	ON_CONSOLE=$NO
    fi
else
    # assume we aren't on the console,
    # so termtype questions get asked if needed.
    # 
    ON_CONSOLE=$NO
fi

#
# Main shell starts here
#

# 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 ${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

# first try and find the sysidcfg file
echo "Searching for configuration file(s)..."
/sbin/sysidfind

#
# 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} | egrep "SUNW\,Expert3D|SUNW\,XV-500|SUNW\,XVR-500" >/dev/null 2>&1
	if [ $? -eq 0 ]; then
		if [ -x /etc/rc2.d/S91ifbinit ]; then
			/etc/rc2.d/S91ifbinit start
		fi
	fi

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

	cd ${HOME}

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


# asks user for locale to run in, if we haven't already.
if [ ! -f /.localeAsked ] ; then
    /sbin/getLocale $LOCFILE
else
    # locale already asked.  Locale settings can be found in /etc/default/init.
    LOCFILE=/etc/default/init
fi

#
# If they just picked a multibyte locale, we don't want to start using
# it until the window system has started.
#
LOC=`grep "^LC_MESSAGES=" $LOCFILE 2>/dev/null \
			| sed -e '/^#/d' -e 's/.*=//'`
if [ -z "${LOC}" ] ; then
	LOC=`grep "^LANG=" $LOCFILE 2>/dev/null \
			| sed -e '/^#/d' -e 's/.*=//'`
fi

MBLOC=`(cd /usr/lib/locale; ls */LC_MESSAGES/openwin-defaultfont |
           sed -e 's:^\([^/]*\)/.*$:\1:') | nawk -v "LOC=$LOC" '
		{
			if (substr(LOC, 1, length($0)) == $1) { 
				if (length(foundloc) < length($0)) { 
					foundloc=$0; 
				} 
			} 
		} 

		END {print foundloc;}'`

if [ -n "${MBLOC}" -a "$ON_CONSOLE" = "$YES" ] ; then
	# They picked a multibyte locale.  Save it, but stay in C for now.
	echo "${MBLOC}" >/tmp/.mb_locale
else
	# They picked a single-byte locale, or they picked a multibyte locale
	# they're not using a local console.  Enable the chosen locale.
	locale_from_init $LOCFILE
fi

#
# non-SPARC systems require the keyboard/mouse/display hardware be configured
# for the sake of creating the OWconfig file.
# To do this, we try to set the correct locale (the Intel and PPC console
# display's are 8-bit clean so this may work.
# Run kdmconfig to configure the OWconfig file.
#
# In 2.6, the existence of the OWconfig file is not enough to
# guarantee that we want to try and bring up a GUI environment.
# kdmconfig may write out an OWconfig file with values of "Unknown"
# for some of the attributes.  So, the OWconfig file check has been
# enhanced with a check for the KDMCONFIG_NOGUI file in the case that
# the OWconfig exists.
# sysidconfig runs kdmconfig, and kdmconfig will create this file
# in the case that the GUI environment should not be set up.
#
if [ "${RUN_KDM}" -eq 1 ]; then
	#
	# If we're doing a jumpstart, see if there is a terminal type available
	# to us from the net.  We do a similar piece of logic in the sysconfig
	# script to catch the case of sparc systems (which don't run
	# kdmconfig).
	# Note: This is a private interface and may change at any time.
	#
	# sysidcfg should be used to provide the terminal type over the network
	#
	#if [ -z "${TERM}" ]; then
	#	if [ -f ${PREINSTALL} -o -f ${INSTALLBOOT} ]; then
	#		if [ $USING_DHCP -eq 1 ] ; then
	#			set  -- `/sbin/dhcpinfo VTerm`
	#		else
	#			set -- `/sbin/bpgetfile term`
	#		fi
	#		if [ $# -eq 3 ]; then
	#			if [ ! -z "$3" ]; then
	#				TERM="$3"
	#			fi
	#		elif [ $# -eq 2 ]; then
	#			if [ ! -z "$2" ]; then
	#				TERM="$2"
	#			fi
	#		fi
	#		if [ ! -z "${TERM}" ]; then
	#			echo "TERM set to \"${TERM}\"."
	#			export TERM
	#		fi
	#	fi
	#fi

	#
	# This routine calls kdmconfig, which creates OWconfig
	# and KDMCONFIG_NOGUI.
	#
	/usr/sbin/sysidconfig

	# kdmconfig will destroy symlinks if it is run on a
	# writable miniroot (think dvd).  re-create it here
	# if that happens.
	if [ ! -h /etc/openwin/server/etc/OWconfig ];then
	    if [ -f ${OWCONFIG_FILE} ];then
		cd /etc/openwin/server/etc
		#kdmconfig killed the symlink
		mv OWconfig $OWCONFIG_FILE
		ln -s  ../../../../tmp/root/etc/openwin/server/etc/OWconfig .
		cd /tmp/root
		### Bugid's 4270374 and 4270445, 
		### when 4270445 is fixed this can be deleted.
		DEPTH=`grep defdepth ${OWCONFIG_FILE} | sed -e 's:defdepth=::g' -e 's:\"::g'`
		if [ $DEPTH -lt 8 ];then
		    RUN_WIN=0
		fi
	    fi
	fi

	#
	# 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
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*

# Start up the window system unless the display device cannot be
# determined or the install process with explicitly booted with
# the "-nowin" option.
#
if [ -f /tmp/.nowin ] ; then
    RUN_WIN=0
fi

#
# If in a multi-byte locale and we're going to use a window system,
# run locale_from_init now just prior 
# to starting the window system. It was not run earlier since 
# local consoles do not support multi-byte locales.
#
if [ -f /tmp/.mb_locale -a "${RUN_WIN}" -eq 1 ]; then
	cp -p \
/usr/lib/locale/`cat /tmp/.mb_locale`/LC_MESSAGES/openwin-defaultfont \
	${HOME}/.openwin-defaultfont 2>/dev/console
	chmod 755 ${HOME}/.openwin-defaultfont

	locale_from_init $LOCFILE
fi
exec startinstall ${RUN_WIN}
