#! /bin/sh

# @(#) postinstall	1.1 93/05/10 12:46:54

PATH="/usr/bin:/usr/sbin:${PATH}"
export PATH
NAMEMAJOR="$BASEDIR/etc/name_to_major"
MINORPERM="$BASEDIR/etc/minor_perm"
DEVLINKTB="$BASEDIR/etc/devlink.tab"

if test ! -f ${NAMEMAJOR} -o ! -w ${NAMEMAJOR}
then
	echo "add_major: data file ${NAMEMAJOR} is missing/inacessible." >&2
	exit 1
fi

if test ! -f ${MINORPERM} -o ! -w ${MINORPERM}
then
	echo "add_minor: data file ${MINORPERM} is missing/inacessible." >&2
	exit 1
fi

if test ! -f ${DEVLINKTB} -o ! -w ${DEVLINKTB}; then
	echo "add_devlink: data file ${DEVLINKTB} is missing/inacessible." >&2
	exit 1
fi


trap "rm -f /tmp/$$.*;exit" 0 1 2 3 13 15
TMP=/tmp/$$

# adds new major numbers to system for device drivers
# Usage:
#	add_major name1 name2 name3 name4 ....

add_major()
{
sort +1 -2n ${NAMEMAJOR} | nawk '#
BEGIN	{oldmajor = -1}
NR == 1	{n=split(namelist,x)
	 if (n < 1)
	    exit(1)
	 for (i=1; i<=n; i++)
	    chklist[x[i]]++
	}
	{for (name in chklist)
	 {
	    if ($1 == name)
		delete chklist[name]
	 }
	 if (($2 - oldmajor) > 1)
	 {
	    gap++
	    gaplist[gap] = oldmajor " " $2;
	 }
	 oldmajor = $2;
	}
END	{addsize=1
	 for (name in chklist)
	    addlist[addsize++] = name
	
	 addidx = 1
	 for (i=1; i<=gap && addidx < addsize; i++)
	 {
	    split(gaplist[i],x)
	    begmajor = x[1]
	    endmajor = x[2]
	    for (begmajor++;begmajor < endmajor && addidx < addsize;)
	    {
		printf "%s %d\n",addlist[addidx],begmajor
		addidx++
		begmajor++
	    }
	 }
	 for (; addidx < addsize; addidx++)
	 {
	    oldmajor++
	    printf "%s %d\n",addlist[addidx],oldmajor
	 }
	}
' namelist="$*" - > $TMP.new
if [ -s $TMP.new ]
then
#    echo "Adding following devices to ${NAMEMAJOR}"
#    cat $TMP.new
    sort +1 -2n ${NAMEMAJOR} $TMP.new -o ${NAMEMAJOR}
fi
}


# adds new minor permissions to system for device drivers
# Usage:
#	add_minor perm1 perm2 perm3 perm4 ....
#    i.e.
#	add_minor 'sd:* 0666 bin bin' 'sd:a 0644 root sys'

add_minor()
{
for p in "$@"
do echo "$p"
done | nawk '#
FILENAME != "-"	{permtab[$1] = $0;next}
FILENAME == "-"	{
		 if ($4 == "") {
			 printf("Missing token: (%s), skipping.\n", $0)
			 next
		 }
		 if ($5 != "") {
			 printf("Too many arguments: (%s), skipping.\n", $0)
			 next
		 }
		 if ($1 !~ /:/) {
			 printf("Bad name:minor pair: %s, skipping.\n", $1)
			 next
		 }
		 if ($2 < "0000" || $2 > "4777") {
			 printf("Bad mode: %s, skipping %s.\n", $2, $1)
			 next
		 }
		 if (!($1 in permtab))
		     print >> permtmp
		 next
		}
' permtmp=$TMP.perm ${MINORPERM} - >&2

if [ -s $TMP.perm ]
then
#	echo "Adding following permissions to ${MINORPERM}"
#	cat $TMP.perm
sort +0 -1 ${MINORPERM} $TMP.perm -o ${MINORPERM}
fi
}

# adds new entries to devlink.tab file
# Usage:
#	add_devlink spec1 spec2 spec3 spec4 ...
#
#	where each <spec> is:
#	    <devfs-spec> <dev-name> <dev-link>
#
#    i.e.
#	add_devlink 'type=ddi_display;name=SUNW,leo' 'fbs/\\M0' 'leo\\N0'	
#

add_devlink()
{
while test $# -ge 3
do
echo "$1	$2	$3"
shift 3
done | nawk '-F	' '#
FILENAME == "-"		{devlinktab[$1] = $0;next}
FILENAME != "-"		{if ($1 in devlinktab)
			     delete devlinktab[$1]
			}
END			{for (d in devlinktab)
			    print devlinktab[d] >> devlinktmp
			}
' devlinktmp=$TMP.devlink - ${DEVLINKTB} >&2

if [ -s $TMP.devlink ]
then
	cat $TMP.devlink >> ${DEVLINKTB}
fi
}


link_fb()
{
	#
	# Link fb in if necessary
	#
	/usr/sbin/prtconf -F > /dev/null 2>&1
	if [ $? -eq 0 ]
	then
		fbdev=`ls /devices\`/usr/sbin/prtconf -F 2>&1\`* 2>/dev/null`
		if [ $? -eq 0 ]
		then
			set `echo ${fbdev}`
			rm -f /dev/fb
			ln -s $1 /dev/fb
		fi
	fi
}

# If $BASEDIR isn't / (ie, we're doing a netinstall or a CD-ROM install)
# then update name_to_major, minor_perm, and devlink.tab by hand.
# otherwise, use add_drv.

if [ "$BASEDIR" = "/" ]
then 	
	#
	# We're modifying the running kernel
	#
	if /usr/sbin/prtconf -vp | /bin/fgrep -s "'tcx'"; then
		add_devlink 'type=ddi_display;name=tcx' \
			    'fbs/\M0' 'tcx\N0'
		/usr/sbin/add_drv -m '* 0666 root sys' tcx
		rc=$?
		link_fb
		test $rc -eq 0 && sh /etc/init.d/tcxconfig && exit 0
		## fall thru if errors in add_drv ##
	fi
fi

#
# We're modifying a mounted kernel
#
add_major tcx
add_minor 'tcx:* 0666 root sys'
add_devlink 'type=ddi_display;name=tcx'  'fbs/\M0' 'tcx\N0'
touch ${BASEDIR}/reconfigure

if [ "$BASEDIR" = "/" ]
then
	echo "" >&2
	echo "NOTE: Reboot your system so that the TCX driver is loaded." >&2
	echo "" >&2
fi

exit 0
