X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimesync%2Ftimesyncd.c;h=e5a8a578cd4646da325d488f655822c43b764ede;hb=cedc8c44d43c8b6689ae5f5ebe1aabb7ad9755ba;hp=b80e03b349340fcfbdbc0dcfa90ff7f8652a0c97;hpb=c264aeab4b0e7b69f469e12e78d4a48b3ed7a66e;p=elogind.git diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c index b80e03b34..e5a8a578c 100644 --- a/src/timesync/timesyncd.c +++ b/src/timesync/timesyncd.c @@ -245,7 +245,7 @@ static int manager_send_request(Manager *m) { * The actual value does not matter, We do not care about the correct * NTP UINT_MAX fraction; we just pass the plain nanosecond value. */ - assert_se(clock_gettime(CLOCK_MONOTONIC, &m->trans_time_mon) >= 0); + assert_se(clock_gettime(clock_boottime_or_monotonic(), &m->trans_time_mon) >= 0); assert_se(clock_gettime(CLOCK_REALTIME, &m->trans_time) >= 0); ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970); ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec); @@ -277,8 +277,8 @@ static int manager_send_request(Manager *m) { r = sd_event_add_time( m->event, &m->event_timeout, - CLOCK_MONOTONIC, - now(CLOCK_MONOTONIC) + TIMEOUT_USEC, 0, + clock_boottime_or_monotonic(), + now(clock_boottime_or_monotonic()) + TIMEOUT_USEC, 0, manager_timeout, m); if (r < 0) { log_error("Failed to arm timeout timer: %s", strerror(-r)); @@ -308,7 +308,7 @@ static int manager_arm_timer(Manager *m, usec_t next) { } if (m->event_timer) { - r = sd_event_source_set_time(m->event_timer, now(CLOCK_MONOTONIC) + next); + r = sd_event_source_set_time(m->event_timer, now(clock_boottime_or_monotonic()) + next); if (r < 0) return r; @@ -318,8 +318,8 @@ static int manager_arm_timer(Manager *m, usec_t next) { return sd_event_add_time( m->event, &m->event_timer, - CLOCK_MONOTONIC, - now(CLOCK_MONOTONIC) + next, 0, + clock_boottime_or_monotonic(), + now(clock_boottime_or_monotonic()) + next, 0, manager_timer, m); } @@ -340,6 +340,7 @@ static int manager_clock_watch(sd_event_source *source, int fd, uint32_t revents /* resync */ log_info("System time changed. Resyncing."); m->poll_resync = true; + return manager_send_request(m); } @@ -685,7 +686,7 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re * The round-trip delay, d, and system clock offset, t, are defined as: * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2" */ - assert_se(clock_gettime(CLOCK_MONOTONIC, &now_ts) >= 0); + assert_se(clock_gettime(clock_boottime_or_monotonic(), &now_ts) >= 0); origin = tv_to_d(recv_time) - (ts_to_d(&now_ts) - ts_to_d(&m->trans_time_mon)) + OFFSET_1900_1970; receive = ntp_ts_to_d(&ntpmsg.recv_time); trans = ntp_ts_to_d(&ntpmsg.trans_time); @@ -912,7 +913,7 @@ static int manager_connect(Manager *m) { if (!ratelimit_test(&m->ratelimit)) { log_debug("Slowing down attempts to contact servers."); - r = sd_event_add_time(m->event, &m->event_retry, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + RETRY_USEC, 0, manager_retry, m); + r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + RETRY_USEC, 0, manager_retry, m); if (r < 0) { log_error("Failed to create retry timer: %s", strerror(-r)); return r; @@ -984,23 +985,25 @@ 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); if (r < 0) log_error("Failed to add server %s to configuration, ignoring: %s", t, strerror(-r)); } + if (!isempty(state)) + log_warning("Trailing garbage at the end of server list, ignoring."); return 0; } @@ -1103,6 +1106,8 @@ int config_parse_servers( } static int manager_parse_config_file(Manager *m) { + assert(m); + return config_parse(NULL, "/etc/systemd/timesyncd.conf", NULL, "Time\0", config_item_perf_lookup, timesyncd_gperf_lookup, @@ -1114,80 +1119,75 @@ static bool network_is_online(void) { int r; r = sd_network_get_operational_state(&state); - if (r >= 0 && STR_IN_SET(state, "routable", "degraded")) + if (r < 0) /* if we don't know anything, we consider the system online */ + return true; + + if (STR_IN_SET(state, "routable", "degraded")) return true; return false; } -static int manager_network_event_handler(sd_event_source *s, int fd, uint32_t revents, - void *userdata) { +static int manager_network_event_handler(sd_event_source *s, int fd, uint32_t revents, void *userdata) { Manager *m = userdata; bool connected, online; int r; assert(m); + sd_network_monitor_flush(m->network_monitor); + /* check if the machine is online */ online = network_is_online(); /* check if the client is currently connected */ - connected = (m->server_socket != -1); + connected = m->server_socket >= 0; if (connected && !online) { log_info("No network connectivity, watching for changes."); manager_disconnect(m); + } else if (!connected && online) { log_info("Network configuration changed, trying to establish connection."); - if (m->current_server_address) { + + if (m->current_server_address) r = manager_begin(m); - if (r < 0) - return r; - } else { + else r = manager_connect(m); - if (r < 0) - return r; - } + if (r < 0) + return r; } - sd_network_monitor_flush(m->network_monitor); - return 0; } static int manager_network_monitor_listen(Manager *m) { - _cleanup_event_source_unref_ sd_event_source *event_source = NULL; - _cleanup_network_monitor_unref_ sd_network_monitor *monitor = NULL; int r, fd, events; - r = sd_network_monitor_new(&monitor, NULL); + assert(m); + + r = sd_network_monitor_new(&m->network_monitor, NULL); if (r < 0) return r; - fd = sd_network_monitor_get_fd(monitor); + fd = sd_network_monitor_get_fd(m->network_monitor); if (fd < 0) return fd; - events = sd_network_monitor_get_events(monitor); + events = sd_network_monitor_get_events(m->network_monitor); if (events < 0) return events; - r = sd_event_add_io(m->event, &event_source, fd, events, - &manager_network_event_handler, m); + r = sd_event_add_io(m->event, &m->network_event_source, fd, events, manager_network_event_handler, m); if (r < 0) return r; - m->network_monitor = monitor; - m->network_event_source = event_source; - monitor = NULL; - event_source = NULL; - return 0; } int main(int argc, char *argv[]) { - const char *user = "systemd-timesync"; _cleanup_manager_free_ Manager *m = NULL; + const char *user = "systemd-timesync"; uid_t uid; gid_t gid; int r;