X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimesync%2Ftimesyncd-manager.c;h=a9e91c4d60645fa6d1e59fab2b68fb9db15f7b68;hb=adfe5671ef794099068038dfccbf1eb5134433c8;hp=b16b25a96ad2dc552d448fbfe3b0d2769d3c772b;hpb=56f64d95763a799ba4475daf44d8e9f72a1bd474;p=elogind.git diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c index b16b25a96..a9e91c4d6 100644 --- a/src/timesync/timesyncd-manager.c +++ b/src/timesync/timesyncd-manager.c @@ -21,21 +21,15 @@ #include #include -#include -#include -#include #include #include -#include #include #include #include #include #include #include -#include #include -#include #include "missing.h" #include "util.h" @@ -45,13 +39,8 @@ #include "list.h" #include "ratelimit.h" #include "strv.h" -#include "conf-parser.h" #include "sd-daemon.h" -#include "event-util.h" #include "network-util.h" -#include "clock-util.h" -#include "capability.h" -#include "mkdir.h" #include "timesyncd-conf.h" #include "timesyncd-manager.h" #include "time-util.h" @@ -98,7 +87,7 @@ * "NTP timestamps are represented as a 64-bit unsigned fixed-point number, * in seconds relative to 0h on 1 January 1900." */ -#define OFFSET_1900_1970 2208988800UL +#define OFFSET_1900_1970 UINT64_C(2208988800) #define RETRY_USEC (30*USEC_PER_SEC) #define RATELIMIT_INTERVAL_USEC (10*USEC_PER_SEC) @@ -133,6 +122,7 @@ struct ntp_msg { static int manager_arm_timer(Manager *m, usec_t next); static int manager_clock_watch_setup(Manager *m); static int manager_listen_setup(Manager *m); +static void manager_listen_stop(Manager *m); static double ntp_ts_short_to_d(const struct ntp_ts_short *ts) { return be16toh(ts->sec) + (be16toh(ts->frac) / 65536.0); @@ -146,10 +136,6 @@ static double ts_to_d(const struct timespec *ts) { return ts->tv_sec + (1.0e-9 * ts->tv_nsec); } -static double square(double d) { - return d * d; -} - static int manager_timeout(sd_event_source *source, usec_t usec, void *userdata) { _cleanup_free_ char *pretty = NULL; Manager *m = userdata; @@ -185,11 +171,9 @@ static int manager_send_request(Manager *m) { m->event_timeout = sd_event_source_unref(m->event_timeout); - if (m->server_socket < 0) { - r = manager_listen_setup(m); - if (r < 0) - return log_warning_errno(r, "Failed to setup connection socket: %m"); - } + r = manager_listen_setup(m); + if (r < 0) + return log_warning_errno(r, "Failed to setup connection socket: %m"); /* * Set transmit timestamp, remember it; the server will send that back @@ -290,7 +274,7 @@ static int manager_clock_watch(sd_event_source *source, int fd, uint32_t revents } /* resync */ - log_info("System time changed. Resyncing."); + log_debug("System time changed. Resyncing."); m->poll_resync = true; return manager_send_request(m); @@ -311,15 +295,11 @@ static int manager_clock_watch_setup(Manager *m) { safe_close(m->clock_watch_fd); m->clock_watch_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC); - if (m->clock_watch_fd < 0) { - log_error_errno(errno, "Failed to create timerfd: %m"); - return -errno; - } + if (m->clock_watch_fd < 0) + return log_error_errno(errno, "Failed to create timerfd: %m"); - if (timerfd_settime(m->clock_watch_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) { - log_error_errno(errno, "Failed to set up timerfd: %m"); - return -errno; - } + if (timerfd_settime(m->clock_watch_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) + return log_error_errno(errno, "Failed to set up timerfd: %m"); r = sd_event_add_io(m->event, &m->event_clock_watch, m->clock_watch_fd, EPOLLIN, manager_clock_watch, m); if (r < 0) @@ -433,7 +413,7 @@ static bool manager_sample_spike_detection(Manager *m, double offset, double del j = 0; for (i = 0; i < ELEMENTSOF(m->samples); i++) - j += square(m->samples[i].offset - m->samples[idx_min].offset); + j += pow(m->samples[i].offset - m->samples[idx_min].offset, 2); m->samples_jitter = sqrt(j / (ELEMENTSOF(m->samples) - 1)); /* ignore samples when resyncing */ @@ -534,7 +514,8 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re return manager_connect(m); } - if (iov.iov_len < sizeof(struct ntp_msg)) { + /* Too short or too long packet? */ + if (iov.iov_len < sizeof(struct ntp_msg) || (msghdr.msg_flags & MSG_TRUNC)) { log_warning("Invalid response from server. Disconnecting."); return manager_connect(m); } @@ -611,8 +592,7 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re m->retry_interval = 0; /* Stop listening */ - m->event_receive = sd_event_source_unref(m->event_receive); - m->server_socket = safe_close(m->server_socket); + manager_listen_stop(m); /* announce leap seconds */ if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_PLUSSEC) @@ -685,9 +665,9 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re log_error_errno(errno, "Failed to call clock_adjtime(): %m"); } - log_info("interval/delta/delay/jitter/drift " USEC_FMT "s/%+.3fs/%.3fs/%.3fs/%+ippm%s", - m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_ppm, - spike ? " (ignored)" : ""); + log_debug("interval/delta/delay/jitter/drift " USEC_FMT "s/%+.3fs/%.3fs/%.3fs/%+ippm%s", + m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_ppm, + spike ? " (ignored)" : ""); r = manager_arm_timer(m, m->poll_interval_usec); if (r < 0) @@ -704,7 +684,9 @@ static int manager_listen_setup(Manager *m) { assert(m); - assert(m->server_socket < 0); + if (m->server_socket >= 0) + return 0; + assert(!m->event_receive); assert(m->current_server_address); @@ -727,6 +709,13 @@ static int manager_listen_setup(Manager *m) { return sd_event_add_io(m->event, &m->event_receive, m->server_socket, EPOLLIN, manager_receive_response, m); } +static void manager_listen_stop(Manager *m) { + assert(m); + + m->event_receive = sd_event_source_unref(m->event_receive); + m->server_socket = safe_close(m->server_socket); +} + static int manager_begin(Manager *m) { _cleanup_free_ char *pretty = NULL; int r; @@ -740,7 +729,7 @@ static int manager_begin(Manager *m) { m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC; server_address_pretty(m->current_server_address, &pretty); - log_info("Using NTP server %s (%s).", strna(pretty), m->current_server_name->string); + log_debug("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); r = manager_clock_watch_setup(m); @@ -956,8 +945,7 @@ void manager_disconnect(Manager *m) { m->event_timer = sd_event_source_unref(m->event_timer); - m->event_receive = sd_event_source_unref(m->event_receive); - m->server_socket = safe_close(m->server_socket); + manager_listen_stop(m); m->event_clock_watch = sd_event_source_unref(m->event_clock_watch); m->clock_watch_fd = safe_close(m->clock_watch_fd);