aboutsummaryrefslogtreecommitdiff
path: root/init.d.Linux/clock
blob: 75910808943e2f7c50bda8a7f749b59fedc7cdb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/sbin/runscript
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

opts="save"

description="Sets the local clock to UTC or Local Time." 
description_save="Saves the current time in the BIOS."

depend() {
	case "${CLOCK_ADJTIME}" in
		""|no)      before *;;
		/etc/*|yes) need checkroot;;
		*)          need localmount;;
	esac
}

setupopts() {
	myopts=

	case "${CLOCK_ADJTIME}" in
		no)  CLOCK_ADJTIME=;; 
		yes) CLOCK_ADJTIME="/etc/adjtime";;
	esac

	case "${RC_SYS}" in
		UML|VPS|XEN)
			TBLURB="${RC_SYS}"
			fakeit=1
			;;
		*)
			case "$(uname -m)" in
				s390*)
					TBLURB="s390"
					fakeit=1
					;;
				*)
					if [ -e /proc/devices ] && grep -q " cobd$" /proc/devices ; then
						TBLURB="coLinux"
						fakeit=1
					elif [ "${CLOCK}" = "UTC" ] ; then
						myopts="--utc"
						TBLURB="UTC"
					else
						myopts="--localtime"
						TBLURB="Local Time"
					fi
					;;
			esac
			;;
	esac
	[ ${fakeit} -eq 1 ] && return 0

	[ -w /etc -a -n "${CLOCK_ADJTIME}" ] || myopts="${myopts} --noadjfile"

	[ "${SRM}" = "yes" ] && myopts="${myopts} --srm"
	[ "${ARC}" = "arc" ] && myopts="${myopts} --arc"
	myopts="${myopts} ${CLOCK_OPTS}"

	# Make sure user isn't using rc.conf anymore.
	if [ -e /etc/rc.conf ] && \
	[ -n "$(unset CLOCK; . /etc/rc.conf; echo "${CLOCK}")" ] ; 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 [ -z "${CDBOOT}" -a "${TIMEZONE-Factory}" = "Factory" ] ; then
		ewarn "Your TIMEZONE in /etc/conf.d/clock is still set to Factory!"
	fi
}

start() {
	local myopts= myadj= TBLURB= fakeit=0 errstr="" retval=0

	setupopts

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

	ebegin "Setting system clock using the hardware clock [${TBLURB}]"
	if [ ${fakeit} -eq 1 ] ; then
		retval=0
	elif [ -x /sbin/hwclock ] ; then
		# Don't call hwclock unless we need to
		if [ "${TBLURB}" != "UTC" -o "${myopts#*--noadjfile}" = "${myopts}" ] ; then
			# Since hwclock always exit's with a 0, need to check its output.
			[ -n "${CLOCK_ADJTIME}" ] && errstr="$(/sbin/hwclock --adjust 2>&1 >/dev/null)"
			errstr="${errstr}$(/sbin/hwclock --hctosys ${myopts} 2>&1 >/dev/null)"
			if [ -n "${errstr}" ] ; then
				ewarn "${errstr}"
				retval=1
			fi
			errstr="Failed to set clock"
		fi
	else
		retval=1
		errstr="/sbin/hwclock not found"
	fi
	eend ${retval} "${errstr}" "You will need to set the clock yourself"

	return 0
}

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

	local myopts= myadj= TBLURB= fakeit=0 errstr="" retval=0

	setupopts

	ebegin "Setting hardware clock using the system clock" "[${TBLURB}]"
	if [ ${fakeit} -eq 1 ] ; then
		retval=0
	elif [ -x /sbin/hwclock ] ; then
		errstr="$(LC_ALL=C /sbin/hwclock --systohc ${myopts} 2>&1 >/dev/null)"
		if [ -n "${errstr}" ] ; then
			ewarn "${errstr}"
			retval=1
		fi
		errstr="Failed to sync clocks"
	else
		retval=1
		errstr="hwclock not found"
	fi
	eend ${retval} "${errstr}"
}

save() {
	CLOCK_SYSTOHC="yes"
	stop
}

# vim: set ts=4 :