#!/sbin/runscript
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

opts="save"

depend() {
	need localmount
}

setupopts() {
	if is_uml_sys ; then
		TBLURB="UML"
		fakeit=1
	elif is_vserver_sys ; then
		TBLURB="VServer"
		fakeit=1
	elif is_xenU_sys ; then
		TBLURB="xen"
		fakeit=1
	elif [[ -d /proc/vz ]] ; then
		TBLURB="VZ"
		fakeit=1
	elif grep -q ' cobd$' /proc/devices ; then
		TBLURB="coLinux"
		fakeit=1
	elif [[ $(uname -m) == s390* ]] ; then
		TBLURB="s390"
		fakeit=1
	elif [[ ${CLOCK} == "UTC" ]] ; then
		myopts="--utc"
		TBLURB="UTC"
	else
		myopts="--localtime"
		TBLURB="Local Time"
	fi
	[[ ${fakeit} -eq 1 ]] && return 0

	if [[ ${readonly} == "yes" ]] ; then
		myadj="--noadjfile"
	else
		myadj="--adjust"
	fi

	if [[ ${SRM} == "yes" ]] ; then
		myopts="${myopts} --srm"
	fi
	if [[ ${ARC} == "arc" ]] ; then
		myopts="${myopts} --arc"
	fi
	myopts="${myopts} ${CLOCK_OPTS}"

	# Make sure user isn't using rc.conf anymore.
	if grep -qs ^CLOCK= /etc/rc.conf ; then
		ewarn "CLOCK should not be set in /etc/rc.conf but in /etc/conf.d/clock"
	fi
	# Make sure people set their timezone ... we do it here
	# even though we don't actually use the variable so that
	# people see the warning on boot.
	if [[ ${TIMEZONE:-Factory} == "Factory" ]] ; then
		ewarn "Your TIMEZONE in /etc/conf.d/clock is still set to Factory!"
	fi
}

start() {
	local myopts=""
	local myadj=""
	local TBLURB="" fakeit=0
	local errstr=""
	local readonly="no"
	local ret=0

	if ! touch /etc/adjtime 2>/dev/null ; then
		readonly="yes"
	elif [[ ! -s /etc/adjtime ]] ; then
		echo "0.0 0 0.0" > /etc/adjtime
	fi

	setupopts

	if [[ ${fakeit} -ne 1 && -e /proc/modules && ! -e /dev/rtc ]] ; then
		modprobe rtc &> /dev/null || modprobe genrtc &> /dev/null
	fi

	ebegin "Setting system clock using the hardware clock [${TBLURB}]"
	if [[ ${fakeit} -eq 1 ]] ; then
		ret=0

	elif [[ -x /sbin/hwclock ]] ; then
		# Since hwclock always exit's with a 0, need to check its output.
		errstr=$(/sbin/hwclock ${myadj} ${myopts} 2>&1 >/dev/null)
		errstr="${errstr}$(/sbin/hwclock --hctosys ${myopts} 2>&1 >/dev/null)"

		if [[ -n ${errstr} ]] ; then
			ewarn "${errstr}"
			ret=1
		else
			ret=0
		fi
		errstr="Failed to set clock"
	else
		ret=1
		errstr="/sbin/hwclock not found"
	fi
	eend ${ret} "${errstr}" "You will need to set the clock yourself"

	return 0
}

stop() {
	# Don't tweak the hardware clock on LiveCD halt.
	[[ -n ${CDBOOT} ]] && return 0

	[[ ${CLOCK_SYSTOHC} != "yes" ]] && return 0

	local myopts=""
	local TBLURB=""
	local errstr=""
	local ret=0

	setupopts

	ebegin "Setting hardware clock using the system clock [${TBLURB}]"
	if [[ ${fakeit} -eq 1 ]] ; then
		ret=0

	elif [[ -x /sbin/hwclock ]] ; then
		errstr=$(/sbin/hwclock --systohc ${myopts} 2>&1 >/dev/null)

		if [[ -n ${errstr} ]] ; then
			ret=1
		else
			ret=0
		fi
		errstr="Failed to sync clocks"
	else
		ret=1
		errstr="/sbin/hwclock not found"
	fi
	eend ${ret} "${errstr}"
}

save() {
	CLOCK_SYSTOHC="yes"
	stop
}


# vim:ts=4
