OpenSolaris_b135/pkgdefs/SUNWpd/postinstall

#!/bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#pragma ident	"%Z%%M%	%I%	%E% SMI"
#
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
# SUNWpd postinstall script

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

ISA_TYPE_I386="i386"
ISA_TYPE_SPARC="sparc"

ISA_TYPE="$ARCH"

# 
# Driver info 
# 
DRV=glm
DRVALIAS="pci1000,b"
DRVPERM='* 0755 root sys'

NAMEMAJOR="$BASEDIR/etc/name_to_major"
MINORPERM="$BASEDIR/etc/minor_perm"
DEVLINKTB="$BASEDIR/etc/devlink.tab"
DRIVERALS="$BASEDIR/etc/driver_aliases"
PATH_TO_INST="$BASEDIR/etc/path_to_inst"
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
}

# SUNWpd contains ecpp on SPARC only - run on SPARC only
if [ "${ISA_TYPE}" = "${ISA_TYPE_SPARC}" ]; then
	# 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} -i '"pnpALI,1533,3" "ns87317-ecpp"' \
			-m '* 0666 root sys' -n ecpp || status=1
	fi
fi

rm -f /tmp/$$.*

# Do nothing on sparc machine.
if [ "${ISA_TYPE}" = "${ISA_TYPE_I386}" ]; then
	
	#
	# Select the correct add_drv options to execute for glm
	#
	if [ "${BASEDIR}" = "/" ]; then
		#
		# Irrespective of whether hardware exists
		# or not don't attempt to attach driver
		# to the hardware. This is to avoid problems
		# with installing a 32 bit driver on a 64 bit
		# running system.
		#
		ADD_DRV="add_drv -n"
	else
		#
		# On a client,
		# modify the system files and touch/reconfigure
		# for reconfigure reboot
		#
		ADD_DRV="add_drv -b ${BASEDIR}"
	fi

	# Remove references to symhisl if any in /etc/driver_aliases to
	# avoid confusion.
	grep -v "symhisl \"${DRVALIAS}\"\>" $DRIVERALS > $DRIVERALS.new
	mv $DRIVERALS.new $DRIVERALS

	# Remove references to symhisl if any in /etc/path_to_inst to
	# avoid confusion.
	grep -v $DRVALIAS $PATH_TO_INST > $PATH_TO_INST.new
	mv $PATH_TO_INST.new $PATH_TO_INST

	#
	# Make sure add_drv has *not* been previously executed
	# before attempting to add glm driver.
	#
	grep -w "${DRV}" ${BASEDIR}/etc/name_to_major > /dev/null 2>&1
	if [ $? -eq 1 ]; then
		${ADD_DRV} -m "${DRVPERM}" -i "\"${DRVALIAS}\"" -c scsi ${DRV}
		if [ $? -ne 0 ]; then
			echo "\nFailed add_drv!\n" >&2
			exit 1
		fi
	else
		exit 0
	fi
fi

exit $status