#!/bin/ksh -p
## Patch is the minimum path number that is required
## This assumes that the patch also includes a regular SUNW_REQUIRES for patch

PATH=/usr/bin:/usr/sbin:$PATH; export PATH
PKGCOND=/usr/bin/pkgcond


not_installed() {
        driver=$1
        grep "^${driver} " $ROOTDIR/etc/name_to_major > /dev/null 2>&1

        return $?
}

backup_sdconf() {
  if [ -f $ROOTDIR/kernel/drv/sd.conf ]; then
    if [ -f $ROOTDIR/var/sadm/pkg/SUNWckr/save/sd.conf ]; then
      cp $ROOTDIR/kernel/drv/sd.conf \
       $ROOTDIR/var/sadm/pkg/SUNWckr/save/sd.conf.$PatchNum.$$
      else
	cp $ROOTDIR/kernel/drv/sd.conf \
       $ROOTDIR/var/sadm/pkg/SUNWckr/save/sd.conf.$PatchNum
    fi
  fi
}


update_logindevperm() {
        cp $ROOTDIR/etc/logindevperm $ROOTDIR/etc/logindevperm.before-$PatchNum

}

load_mods() {
	## load modules during patch installation per 6349240
	## to prevent warnings from displaying on the console
	## before the system is rebooted.

	## find all kernel driver modules in patch
	PLATFORM=`uname -i`
	CLASS=`uname -m`
	cd  ${patchdir:-$PWD}

		for i in *
		do
		pkginfo `echo $i | cut -f 1 -d '.'` > /dev/null 2>&1
			if [ $? -eq 0 ]; then
				grep " kernel\>" $i/pkgmap | grep -v mpxio
				grep "/kernel\>" $i/pkgmap | grep "$PLATFORM" | grep -v "cpu/"
				grep "/kernel\>" $i/pkgmap | grep "$CLASS/" | grep -v "cpu"
			fi

		done 2>/dev/null | nawk '/^1 f/ && ! /\.conf|\/unix|\/genunix/ {print $4}' >/tmp/modules.$$

		if [ "$ROOTDIR" = "/" ] ; then

		##
		## Disable kernel module unloading
		##
		print "Disabling kernel module unloading ... \n"
		if [ -x /usr/bin/adb ]; then
			echo "moddebug/W20000" | adb -kw /dev/ksyms /dev/mem | grep moddebug > /dev/null 2>&1
		else
			echo "adb not found: patchadd not safe."
		fi

		while read line; do
		## preload each module
			[ -f /$line ] && {
				## echo "loading module $line"
				modload /$line > /dev/null 2>&1
			}

		done < /tmp/modules.$$

		fi

	mv /tmp/modules.$$ /tmp/backoutmods.$PatchNum
}

Execute_commands() {

   load_mods
   update_logindevperm
   backup_sdconf


   return 0
}

CheckZones()
{
	if [ "$ROOTDIR" = "/" -a -x /usr/bin/zonename ]; then
	ZONENAME=`/usr/bin/zonename`
		if [ ${ZONENAME} = "global" ]; then
			GLOBAL_ZONE=true
		else
			GLOBAL_ZONE=false
		fi
	else
	# Unable to determine zone
		GLOBAL_ZONE=true
	fi
}

LocalZones () {
# commands specific to non-gloabl zones
return 0

}

ExecuteInProperEnvironment () {
   if $PKGCOND is_whole_root_nonglobal_zone > /dev/null 2>&1 ; then
       # Execute non-global whole root zone commands.
	update_logindevperm;
       return 0
   fi

   if $PKGCOND is_nonglobal_zone > /dev/null 2>&1 ; then
       # Execute non-global zone commands. Should be no action here
       return 0
   fi

   if $PKGCOND is_netinstall_image > /dev/null 2>&1 ; then
       # Execute commands applicable to patching the mini-root.
	update_logindevperm;
       return 0
   fi

   if $PKGCOND is_mounted_miniroot > /dev/null 2>&1 ; then
       # Execute commands specific to the mini-root
	update_logindevperm;
       return 0
   fi

   if $PKGCOND is_diskless_client > /dev/null 2>&1 ; then
       # Execute commands specific to diskless client
	update_logindevperm;
       return 0
   fi

   if $PKGCOND is_alternative_root > /dev/null 2>&1 ; then
       # Execute commands specific to an alternate root
       Execute_commands;
       return 0
   fi

   if $PKGCOND is_global_zone > /dev/null 2>&1 ; then
       # In a global zone and system is mounted on /.
       Execute_commands;
       return 0
   fi
   return 1
} 

if [ -x "$PKGCOND" ] ; then
   ExecuteInProperEnvironment && exit 0 || exit 1
else
   CheckZones
   if [ "${GLOBAL_ZONE}" = "true" ]; then
        Execute_commands
   else
        LocalZones
   fi
fi

exit 0


