From ef0546d4f536f42a57af4c32bd37f7fd752d10c2 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 20 Jan 2015 16:03:29 -0600 Subject: fix hwclock's rtc selection For systems using /dev/rtcN, /dev/rtc0 isn't necessarily the RTC that's used to provide the system time at boot time. We need to search for the RTC whose /sys/class/rtc/rtcN/hctosys contains "1". --- toys/pending/hwclock.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'toys/pending/hwclock.c') diff --git a/toys/pending/hwclock.c b/toys/pending/hwclock.c index d943e57a..003174f7 100644 --- a/toys/pending/hwclock.c +++ b/toys/pending/hwclock.c @@ -30,13 +30,43 @@ GLOBALS( int utc; ) +static int check_hctosys(struct dirtree* node) +{ + FILE *fp; + + if (!node->parent) return DIRTREE_RECURSE; + + snprintf(toybuf, sizeof(toybuf), "/sys/class/rtc/%s/hctosys", node->name); + fp = fopen(toybuf, "r"); + if (fp) { + int hctosys = 0; + int items = fscanf(fp, "%d", &hctosys); + fclose(fp); + if (items == 1 && hctosys == 1) { + snprintf(toybuf, sizeof(toybuf), "/dev/%s", node->name); + TT.fname = toybuf; + return DIRTREE_ABORT; + } + } + return 0; +} + +// Search /sys/class/rtc for the RTC that the system clock is set from. +// See the kernel's Documentation/rtc.txt. +static int open_wall_clock_rtc(int flag) +{ + TT.fname = NULL; + dirtree_read("/sys/class/rtc", check_hctosys); + return TT.fname ? xopen(TT.fname, flag) : -1; +} + static int rtc_open(int flag) { if (!TT.fname) { int fd; if ((fd = open((TT.fname = "/dev/rtc"), flag)) != -1) return fd; - else if ((fd = open((TT.fname = "/dev/rtc0"), flag)) != -1) return fd; + else if ((fd = open_wall_clock_rtc(flag)) != -1) return fd; else TT.fname = "/dev/misc/rtc"; } return xopen(TT.fname, flag); -- cgit v1.2.3