#!/sbin/sh
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# All rights reserved.
#
#pragma ident   "@(#)rootreserve.m4 1.14     01/03/27 SMI"

ss=$1
SSAADM=/usr/sbin/ssaadm
SCSSA=/opt/SUNWcluster/bin/scssa
SDS_BINDIR=/usr/sbin

if [ "${ss}" != "start" -a "${ss}" != "stop" ]; then
	echo "Usage: /etc/init.d/rootreserve { start | stop }"
	exit 1
fi

# To fix /tmp security vulnerablility /var/opt/SUNWcluster/run
# was created. Clean out the temporary files each time the
# machine boots up.
#
if [ -d /var/opt/SUNWcluster/run ]; then
        /bin/rm -f /var/opt/SUNWcluster/run/*
fi


do_cmd ()
{	
	case $ss in
	'start' )
		if [ -f ${SSAADM} ]; then
			${SSAADM} reserve /dev/rdsk/$1
		else
			${SCSSA} reserve $1
		fi ;;
	'stop' )
		if [ -f ${SSAADM} ]; then
	        	${SSAADM} release /dev/rdsk/$1
		else
			${SCSSA} release $1
		fi ;;
	esac
}


# look for '/' in vfstab
rootdev=`cat /etc/vfstab | egrep -v "^[	 ]*#" | \
    egrep '[	 ]/[	 ]' | /usr/bin/awk '{print $2}'`

# is field 2 an entry of the form '/dev/rdsk'?
echo "${rootdev}" | egrep '/dev/rdsk/c[0-9]+t[0-9]+d[0-9]s[0-9]' \
    > /dev/null 2>&1

if [ $? -eq 0 ]; then
	# field 2 indicates a regular, non-mirrored, low-level /dev/rdsk device
	rootdev=`echo ${rootdev} | sed -e 's/s[0-9]/s2/'`
	rootdev=`echo ${rootdev} | sed -e 's|/dev/rdsk/||'`
	do_cmd "${rootdev}"
else
	# is field 2 a VxVM metadevice?
	echo "${rootdev}" | egrep '/dev/vx/rdsk/rootvol' > /dev/null 2>&1
	if [ $? -eq 0 ]; then
		# find out if the root is mirrored,
		# get the mirrors and reserve them
		# changes by bugid 4337710
		dm=`/usr/sbin/vxprint | grep dm | awk '$2 ~ /^rootdisk/ || \
			$2 ~ /^rootmirr/ { print $2 }'| uniq`
		# reserve each component
		for d in ${dm}; do
			rootdev=`/usr/sbin/vxprint | grep dm | grep ${d} | \
				awk '{print $3}'`
		# changes end
			do_cmd "${rootdev}"
		done
	else
		# is field 2 a DiskSuite metadevice?
		echo "${rootdev}" | egrep '/dev/md/rdsk' > /dev/null 2>&1
		if [ $? -ne 0 ]; then
			echo \
		"${rootdev}: Unrecognizable root device - not reserved"
			exit 1
		fi
		components=`${SDS_BINDIR}/metastat ${rootdev} 2> /dev/null | \
		    egrep c[0-9]+t[0-9]+d[0-9]s[0-9] | \
		    awk '{print $1}' | sort | uniq`
		if [ -z "$components" ]; then
			echo \
		"Unable to determine components comprising ${rootdev}"
			exit 1
		fi
		# reserve each component
		for p in ${components}; do
			# reserve each submirror
			do_cmd "${p}"
		done
	fi
fi

exit 0
