OpenSolaris_b135/cmd/power/svc-power

#!/sbin/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
#
#
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
#ident	"%Z%%M%	%I%	%E% SMI"
#
# If the /etc/power.conf file does not have a "statefile" entry
# to specify the pathname of the cpr statefile, build one and
# add the line.  We choose the largest of the standard Sun partitions.

init_statefile_entry() {
	[ ! -f /etc/power.conf -o ! -w /etc/power.conf ] && return

	# Whitespace regular expression below is [<TAB><SPACE>]

	pattern="^[ 	]*statefile[	 ][	 ]*/"
	[ `/usr/bin/grep -c "$pattern" /etc/power.conf` -ge 1 ] && return

	avail=0			# Free blocks in current filesystem
	max_avail=0		# Most available free blocks encountered so far
 	statefile=.CPR		# Default cpr statefile name

	# Remove old statefile (if any) from root
	[ -f /$statefile ] && /usr/bin/rm -f /$statefile

	/usr/bin/df -k -F ufs |
	(
		read line	# Skip past the header line of the df output

		while read device kbytes used avail capacity filesys; do
			case $filesys in
			/|/usr|/var|/export/home)
				if [ $avail -gt $max_avail ]; then
					max_avail=$avail
					winner=$filesys
				fi
				;;
			esac
		done

		if [ $max_avail -gt 0 ]; then
			echo "statefile		${winner}/${statefile}" \
			    >>/etc/power.conf
		fi

		return
	)
	if [ $max_avail -eq 0 ]; then
		if [ X`df -n / | awk '{print $3}'` != "Xzfs" ] ; then
			return
		fi
		rootpool=`zfs mount | grep ' \/$' | awk '{print $1 }' |\
		    sed 's/\/.*$//'`
		if [ X$rootpool = "X" ] || \
		    [ ! -L /dev/zvol/dsk/$rootpool/dump ]; then
			return
		fi
		echo "statefile /dev/zvol/dsk/$rootpool/dump" \
			>> /etc/power.conf
	fi
}

case "$1" in
'start')
	/usr/sbin/uadmin 3 2 2>/dev/null
	if [ $? -eq 0 ]; then
		init_statefile_entry
	fi

	if [ -x /usr/sbin/pmconfig -a -r /etc/power.conf ]; then
		/usr/sbin/pmconfig >/dev/console 2>&1
	fi
	;;

'stop')
	if [ -x /usr/sbin/pmconfig ]; then 
		/usr/sbin/pmconfig -r >/dev/null 2>/dev/null
	fi
	;;

*)
	echo "Usage: $0 { start | stop }"
	exit 1
	;;
esac
exit 0