# This script creates the backout package for a patch package
#
# directory format options.
#
#pragma ident	"@(#)postinstall	1.30	10/04/14 SMI"
#
# Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

# Definitions for override safety mechanism
PATCH_OVERRIDE_LIB="${PKG_INSTALL_ROOT}/usr/lib/patch/patch_override_lib"

# Check if we messaging is ready. Returns 0 on success, 1 on failure
# On successful run it leaves MSG_FILENAME variable defined
# 
# Usage:
#
# check_patch_script_messaging
#
check_patch_script_messaging()
{
	TMP_DIRNAME="/var/run"
	MSG_FILENAME="${TMP_DIRNAME}/patchadd_msg_file_${SUNW_PATCHID}"

	if [ -w "${MSG_FILENAME}" ] ; then
		unset TMP_DIRNAME
		return 0
	else
		unset TMP_DIRNAME
		unset MSG_FILENAME
		return 1
	fi
}

# This function prepares a message to be printed to stdout towards the end
# of postpatch execution. If the message file is not ready, it at least tries
# immediate output to stdout which is currently know to work only in patch
# level scripts.
#
# Usage:
#
# print_patch_message "text_of_message_to_be_printed_out"
#
print_patch_message()
{
	if check_patch_script_messaging; then
		echo "$*" >> "${MSG_FILENAME}"
	else
		echo "$*"
	fi

	return 0
}

# script in a fucntion so that it can be overridden if needed - generic
postinstall_deflt()
{
	# Description:
	#       Set the TYPE parameter for the remote file
	#
	# Parameters:
	#       none
	#
	# Globals set:
	#	TYPE
	#

	set_TYPE_parameter () {
		if [ ${PATCH_UNDO_ARCHIVE:?????} = "/dev" ]; then
			# handle device specific stuff
			TYPE="removable"
		else
			TYPE="filesystem"
		fi
	}

	#
	# Description:
	#       Build the remote file that points to the backout data
	#
	# Parameters:
	#       $1:	the un/compressed undo archive
	#
	# Globals set:
	#	UNDO, STATE

	build_remote_file () {
		remote_path=$PKGSAV/$SUNW_PATCHID/remote
		set_TYPE_parameter
		STATE="active"

		if [ $1 = "undo" ]; then
			UNDO="undo"
		else
			UNDO="undo.Z"
		fi

		cat > $remote_path <<- EOF
	# Backout data stored remotely
	TYPE=$TYPE
	FIND_AT=$ARCHIVE_DIR/$UNDO
	STATE=$STATE
	EOF
	}

	SED="/usr/bin/sed"
	CP="/usr/bin/cp"
	MV="/usr/bin/mv"
	POSTINSTALL_ERR_LOG="$PKG_INSTALL_ROOT/var/run/$SUNW_PATCHID.postinstall_log.$$"
	RET_STATUS=0

	PATH=/usr/sadm/bin:$PATH
	PATCH_COMMON_LIB="/usr/lib/patch/patch_common_lib"
	SAFEMODE_FAILED="Exiting! Patch deferred activation failed"

	# Set LC_ALL to avoid risk of undefined behavior
	LC_ALL=C
	export LC_ALL

	if [ "$SAFEMODE_INSTALL" = "true" ] ; then
		if [ ! -s "$PATCH_COMMON_LIB" ]; then
			puttext "$SAFEMODE_FAILED"
			exit 1
		fi
		. $PATCH_COMMON_LIB
		InitSafemode || {
			puttext $SAFEMODE_FAILED
			exit 1
		}
	fi

	if [ "$PKG_INSTALL_ROOT" = "/" ]; then
		PKG_INSTALL_ROOT=""
	fi

	if [ -n "$PATCH_BUILD_DIR" -a -d "$PATCH_BUILD_DIR" ]; then
		BUILD_DIR="$PATCH_BUILD_DIR/$SUNW_PATCHID.$PKGINST"
	else
		BUILD_DIR="$PKG_INSTALL_ROOT/var/tmp/$SUNW_PATCHID.$PKGINST"
	fi

	if [ ! -n "$PATCH_UNDO_ARCHIVE" ]; then
		PATCH_UNDO_ARCHIVE="none"
	fi

	FILE_DIR=$BUILD_DIR/files
	RELOC_DIR=$FILE_DIR/reloc
	ROOT_DIR=$FILE_DIR/root
	BO_Deletes=$FILE_DIR/deletes
	THIS_DIR=`dirname $0`
	PROTO_FILE=$BUILD_DIR/prototype
	TEMP_REMOTE=$PKGSAV/$SUNW_PATCHID/temp

	# If patch includes pkg_* scripts, deliver them into the pspool area
	#
	PKGDB="/var/sadm/pkg/$PKGINST"
	PSPOOL_PKG="$PKGDB/save/pspool/$PKGINST"


	for script in $SCRIPTS_DIR/*; do
		srcscript=`basename $script`
		targscript=`echo $srcscript | nawk '
			/^pkg_/ {
				print "pspool";
				next;
			}
			{ print "dont_use" } '`
		if [ "$targscript" = "dont_use" ]; then
			continue
		fi
		if [ "$targscript" = "pspool" ]; then
			# If the target script is a pspool script, then we need
			# to do the following:
			#	1) If the script is delivered for the first time
			#	   then add it to the deletes file of the undo
			#	   package.
			#	2) Else backup the script in the undo package,
			#	   replace the script and update the undo packag
			#	   prototype file.
			script=`echo $srcscript | $SED 's/pkg_//'`
			if [ -d "$PKG_INSTALL_ROOT$PSPOOL_PKG/install" ] ; then
				# We are delivering script into pspool area
				[ "$PATCH_NO_UNDO" != "true" ] && {
					if [ -f "$PKG_INSTALL_ROOT$PSPOOL_PKG/install/$script" ]; then
						$MV $PKG_INSTALL_ROOT$PSPOOL_PKG/install/$script $FILE_DIR/$srcscript
						echo "i $srcscript=$FILE_DIR/$srcscript" >> $PROTO_FILE
					else
						echo "$PSPOOL_PKG/install/$script" >> $BO_Deletes
					fi
				}
				$CP $SCRIPTS_DIR/$srcscript $PKG_INSTALL_ROOT$PSPOOL_PKG/install/$script
			fi
			if [ -d "$PKG_INSTALL_ROOT$PKGDB/install" ] ; then
				# If patch delivers pkg_* scripts which is pkgrm relevant
				# deliver them also into /var/sadm/install/pkg/<pkg>/install
				scripttype=`echo $srcscript | nawk '
					/^pkg_preremove$|^pkg_postremove$|^pkg_r\./ {
						print "pkgremove";
						next;
					}
					{ print "dont_use" } '`

				if [ "$scripttype" = "pkgremove" ] ; then
					[ "$PATCH_NO_UNDO" != "true" ] && {
					if [ -f "$PKG_INSTALL_ROOT$PKGDB/install/$script" ]; then
						# Due to previously existing bug scripts could be different
						# in /var/sadm/pkg/<pkg>/install and
						# /var/sadm/pkg/<pkg>/save/pspool/<pkg>/install
						# After backout we will go back to the exactly same state
						# Because of that we create pkgrm_* file in backout package
						$MV $PKG_INSTALL_ROOT$PKGDB/install/$script $FILE_DIR/pkgrm_$script
						echo "i pkgrm_$script=$FILE_DIR/pkgrm_$script" >> $PROTO_FILE
					else
						echo "$PKGDB/install/$script" >> $BO_Deletes
					fi
					}
					$CP $SCRIPTS_DIR/$srcscript $PKG_INSTALL_ROOT$PKGDB/install/$script
				fi
			fi
		fi
	done
	
	#
	# At this point we either have a deletes file or we don't. If we do,
	# we create a prototype entry.
	#
	if [ -f $BO_Deletes ]; then
		echo "i deletes=$BO_Deletes" >> $BUILD_DIR/prototype
	fi

	if [ -f $BUILD_DIR/pkginfo ] ; then
		/usr/bin/grep "^SUNW_PATCH_SAFE_MODE=" $SCRIPTS_DIR/../pkginfo >> \
		    $BUILD_DIR/pkginfo
	fi 

	#
	# Now delete everything in the deletes list after transferring
	# the file to the backout package and the entry to the prototype
	# file. Remember that the pkgmap will get the CLIENT_BASEDIR path
	# but we have to actually get at it using the BASEDIR path. Also
	# remember that removef will import our PKG_INSTALL_ROOT
	#
	# If this is a safemode patch package and it has a deletes file in it
	# then handle the deletion of an object for safemode patching.
	#
	Our_Deletes=$THIS_DIR/deletes
	if [ -f $Our_Deletes ]; then
		PSPOOL_DIR="/var/sadm/pkg/$PKGINST/save/pspool/$PKGINST/install"
		UNREGISTER_LIST=/var/run/.$$.unregister.paths.$$
		UNREGISTER_BATCH=/var/run/.$$.unregister.batch.$$
		/usr/bin/rm -f $UNREGISTER_LIST

		cd $BASEDIR
		cat $Our_Deletes | while read path; do
			# If this patch is deleting any pspool script, then the
			# deleted file would have any entry for the script
			# relative to the PKG_INSTALL_ROOT. We have to parse it
			# and process it as follows.
			#	1) build the complete path.
			#	2) move the file to undo package.
			#	3) Add it to the prototype file of undo package.
			Dir=`/usr/bin/dirname $path`
			if [ "$Dir" = "$PSPOOL_DIR" ]; then
				path="${PKG_INSTALL_ROOT:-/}$path"
				if [ -f $path ]; then
					filename=`/usr/bin/basename $path`
					spoolname="pkg_$filename"
					spoolfile="$FILE_DIR/$spoolname"
					mv -f $path $spoolfile
					echo "i $spoolname=$spoolfile" >> $BUILD_DIR/prototype
				fi
				continue;
			fi
			Reg_File=0

			if valpath -l $path; then
				Client_Path="$CLIENT_BASEDIR/$path"
				Build_Path="$RELOC_DIR/$path"
				Proto_Path=$BASEDIR/$path
			else	# It's an absolute path
				Client_Path=$path
				Build_Path="$ROOT_DIR$path"
				Proto_Path=$PKG_INSTALL_ROOT$path
			fi

			# If BASEDIR/CLIENTBASEDIR = "/", then the previous prepends
			# an extra / i.e. //. The sed command later can't find a
			# Proto_Path with // and therefore will not substitute the
			# correct build_Path resulting in the backout pkg not being
			# created.

			if [ "$CLIENT_BASEDIR" = "/" ]; then
				Client_Path=`echo $Client_Path | sed 's|^\/\/|\/|'`
				Proto_Path=`echo $Proto_Path | sed 's|^\/\/|\/|'`
			fi
				
			# Note: If the file isn't really there, pkgproto
			# doesn't write anything but displays an error
			# so check for the file before processing.

			if [ -f "$Proto_Path" ]; then
				LINE=`pkgproto $Proto_Path=$path`
			else
				continue
			fi

			ftype=`echo $LINE | nawk '{ print $1 }'`
			if [ "$ftype" = "f" ]; then
				Reg_File=1
			fi

			if [ $Reg_File = 1 ]; then
				# Add source file to the prototype entry
				if [ "$Proto_Path" = "$path" ]; then
					LINE=`echo $LINE | sed -e "s|$Proto_Path|$Build_Path|2"`
				else
					LINE=`echo $LINE | sed -e "s|$Proto_Path|$Build_Path|"`
				fi

				DirName=`dirname $Build_Path`
				# make room in the build tree
				mkdir -p $DirName
				cp -p $Proto_Path $Build_Path
			fi

			# Insert it into the prototype file
			echo $LINE 1>>$PROTO_FILE 2>/dev/null
			echo "$Client_Path" >> $UNREGISTER_LIST
		done

		# We need to group the deletes entries for performance reasons. Only 100
		# entries are taken in a single batch, since we don't want to exceed the
	        # number of arguments passed during removef program invocation, and 
	        # 100 seems to a good tradeoff.

		batch_start_line=1
		batch_end_line=100

		if [ -s "$UNREGISTER_LIST" ]; then
			while [ 1 ] ; do
				/usr/bin/sed -n "$batch_start_line,$batch_end_line p" $UNREGISTER_LIST > $UNREGISTER_BATCH
				[ -s $UNREGISTER_BATCH ] || break
				if [ "$SAFEMODE_INSTALL" = "true" ]; then
					# Handle deletion of an object for safemode patching
					HandleSafemodeDeleteObject $PKGINST "`/usr/bin/tr '\n' ' ' < $UNREGISTER_BATCH`"
				else
					# Remove the file only if it's OK'd by removef
					/usr/sbin/removef $PKGINST `/usr/bin/tr '\n' ' ' < $UNREGISTER_BATCH` | while read path; do
						/usr/bin/rm "$path"
					done
				fi
				batch_start_line=`/usr/bin/expr $batch_start_line + 100`
				batch_end_line=`/usr/bin/expr $batch_end_line + 100`
			done
			/usr/sbin/removef -f $PKGINST
		fi
		/usr/bin/rm -f $UNREGISTER_LIST $UNREGISTER_BATCH

		rm $Our_Deletes
	fi

	#
	# Unless specifically denied, make the backout package.
	#
	if [ "$PATCH_NO_UNDO" != "true" ]; then
		cd $BUILD_DIR	# We have to build from here.

		if [ "$PATCH_UNDO_ARCHIVE" != "none" ]; then
			STAGE_DIR="$PATCH_UNDO_ARCHIVE"
			ARCHIVE_DIR="$PATCH_UNDO_ARCHIVE/$SUNW_PATCHID/$PKGINST"
			mkdir -p $ARCHIVE_DIR
			mkdir -p $PKGSAV/$SUNW_PATCHID
		else
			if [ -d $PKGSAV/$SUNW_PATCHID ]; then
				rm -r $PKGSAV/$SUNW_PATCHID
			fi
			STAGE_DIR=$PKGSAV
			ARCHIVE_DIR=$PKGSAV/$SUNW_PATCHID
			mkdir $ARCHIVE_DIR
		fi

		ERR_LOG_DIR=`dirname $POSTINSTALL_ERR_LOG`
		if [ ! -d $ERR_LOG_DIR ]; then
			mkdir -p $ERR_LOG_DIR
		fi

		/usr/bin/pkgmk -o -d $STAGE_DIR 1>$POSTINSTALL_ERR_LOG 2>&1
		retcode=$?
		if [ "$retcode" != 0 ]; then
			echo "pkgmk(1) failed with error code $retcode" >> $POSTINSTALL_ERR_LOG
			echo "The $PKGINST backout package will not get created" >> $POSTINSTALL_ERR_LOG
			RET_STATUS=1
		else
			/usr/bin/pkgtrans -s $STAGE_DIR $ARCHIVE_DIR/undo $PKG 1>>$POSTINSTALL_ERR_LOG 2>&1
			retcode=$?
			if [ "$retcode" != 0 ]; then
				echo "pkgtrans(1) failed with error code $retcode" >> $POSTINSTALL_ERR_LOG
				echo "The $PKGINST backout package will not get created" >> $POSTINSTALL_ERR_LOG
				RET_STATUS=1
			else
				compress $ARCHIVE_DIR/undo
				retcode=$?
				if [ "$retcode" != 0 ]; then
					echo "compress(1) returned error code $retcode"
					echo "The $PKGINST backout package will not be compressed."
					echo "Continuing to process backout package."
				fi
				if [ "$PATCH_UNDO_ARCHIVE" != "none" ]; then
					if [ $retcode != 0 ]; then
						build_remote_file "undo"
					else
						build_remote_file "undo.Z"
					fi
				fi
			fi
		fi

		rm -r $STAGE_DIR/$PKG

		cd ..
		rm -r $BUILD_DIR
	fi

	# remove the scripts that are left behind
	install_scripts=`dirname $0`
	rm -f $install_scripts/checkinstall $install_scripts/patch_* \
	    $install_scripts/pkg_* $install_scripts/u.* $install_scripts/i.*

	#
	# Since this apparently worked, we'll mark as obsoleted the prior
	# versions of this patch - installpatch deals with explicit obsoletions.
	#
	cd ${PKG_INSTALL_ROOT:-/}
	cd var/sadm/pkg

	active_base=`echo $SUNW_PATCHID | nawk '
		{ print substr($0, 1, match($0, "-")-1) } '`

	List=`ls -d $PKGINST/save/${active_base}* 2>/dev/null`
	if [ $? -ne 0 ]; then
		List=""
	fi

	for savedir in $List; do
	        patch=`basename $savedir` 
	        if [ $patch = $SUNW_PATCHID ]; then
			break
		fi

	        # If we get here then the previous patch gets deleted
		if [ -f $savedir/undo ]; then
			mv $savedir/undo $savedir/obsolete
			echo $SUNW_PATCHID >> $savedir/obsoleted_by
		elif [ -f $savedir/undo.Z ]; then
			mv $savedir/undo.Z $savedir/obsolete.Z
			echo $SUNW_PATCHID >> $savedir/obsoleted_by
	        elif  [ -f $savedir/remote ]; then
	                `grep . $PKGSAV/$patch/remote | sed 's|STATE=.*|STATE=obsolete|' > $TEMP_REMOTE` 
	                rm -f $PKGSAV/$patch/remote 
	                mv $TEMP_REMOTE $PKGSAV/$patch/remote  
	                rm -f $TEMP_REMOTE 
	                echo $SUNW_PATCHID >> $savedir/obsoleted_by
		elif  [ -f $savedir/obsolete -o -f $savedir/obsolete.Z ]; then
			echo $SUNW_PATCHID >> $savedir/obsoleted_by
		fi
	done

	if [ "$RET_STATUS" != 0 ]; then
		cat $POSTINSTALL_ERR_LOG
		echo "Execution of postinstall encountered problems"
		echo "postinstall exited with 1"
		rm -f $POSTINSTALL_ERR_LOG
		exit $RET_STATUS
	else
		rm -f $POSTINSTALL_ERR_LOG
	fi
}

# script in a fucntion so that it can be overridden if needed - particular
postinstall_merge()
{
	# If additional operations are required for this package, place
	# those package-specific commands here.

	#XXXSpecial_CommandsXXX#

#!/sbin/sh

#
# Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
#
#ident	"@(#)postinstall	1.140	10/04/13 SMI"
#

#
# postinstall script for SUNWos86r package.
#
	
# check_add_drv() checks if the module has an entry in
# etc/name_to_major.  If not, it simply calls add_drv with the arguments
# given. If there is such an entry in name_to_major file, it adds
# entries in driver_aliases driver_classes and minor_perm if necessary.
# The syntax of this function is the same as add_drv.

check_add_drv()
{
	basedir=/
	alias=""
	class=""
	ADD_ALIAS=0
	ADD_CLASS=0
	ADD_MINOR=0
	OPTIND=1
	IS_NET_DRIVER=0

	cmd="add_drv"

	while getopts i:b:m:c:n  opt
	do
		case $opt in
			i )	ADD_ALIAS=1	
				alias=$OPTARG
				cmd=$cmd" -i '$alias'"
				;;
			m )	ADD_MINOR=1
				minor=$OPTARG
				cmd=$cmd" -m '$minor'"
				;;
			c)	ADD_CLASS=1
				class=$OPTARG
				cmd=$cmd" -c $class"
				;;
			b)	basedir=$OPTARG
				cmd=$cmd" -b $basedir"
				;;
			n)	IS_NET_DRIVER=1
				;;
			\?) 	echo "check_add_drv can not handle this option"
				return
				;;
			esac
	done 
	shift `/usr/bin/expr $OPTIND - 1`
	
	drvname=$1

	cmd=$cmd" "$drvname

	drvname=`echo $drvname | /usr/bin/sed 's;.*/;;g'`

	/usr/bin/grep "^$drvname[ 	]" $basedir/etc/name_to_major >  /dev/null 2>&1

	if [ $? -ne 0 ] 
	then
		eval $cmd
	else	
		# entry already in name_to_major, add alias, class, minorperm
		# if necessary
		if [ $ADD_ALIAS = 1 ]	
		then
			for i in $alias
			do
				/usr/bin/egrep "^$drvname[ 	]+$i" $basedir/etc/driver_aliases>/dev/null 2>&1
				if [ $? -ne 0 ]
				then
					echo "$drvname $i" >> $basedir/etc/driver_aliases	
				fi
			done
		fi

		if [ $ADD_CLASS = 1 ]
		then
			/usr/bin/egrep "^$drvname[ 	]+$class( |	|$)" $basedir/etc/driver_classes > /dev/null 2>&1
			if [ $? -ne 0 ]
			then 
				echo "$drvname\t$class" >> $basedir/etc/driver_classes
			fi
		fi

		if [ $ADD_MINOR = 1 ]
		then
			/usr/bin/grep "^$drvname:" $basedir/etc/minor_perm > /dev/null 2>&1
			if [ $? -ne 0 ]
			then 
				minorentry="$drvname:$minor"
				echo $minorentry >> $basedir/etc/minor_perm
			fi
		fi

	fi

	# The following clone device/dev is needed for Custom Jumpstart

	if [ $IS_NET_DRIVER -eq 1 ]
	then
		CLONE_DEVICE=devices/pseudo/clone@0:$drvname
		set `/usr/bin/grep "^clone[ 	]" $basedir/etc/name_to_major`
		CLONE_MAJ=$2
		set `/usr/bin/grep "^$drvname[ 	]" $basedir/etc/name_to_major`
		DRIVER_MAJ=$2
		mknod $basedir/$CLONE_DEVICE c $CLONE_MAJ $DRIVER_MAJ
		chmod 600 $basedir/$CLONE_DEVICE
		chgrp sys $basedir/$CLONE_DEVICE
		chown root $basedir/$CLONE_DEVICE
		ln -s ../$CLONE_DEVICE $basedir/dev/$drvname
	fi
	
}


# check_rem_drv() checks if the module has an entry in
# etc/name_to_major.  If so, it simply calls rem_drv with the arguments
# given to remove the driver from the system.  The syntax of this
# function is the same as rem_drv.

check_rem_drv()
{
	basedir=/
	OPTIND=1

	cmd="rem_drv"

	while getopts b: opt
	do
		case $opt in
			b)	basedir=$OPTARG
				cmd=$cmd" -b $basedir"
				;;
			\?) 	echo "check_rem_drv can not handle this option"
				return
				;;
			esac
	done 
	shift `/usr/bin/expr $OPTIND - 1`
	
	drvname=$1

	cmd=$cmd" "$drvname

	drvname=`echo $drvname | /usr/bin/sed 's;.*/;;g'`

	/usr/bin/grep "^$drvname[ 	]" $basedir/etc/name_to_major >  /dev/null 2>&1

	if [ $? -eq 0 ] 
	then
		eval $cmd
	fi
}

#
# Update entries in the /etc/driver_classes for drivers which change
# from class "scsi" to class "dada".
#
drvclasses_updates()
{
	nawk "
	BEGIN {
	  #  Drivers in class "dada"
	  drv[\"chs\"] = 1
	  }
	/^#/ || /^$/ {
	  print
	  next
	  }

	# Advertise the direct-attach drivers as class "dada" 

	drv[\$1] > 0 {
	  \$2 = \"dada\"
	  }
	{ printf \"%s\t%s\n\", \$1, \$2 }" ${BASEDIR}/etc/driver_classes > /tmp/d.$$

	cp /tmp/d.$$ ${BASEDIR}/etc/driver_classes
	rm /tmp/d.$$
}

# Platform-specific drivers
case "${ARCH}" in
i386)
	drvclasses_updates
	check_add_drv -b "${BASEDIR}" \
		-i '"pci1011,2" "pci1011,9" "pci1011,14" "pci1011,19"
		"pci1109,1400" "pci1109,2400" "pci10b8,2001" "pci2646,1"' \
		dnet
	check_add_drv -b "${BASEDIR}" -i \
		'"pci10b7,9000" "pci10b7,9001" "pci10b7,9004" "pci10b7,9005"
		"pci10b7,9006" "pci10b7,9050" "pci10b7,9051" "pci10b7,9055"
		"pci10b7,9056" "pci10b7,9200" "pci10b7,9800" "pci10b7,9805"' \
		elxl
	check_add_drv -b "${BASEDIR}" \
		-i '"pci1022,2000" "pci103c,104c"' \
		pcn
	check_add_drv -b "${BASEDIR}" \
		-i '"pci1011,21" "pci1014,22"' \
		pci_pci
	check_add_drv -b "${BASEDIR}" \
		-c scsi \
		-i '"pci1022,2020"' \
		pcscsi
	check_add_drv -b "${BASEDIR}" \
		-c dada -i '"pci1014,2e"' \
		chs
	check_add_drv -b "${BASEDIR}" \
		-c scsi \
		-i '"pci1000,1" "pci1000,2" "pci1000,3" "pci1000,4" "pci1000,6"
		"pci1000,c" "pci1000,f" "pci1000,8f" ' \
		ncrs
	check_add_drv -b "${BASEDIR}" \
		-i '"pci8086,1029" "pci8086,1229"
		"pci8086,1229.8086.1"    "pci8086,1229.8086.2"
		"pci8086,1229.8086.3"    "pci8086,1229.8086.4"
		"pci8086,1229.8086.5"    "pci8086,1229.8086.6"
		"pci8086,1229.8086.7"    "pci8086,1229.8086.8"
		"pci8086,1229.8086.9"    "pci8086,1229.8086.a"
		"pci8086,1229.8086.b"    "pci8086,1229.8086.c"
		"pci8086,1229.8086.d"    "pci8086,1229.8086.e"
		"pci8086,1229.8086.f"    "pci8086,1229.8086.10"
		"pci8086,1229.8086.11"   "pci8086,1229.8086.12"
		"pci8086,1229.8086.13"   "pci8086,1229.8086.30"
		"pci8086,1229.8086.31"   "pci8086,1229.8086.40"
		"pci8086,1229.8086.41"   "pci8086,1229.8086.42"
		"pci8086,1229.8086.50"   "pci8086,1229.8086.1009"
		"pci8086,1229.8086.100c" "pci8086,1229.8086.1012"
		"pci8086,1229.8086.1013" "pci8086,1229.8086.1015"
		"pci8086,1229.8086.1016" "pci8086,1229.8086.1017"
		"pci8086,1229.8086.1030" "pci8086,1229.8086.1040"
		"pci8086,1229.8086.1041" "pci8086,1229.8086.1042"
		"pci8086,1229.8086.1050" "pci8086,1229.8086.1051"
		"pci8086,1229.8086.1052" "pci8086,1229.8086.10f0"
		"pci8086,1229.8086.1229" "pci8086,1229.8086.2009"
		"pci8086,1229.8086.200d" "pci8086,1229.8086.200e"
		"pci8086,1229.8086.200f" "pci8086,1229.8086.2010"
		"pci8086,1229.8086.2013" "pci8086,1229.8086.2016"
		"pci8086,1229.8086.2017" "pci8086,1229.8086.2018"
		"pci8086,1229.8086.2019" "pci8086,1229.8086.2101"
		"pci8086,1229.8086.2102" "pci8086,1229.8086.2103"
		"pci8086,1229.8086.2104" "pci8086,1229.8086.2105"
		"pci8086,1229.8086.2106" "pci8086,1229.8086.2107"
		"pci8086,1229.8086.2108" "pci8086,1229.8086.2200"
		"pci8086,1229.8086.2201" "pci8086,1229.8086.2202"
		"pci8086,1229.8086.2203" "pci8086,1229.8086.2204"
		"pci8086,1229.8086.2205" "pci8086,1229.8086.2206"
		"pci8086,1229.8086.2207" "pci8086,1229.8086.2208"
		"pci8086,1229.8086.2402" "pci8086,1229.8086.2407"
		"pci8086,1229.8086.2408" "pci8086,1229.8086.2409"
		"pci8086,1229.8086.240f" "pci8086,1229.8086.2410"
		"pci8086,1229.8086.2411" "pci8086,1229.8086.2412"
		"pci8086,1229.8086.2413" "pci8086,1229.8086.3000"
		"pci8086,1229.8086.3001" "pci8086,1229.8086.3002"
		"pci8086,1229.8086.3006" "pci8086,1229.8086.3007"
		"pci8086,1229.8086.3008" "pci8086,1229.8086.3010"
		"pci8086,1229.8086.3011" "pci8086,1229.8086.3012"
		"pci8086,1229.8086.301a" "pci8086,1229.8086.3411"
		"pci8086,1030" "pci8086,1031" "pci8086,1032"
		"pci8086,1038" "pci8086,1039" "pci8086,103d"
		"pci8086,103d.8086.103d" "pci8086,2449"
		"pci8086,2449.8086.3010" "pci8086,2449.8086.3011"
		"pci8086,2449.8086.3012" "pci8086,2449.8086.3013"
		"pci8086,2449.8086.3014" "pci8086,2449.8086.3015"
		"pci8086,2449.8086.3016" "pci8086,2449.8086.3017"
		"pci8086,2449.8086.3018"' \
		iprb
	check_add_drv -b "${BASEDIR}" \
		-i '"pci10b8,5"' \
		spwr

	# The sd driver should be installed to the system before rcs9.sh
	# is called.
	check_add_drv -b "${BASEDIR}" \
		-m '* 0640 root sys' \
		-i '"scsiclass,00" "scsiclass,05"' \
		sd
	
	# Call the rcs9.sh script to update necessary files in case of upgrade
	# for the PCI physical device pathname change from 2.4.
	#
	# Also used to preserve escd.rf (devconf configuration information)
	# saved on floppy during an install boot.
	#

	if [ -s /tmp/diskette_rc.d/rcs9.sh ] 
	then
		/sbin/sh /tmp/diskette_rc.d/rcs9.sh "post"
	fi
	
	#
	# If there is no data in OWconfig, remove it.
	#
	OWC=/etc/openwin/server/etc/OWconfig
	removef $PKGINST $OWC |\
	while read pathname
	do
		if [ ! -s $pathname ]; then 
			echo Removing empty `basename $pathname`
			rm -f $pathname
		fi
	done	
	removef -f $PKGINST

	;;
esac

# Remove erroneous entry for Symbios Logic 53c875/95 (ncrs)
TMPFILE=/tmp/ncrs_tmp
sed -e '/^ncrs "pci1000,1000"$/d' ${BASEDIR}/etc/driver_aliases >$TMPFILE
cp $TMPFILE ${BASEDIR}/etc/driver_aliases

return 0
}

# load the override lib if it exists
if [ -f "${PATCH_OVERRIDE_LIB}" -a -r "${PATCH_OVERRIDE_LIB}" ] ; then
   . "${PATCH_OVERRIDE_LIB}"
fi

# execute the script functions
postinstall_deflt "$@"
postinstall_merge "$@"

exit 0
