#!/bin/sh

# ident "@(#)postinstall	1.16     98/04/10 SMI"
# SUNWpd postinstall script
# Copyright (c) 1995 by Sun Microsystems, Inc.
# All rights reserved.
#

PATH="/usr/bin:/usr/sbin:${PATH}"
export PATH
EXIT=0
status=0

NAMEMAJOR="$BASEDIR/etc/name_to_major"
MINORPERM="$BASEDIR/etc/minor_perm"
DEVLINKTB="$BASEDIR/etc/devlink.tab"
DRIVERALS="$BASEDIR/etc/driver_aliases"
IUAP="$BASEDIR/etc/iu.ap"

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

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

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

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

trap "rm -f /tmp/$$.*;exit 1" 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
}


add_devlink()
{
while test $# -ge 2
do
echo "$1	$2"
shift 2
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
#       echo "Adding following entries to ${DEVLINKTB}"
#       cat $TMP.devlink
	cat $TMP.devlink >> ${DEVLINKTB}
fi
}


# adds new entries to driver_aliases file
# Usage:
#	add_drv_alias spec1 spec2 spec3
#
#	where spec is:
#		<driver> <alias>
#

add_drv_alias()
{
while test $# -ge 2
do
	echo "$1 $2"
	shift 2
done | nawk '#
FILENAME == "-"		{newaliases[$2] = $1;next}
FILENAME != "-"		{if ($2 in newaliases) {
			     if ($1 == newaliases[$2])
				 delete newaliases[$2]
			 }
			}
END			{for (d in newaliases)
			    print newaliases[d],d > drvalias
			}
' drvalias=$TMP.drvalias - ${DRIVERALS} >&2
 
if [ -s $TMP.drvalias ]
then
#   echo "Adding following entries to ${DRIVERALS}"
#   cat $TMP.drvalias
    cat $TMP.drvalias >> ${DRIVERALS}
fi
}

# add new entries in devlink.tab file
add_devlink 'type=ddi_pseudo;name=se'	'se_hdlc\N0' 'type=ddi_pseudo;name=ecpp'	'ecpp\N0'

# modunload the driver if installing on running system
if [ "${BASEDIR}" = "/" ]; then
        modnum=`set -- \`modinfo | grep ecpp\`; echo $1`
        if [ "$modnum" ]; then
                modunload -i $modnum
        fi
fi

# add_drv ecpp driver if not already installed
modnum=`grep -c ecpp ${NAMEMAJOR}`
if [ "$modnum" = "0" ]; then
	# add new entries to name_to_major, minor_perm,  driver_classes files
	/usr/sbin/add_drv -b ${BASEDIR} -m '* 0666 root sys' -n ecpp || status=1
fi

rm -f /tmp/$$.*

exit $status
