X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimesync%2Ftimesyncd.c;h=b80e03b349340fcfbdbc0dcfa90ff7f8652a0c97;hb=c264aeab4b0e7b69f469e12e78d4a48b3ed7a66e;hp=e15588d1cf23ffc400347eb30d6ebaf94c193e32;hpb=c566ee3253132cc2ec37ed04c5bccbadf8e60c58;p=elogind.git diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c index e15588d1c..b80e03b34 100644 --- a/src/timesync/timesyncd.c +++ b/src/timesync/timesyncd.c @@ -210,7 +210,7 @@ static int manager_timeout(sd_event_source *source, usec_t usec, void *userdata) assert(m->current_server_name); assert(m->current_server_address); - sockaddr_pretty(&m->current_server_address->sockaddr.sa, m->current_server_address->socklen, true, &pretty); + server_address_pretty(m->current_server_address, &pretty); log_info("Timed out waiting for reply from %s (%s).", strna(pretty), m->current_server_name->string); return manager_connect(m); @@ -250,7 +250,7 @@ static int manager_send_request(Manager *m) { ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970); ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec); - sockaddr_pretty(&m->current_server_address->sockaddr.sa, m->current_server_address->socklen, true, &pretty); + server_address_pretty(m->current_server_address, &pretty); len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &m->current_server_address->sockaddr.sa, m->current_server_address->socklen); if (len == sizeof(ntpmsg)) { @@ -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, @@ -782,7 +790,7 @@ static int manager_begin(Manager *m) { m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC; - sockaddr_pretty(&m->current_server_address->sockaddr.sa, m->current_server_address->socklen, true, &pretty); + server_address_pretty(m->current_server_address, &pretty); log_info("Using NTP server %s (%s).", strna(pretty), m->current_server_name->string); sd_notifyf(false, "STATUS=Using Time Server %s (%s).", strna(pretty), m->current_server_name->string); @@ -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);