From: Elliott Hughes Date: Tue, 20 Jan 2015 22:03:29 +0000 (-0600) Subject: fix hwclock's rtc selection X-Git-Tag: upstream/0.5.2~35 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ef0546d4f536f42a57af4c32bd37f7fd752d10c2;p=platform%2Fupstream%2Ftoybox.git 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". --- diff --git a/toys/pending/hwclock.c b/toys/pending/hwclock.c index d943e57..003174f 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);