X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimesync%2Ftimesyncd.c;h=8bb79fb5ee339fc9f8e574b5600f726ac314148c;hb=a2a5291b3f5ab6ed4c92f51d0fd10a03047380d8;hp=78ef5f72a1910f22f563f54a459b3a4ad9935281;hpb=ae2db4e7e868fb89f5053a962a3a43337ddfd4e0;p=elogind.git diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c index 78ef5f72a..8bb79fb5e 100644 --- a/src/timesync/timesyncd.c +++ b/src/timesync/timesyncd.c @@ -386,9 +386,6 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) { /* * For small deltas, tell the kernel to gradually adjust the system * clock to the NTP time, larger deltas are just directly set. - * - * Clear STA_UNSYNC, it will enable the kernel's 11-minute mode, which - * syncs the system time periodically to the hardware clock. */ if (fabs(offset) < NTP_MAX_ADJUST) { tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR; @@ -399,7 +396,7 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) { tmx.esterror = 0; log_debug(" adjust (slew): %+.3f sec\n", offset); } else { - tmx.modes = ADJ_SETOFFSET | ADJ_NANO; + tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET; /* ADJ_NANO uses nanoseconds in the microseconds field */ tmx.time.tv_sec = (long)offset; @@ -415,6 +412,17 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) { log_debug(" adjust (jump): %+.3f sec\n", offset); } + /* + * An unset STA_UNSYNC will enable the kernel's 11-minute mode, + * which syncs the system time periodically to the RTC. + * + * In case the RTC runs in local time, never touch the RTC, + * we have no way to properly handle daylight saving changes and + * mobile devices moving between time zones. + */ + if (m->rtc_local_time) + tmx.status |= STA_UNSYNC; + switch (leap_sec) { case 1: tmx.status |= STA_INS; @@ -437,7 +445,7 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) { " constant : %li\n" " offset : %+.3f sec\n" " freq offset : %+li (%i ppm)\n", - tmx.status, tmx.status & STA_UNSYNC ? "" : "sync", + tmx.status, tmx.status & STA_UNSYNC ? "unsync" : "sync", tmx.time.tv_sec, (unsigned long long) (tmx.time.tv_usec / NSEC_PER_MSEC), tmx.constant, (double)tmx.offset / NSEC_PER_SEC, @@ -976,17 +984,17 @@ static int manager_add_server(Manager *m, const char *server) { } static int manager_add_server_string(Manager *m, const char *string) { - char *w, *state; + const char *word, *state; size_t l; int r; assert(m); assert(string); - FOREACH_WORD_QUOTED(w, l, string, state) { + FOREACH_WORD_QUOTED(word, l, string, state) { char t[l+1]; - memcpy(t, w, l); + memcpy(t, word, l); t[l] = 0; r = manager_add_server(m, t); @@ -1095,27 +1103,10 @@ int config_parse_servers( } static int manager_parse_config_file(Manager *m) { - static const char fn[] = "/etc/systemd/timesyncd.conf"; - _cleanup_fclose_ FILE *f = NULL; - int r; - - assert(m); - - f = fopen(fn, "re"); - if (!f) { - if (errno == ENOENT) - return 0; - - log_warning("Failed to open configuration file %s: %m", fn); - return -errno; - } - - r = config_parse(NULL, fn, f, "Time\0", config_item_perf_lookup, - (void*) timesyncd_gperf_lookup, false, false, m); - if (r < 0) - log_warning("Failed to parse configuration file: %s", strerror(-r)); - - return r; + return config_parse(NULL, "/etc/systemd/timesyncd.conf", NULL, + "Time\0", + config_item_perf_lookup, timesyncd_gperf_lookup, + false, false, true, m); } static bool network_is_online(void) { @@ -1169,7 +1160,7 @@ static int manager_network_monitor_listen(Manager *m) { _cleanup_network_monitor_unref_ sd_network_monitor *monitor = NULL; int r, fd, events; - r = sd_network_monitor_new(NULL, &monitor); + r = sd_network_monitor_new(&monitor, NULL); if (r < 0) return r; @@ -1235,6 +1226,12 @@ int main(int argc, char *argv[]) { goto out; } + if (clock_is_localtime() > 0) { + log_info("The system is configured to read the RTC time in the local time zone. " + "This mode can not be fully supported. All system time to RTC updates are disabled."); + m->rtc_local_time = true; + } + manager_add_server_string(m, NTP_SERVERS); manager_parse_config_file(m);