summaryrefslogtreecommitdiff
path: root/init.d.Linux/clock
blob: 640de577021f4912973b6dd177edbc3f11e1a9d8 (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
#!/sbin/runscript
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

opts="save"

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

setupopts() {
	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

	if [ -z "${CLOCK_ADJTIME}" -o ! -w /etc ] ; then
		myadj="--noadjfile"
	else
		myadj="--adjust"
	fi

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

	# Make sure user isn't using rc.conf anymore.
	if grep -q "^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 [ -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

	if [ -x /sbin/hwclock ] ; then
		[ -w "${CLOCK_ADJTIME}" ] && echo "0.0 0 0.0" > "${CLOCK_ADJTIME}"
	fi

	setupopts

	if [ ${fakeit} -ne 1 -a -e /proc/modules -a ! -e /dev/rtc ] ; then
		modprobe rtc 2>/dev/null || modprobe genrtc 2>/dev/null
	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 "${myadj}" != "--noadjfile" ] ; 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}"
				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
		[ -z "$(/sbin/hwclock --systohc ${myopts} 2>&1 >/dev/null)" ]
		retval=$?
		errstr="Failed to sync clocks"
	else
		retval=1
		errstr="/sbin/hwclock not found"
	fi
	eend ${retval} "${errstr}"
}

save() {
	CLOCK_SYSTOHC="yes"
	stop
}

# vim: set ts=4 :