summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rules/50-udev-default.rules4
-rw-r--r--src/shared/hwclock.c80
2 files changed, 6 insertions, 78 deletions
diff --git a/rules/50-udev-default.rules b/rules/50-udev-default.rules
index 234dc3b915..f7647893d4 100644
--- a/rules/50-udev-default.rules
+++ b/rules/50-udev-default.rules
@@ -2,6 +2,10 @@
SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"
+# select "system RTC" or just use the first one
+SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
+SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"
+
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"
diff --git a/src/shared/hwclock.c b/src/shared/hwclock.c
index 837f51f947..cc11faa6c3 100644
--- a/src/shared/hwclock.c
+++ b/src/shared/hwclock.c
@@ -43,89 +43,13 @@
#include "hwclock.h"
#include "fileio.h"
-static int rtc_open(int flags) {
- int fd;
- DIR *d;
-
- /*
- * Some "chaotic platforms" have multiple RTCs and we need to
- * find the "system RTC", which is in some setups /dev/rtc1.
- *
- * First, we try to find the RTC which has hctosys=1 set. If we
- * don't find any we just take the first RTC that exists at all,
- * then try to open /dev/rtc0.
- */
- d = opendir("/sys/class/rtc");
- if (!d)
- goto fallback;
-
- for (;;) {
- char *p, *v;
- struct dirent *de;
- union dirent_storage buf;
- int r;
-
- r = readdir_r(d, &buf.de, &de);
- if (r != 0)
- goto fallback;
-
- if (!de)
- goto fallback;
-
- if (ignore_file(de->d_name))
- continue;
-
- p = strjoin("/sys/class/rtc/", de->d_name, "/hctosys", NULL);
- if (!p) {
- closedir(d);
- return -ENOMEM;
- }
-
- r = read_one_line_file(p, &v);
- free(p);
-
- if (r < 0)
- continue;
-
- r = parse_boolean(v);
- free(v);
-
- if (r <= 0)
- continue;
-
- p = strappend("/dev/", de->d_name);
- if (!p) {
- closedir(d);
- return -ENOMEM;
- }
-
- fd = open(p, flags);
- free(p);
-
- if (fd >= 0) {
- closedir(d);
- return fd;
- }
- }
-
-fallback:
- if (d)
- closedir(d);
-
- fd = open("/dev/rtc0", flags);
- if (fd < 0)
- return -errno;
-
- return fd;
-}
-
int hwclock_get_time(struct tm *tm) {
int fd;
int err = 0;
assert(tm);
- fd = rtc_open(O_RDONLY|O_CLOEXEC);
+ fd = open("/dev/rtc", O_RDONLY|O_CLOEXEC);
if (fd < 0)
return -errno;
@@ -149,7 +73,7 @@ int hwclock_set_time(const struct tm *tm) {
assert(tm);
- fd = rtc_open(O_RDONLY|O_CLOEXEC);
+ fd = open("/dev/rtc", O_RDONLY|O_CLOEXEC);
if (fd < 0)
return -errno;