#!/bin/sh
#
# To obtain all system internal and disk information 
# It uses "format" command to obtain all disks, then it calls getDiskinfo()
#    to obtain the individual disk information
# Input Arguments:  [-n] | [-l] | [-s disk] | [-t]
# Usage: getDisk [-n] (number of disks)
#                [-l] (disk1 size1, disk2 size2, ...)
#                [-ld] (disk1, disk2, ...)
#                [-ls] (size1, size2, ...)
#                [-s disk] (disk size)
#                [-t ] (total disk size)
#
# NUM_DISK: 	Total number of disk device
# DISK_LIST: 	Space seperated disk name list
# DISK_SIZE: 	Space seperated disk size list
# TOTAL_DISK: 	Total disk spaces 
#
#set -x

umask 000

usage()
{
 	echo "Usage: getDisk [-n] |  (number of disks)
               [-l] | (disk1 size1, disk2 size2, ...)
               [-ld] | (disk1, disk2, ...)
               [-ls] | (size1, size2, ...)
               [-s disk] | (size)
               [-t ] | (total disk size)"

	exit 1
}

#
# To obtain the disk information 
# Input Arguments: $1 - disk device 
# Usage: getDiskinfo c0t0d0
#

getDiskinfo()
{
	# prtvtoc uses raw device.  must convert and add slice.
	g_d_basename=`basename $1`
	g_d_basename=`expr ${g_d_basename} : '\(c[0-9]*.*d[0-9]*\).*'`
	g_d_slice=0
	# work around prtvtoc bug

	TMP_VTOC=/tmp/vtoc.$$
	while [ ${g_d_slice} -lt 8 ]
	do
		prtvtoc /dev/rdsk/${g_d_basename}s${g_d_slice} > ${TMP_VTOC} \
			2> /dev/null
		if [ $? -eq 0 ]; then
			break
		fi
		g_d_slice=`expr ${g_d_slice} + 1`
	done

	if [ ${g_d_slice} -eq 8 ]; then
		mbytes_p_cyl=0;	export mbytes_p_cyl;
		mbytes_p_disk=0;export mbytes_p_disk;
		bytes_p_sec=0;	export bytes_p_sec;
		track_p_cyl=0;	export track_p_cyl;
		sec_p_cyl=0;	export sec_p_cyl;
		sec_p_track=0;	export sec_p_track;
		cyls=0;		export cyls;
		return
	fi

	eval `awk 'BEGIN { tot = 1 } 
		$3 == "bytes/sector" 	{ bytes_p_sec = $2 } 
		$3 == "sectors/track"	{ sec_p_track = $2 } 
		$3 == "tracks/cylinder"	{ track_p_cyl = $2 } 
		$3 == "sectors/cylinder" { sec_p_cyl  = $2 } 
		$4 == "cylinders"	{ cyls	      = $2 } 
		# round down, just to be sure we do not over estimate
	END { 
		mbytes_p_disk= ((bytes_p_sec * sec_p_track) / 1048576) * \
					track_p_cyl * cyls;

		# be accurate in the mbytes_p_cyl, but integerize
		# mbytes_p_disk after this
		printf("mbytes_p_cyl=%f;export  mbytes_p_cyl;", \
							mbytes_p_disk/cyls);
		mbytes_p_disk=int(mbytes_p_disk);
	     	printf("mbytes_p_disk=%d;export mbytes_p_disk;", mbytes_p_disk);
		printf("bytes_p_sec=%d;  export bytes_p_sec;", 	bytes_p_sec);
		printf("track_p_cyl=%d;  export track_p_cyl;", 	track_p_cyl);
		printf("sec_p_cyl=%d;    export sec_p_cyl;", 	sec_p_cyl);
		printf("sec_p_track=%d;  export sec_p_track;",	sec_p_track);
		printf("cyls=%d;	 export cyls",  	cyls);

	}' ${TMP_VTOC}`

	rm -f ${TMP_VTOC}
}

#
# MAIN routine
#

#
# Parse the command line options. 
#

QUERY_DISK_SIZE=
QUERY_DISK_LIST=
QUERY_SIZE_LIST=
QUERY_NUM_DISK=
QUERY_TOTAL=

# Number of argument is 2
if [ $# = 2 ] 
then
	if [ $1 = "-s" ]
	then
    		QUERY_DISK="$2";
        	if [ ! "$QUERY_DISK" ]; then
            		usage
        	fi
	else 
		usage
	fi
elif  [ $# = 1 ]
then
	if [ $1 = "-l" ]
	then 
    		QUERY_DISK_SIZE=1
	elif [ $1 = "-n" ]
	then 
		QUERY_NUM_DISK=1
	elif [ $1 = "-t" ]
	then 
		QUERY_TOTAL=1
	elif [ $1 = "-ld" ]
	then 
		QUERY_DISK_LIST=1
	elif [ $1 = "-ls" ]
	then 
		QUERY_SIZE_LIST=1
	else 
		usage
	fi
else 
	usage
fi

# Parse input
# Run format command 

echo '0\nquit' | format > /tmp/disks.tmp 2> /dev/null
tmp_disk_list=`cat /tmp/disks.tmp | grep "<.*>" | grep -v \! | awk '{print $2}'`
NUM_DISKS="0"
for t_disk in ${tmp_disk_list}
do  
	# Query disk size
	if [ "X$QUERY_DISK" != "X" ]
	then
		if [ $t_disk = $QUERY_DISK ]
		then 
			getDiskinfo ${t_disk}
			echo ${mbytes_p_disk}
			exit 0
		else 
			continue
		fi
	fi

	NUM_DISKS=`expr ${NUM_DISKS} + 1`
	if [ "${DISK_LIST}X" = "X" ]; then
		DISK_LIST="${t_disk}"
		getDiskinfo ${t_disk}
		DISK_SIZE="${mbytes_p_disk}"
		DISK_LIST_SIZE="${t_disk} ${mbytes_p_disk}"
		TOTAL_DISK=${mbytes_p_disk}
	else
		DISK_LIST="${DISK_LIST}\n${t_disk}"
		getDiskinfo ${t_disk}
		DISK_SIZE="${DISK_SIZE}\n${mbytes_p_disk}"
		DISK_LIST_SIZE="${DISK_LIST_SIZE}\n${t_disk} ${mbytes_p_disk}"
		TOTAL_DISK=`expr ${mbytes_p_disk} + ${TOTAL_DISK}`
	fi
done

if [ "X$QUERY_TOTAL" = "X1" ]
then 
	echo "$TOTAL_DISK"
elif [ "X$QUERY_NUM_DISK" = "X1" ]
then
	echo "$NUM_DISKS"
elif [ "X$QUERY_SIZE_LIST" = "X1" ]
then
	echo "$DISK_SIZE"
elif [ "X$QUERY_DISK_LIST" = "X1" ]
then
	echo "$DISK_LIST"
elif [ "X$QUERY_DISK_SIZE" = "X1" ]
then
	echo "$DISK_LIST_SIZE"
fi
exit 0

