OpenSolaris_b135/pkgdefs/SUNWpd/postremove

#! /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
#

# ident	"%Z%%M%	%I%	%E% SMI"
#
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
# SUNWpd postremove script

killproc() {            # kill the named process(es)
	pid=`/usr/bin/ps -e |
	     /usr/bin/grep $1 |
	     /usr/bin/sed -e 's/^  *//' -e 's/ .*//'`
	[ "$pid" != "" ] && kill $pid
}


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

ISA_TYPE_I386="i386"
ISA_TYPE_SPARC="sparc"

ISA_TYPE="$ARCH"

NAMEMAJOR="${BASEDIR}/etc/name_to_major"
MINORPERM="${BASEDIR}/etc/minor_perm"
DEVLINKTB="$BASEDIR/etc/devlink.tab"
DRIVERALS="$BASEDIR/etc/driver_aliases"

#
# Driver info
#
DRV=glm
DRVPERM='* 0600 root sys'
DRVALIAS="\"pci1000,b\""
PATH_TO_INST="$BASEDIR/etc/path_to_inst"

rm -f /dev/pmc

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

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

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

if test ! -f ${DRIVERALS} -o ! -w ${DRIVERALS}; then
	echo "rem_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/$$

# removes major numbers from system for device drivers
# Usage:
#	rem_major name1 name2 name3 name4 ....

rem_major()
{
sort +1 -2n ${NAMEMAJOR} | nawk '#
NR == 1	{n=split(namelist,x)
	 if (n < 1)
	    exit(1)
	 for (i=1; i<=n; i++)
	    chklist[x[i]]++
	}
	{if ($1 in chklist)
		print
	}
' namelist="$*" - > $TMP.del
if [ -s $TMP.del ]
then
    fgrep -v -x -f $TMP.del ${NAMEMAJOR} | sort +1 -2n -o ${NAMEMAJOR}
fi
}


# removes minor permissions from system for device drivers
# Usage:
#       rem_minor name1 name2 name3 name4 ....
#    i.e.
#       rem_minor 'sd:*' 'sd:a'

rem_minor()
{
for p in "$@"
do echo "$p"
done | nawk '#
FILENAME != "-" {permtab[$1] = $0;next}
FILENAME == "-" {
                 if ($1 !~ /:/) {
                         printf("Bad name:minor pair: %s, skipping.\n", $1)
                         next
                 }
                 if ($1 in permtab)
                     print permtab[$1] >> permdel
                 next
                }
' permdel=$TMP.perm ${MINORPERM} - >&2

if [ -s $TMP.perm ]
then
    fgrep -v -x -f $TMP.perm ${MINORPERM} | sort +0 -1 -o ${MINORPERM}
fi
}


# removes entries from devlink.tab file
# Usage: 
#       rem_devlink spec1 spec2 spec3 spec4 ...
#
#       where each <spec> is:
#           <devfs-spec> <dev-name> <dev-link>
#
#
 
rem_devlink()
{
while test $# -ge 2
do
echo "$1	$2"
shift 2
done | nawk '-F ' '#
FILENAME != "-"		{devlinktab[$1] = $0;next}
FILENAME == "-"		{if ($1 in devlinktab)
			    print devlinktab[$1] >> devlinktmp
			}
' devlinktmp=$TMP.devlink ${DEVLINKTB} - >&2
 
if [ -s $TMP.devlink ]
then
	fgrep -v -x -f $TMP.devlink ${DEVLINKTB} > $TMP.devlinknew && \
	cp $TMP.devlinknew ${DEVLINKTB}
fi
}


# removes entries to driver_aliases file
# Usage:
#	rem_drv_alias spec1 spec2 spec3
#
#	where spec is:
#		<driver> <alias>
#

rem_drv_alias()
{
while test $# -ge 2
do
	echo "$1 $2"
	shift 2
done | nawk '#
FILENAME != "-"		{drvalias[$1] = $0;next}
FILENAME == "-"		{if ($1 in drvalias)
			     print drvalias[$1] >> drvaliastmp
			}
' drvaliastmp=$TMP.drvalias ${DRIVERALS} - >&2

if [ -s $TMP.drvalias ]
then
#	echo Removing 
#	cat $TMP.drvalias

	fgrep -v -x -f $TMP.drvalias ${DRIVERALS} > $TMP.drvaliasnew && \
	cp $TMP.drvaliasnew ${DRIVERALS}
fi
}

# Remove drivers if installed
# SUNWpd contains ecpp on SPARC only - run on SPARC only
if [ "${ISA_TYPE}" = "${ISA_TYPE_SPARC}" ]; then
	modnum=`grep -c ecpp ${NAMEMAJOR}`
	if [ "$modnum" = "1" ]; then
		/usr/sbin/rem_drv -b ${BASEDIR} ecpp || status=1
	fi
fi

rm -f /tmp/$$.*

# Do not update on sparc machine
if [ "${ISA_TYPE}" = "${ISA_TYPE_I386}" ]; then
	#
	# Select the correct rem_drv options to execute.
	# Only attempt to unload the driver on a running system.
	#
	if [ "${BASEDIR}" = "/" ]; then
		REM_DRV="rem_drv"
	else
		REM_DRV="rem_drv -b ${BASEDIR}"
	fi

	#
	# before attempting to remove the driver.
	#
	grep -w "${DRV}" ${BASEDIR}/etc/name_to_major > /dev/null 2>&1
	if [ $? -eq 0 ]; then
		${REM_DRV} ${DRV}
		if [ $? -ne 0 ]; then
			echo "\nFailed rem_drv!\n" >&2
			exit 1
		fi
	fi

	#
	# rem_drv doesn't remove the entry in /dev therefore this script
	# will have to finish off that clean up.
	#
	rm -f ${BASEDIR}/dev/${DRV}

	#
	# restore symhisl entries
	#
	# Select the correct add_drv options to execute for symhisl
	#
	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
	echo "symhisl ${DRVALIAS}" >> ${BASEDIR}/etc/driver_aliases
	# Remove references to glm if any in /etc/path_to_inst to
	# avoid confusion.
	grep -v "pci1000,b@" $PATH_TO_INST >> $PATH_TO_INST.new
	mv $PATH_TO_INST.new $PATH_TO_INST
fi

exit $status