1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2014 Kay Sievers
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
29 #include <arpa/inet.h>
30 #include <netinet/in.h>
31 #include <netinet/ip.h>
32 #include <sys/timerfd.h>
33 #include <sys/timex.h>
34 #include <sys/socket.h>
38 #include "sparse-endian.h"
40 #include "socket-util.h"
42 #include "ratelimit.h"
45 #include "sd-resolve.h"
46 #include "sd-daemon.h"
48 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
51 #define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */
54 /* expected accuracy of time synchronization; used to adjust the poll interval */
55 #define NTP_ACCURACY_SEC 0.2
58 * "A client MUST NOT under any conditions use a poll interval less
61 #define NTP_POLL_INTERVAL_MIN_SEC 32
62 #define NTP_POLL_INTERVAL_MAX_SEC 2048
65 * Maximum delta in seconds which the system clock is gradually adjusted
66 * (slew) to approach the network time. Deltas larger that this are set by
67 * letting the system time jump. The kernel's limit for adjtime is 0.5s.
69 #define NTP_MAX_ADJUST 0.4
71 /* NTP protocol, packet header */
72 #define NTP_LEAP_PLUSSEC 1
73 #define NTP_LEAP_MINUSSEC 2
74 #define NTP_LEAP_NOTINSYNC 3
75 #define NTP_MODE_CLIENT 3
76 #define NTP_MODE_SERVER 4
77 #define NTP_FIELD_LEAP(f) (((f) >> 6) & 3)
78 #define NTP_FIELD_VERSION(f) (((f) >> 3) & 7)
79 #define NTP_FIELD_MODE(f) ((f) & 7)
80 #define NTP_FIELD(l, v, m) (((l) << 6) | ((v) << 3) | (m))
83 * "NTP timestamps are represented as a 64-bit unsigned fixed-point number,
84 * in seconds relative to 0h on 1 January 1900."
86 #define OFFSET_1900_1970 2208988800UL
88 #define RETRY_USEC (30*USEC_PER_SEC)
89 #define RATELIMIT_INTERVAL_USEC (10*USEC_PER_SEC)
90 #define RATELIMIT_BURST 10
107 struct ntp_ts_short root_delay;
108 struct ntp_ts_short root_dispersion;
110 struct ntp_ts reference_time;
111 struct ntp_ts origin_time;
112 struct ntp_ts recv_time;
113 struct ntp_ts trans_time;
116 typedef struct Manager Manager;
117 typedef struct ServerAddress ServerAddress;
118 typedef struct ServerName ServerName;
120 struct ServerAddress {
121 union sockaddr_union sockaddr;
123 LIST_FIELDS(ServerAddress, addresses);
128 LIST_HEAD(ServerAddress, addresses);
129 LIST_FIELDS(ServerName, names);
136 LIST_HEAD(ServerName, servers);
141 sd_resolve_query *resolve_query;
142 sd_event_source *event_receive;
143 ServerName *current_server_name;
144 ServerAddress *current_server_address;
146 uint64_t packet_count;
148 /* last sent packet */
149 struct timespec trans_time_mon;
150 struct timespec trans_time;
151 usec_t retry_interval;
155 sd_event_source *event_timer;
156 usec_t poll_interval_usec;
164 unsigned int samples_idx;
165 double samples_jitter;
171 /* watch for time changes */
172 sd_event_source *event_clock_watch;
175 /* Retry connections */
176 sd_event_source *event_retry;
178 /* Handle SIGINT/SIGTERM */
179 sd_event_source *sigterm, *sigint;
182 static void manager_free(Manager *m);
183 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
184 #define _cleanup_manager_free_ _cleanup_(manager_freep)
186 static int manager_arm_timer(Manager *m, usec_t next);
187 static int manager_clock_watch_setup(Manager *m);
188 static int manager_connect(Manager *m);
189 static void manager_disconnect(Manager *m);
191 static double ntp_ts_to_d(const struct ntp_ts *ts) {
192 return be32toh(ts->sec) + ((double)be32toh(ts->frac) / UINT_MAX);
195 static double ts_to_d(const struct timespec *ts) {
196 return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
199 static double tv_to_d(const struct timeval *tv) {
200 return tv->tv_sec + (1.0e-6 * tv->tv_usec);
203 static double square(double d) {
207 static int manager_send_request(Manager *m) {
208 _cleanup_free_ char *pretty = NULL;
209 struct ntp_msg ntpmsg = {
211 * "The client initializes the NTP message header, sends the request
212 * to the server, and strips the time of day from the Transmit
213 * Timestamp field of the reply. For this purpose, all the NTP
214 * header fields are set to 0, except the Mode, VN, and optional
215 * Transmit Timestamp fields."
217 .field = NTP_FIELD(0, 4, NTP_MODE_CLIENT),
223 assert(m->current_server_name);
224 assert(m->current_server_address);
227 * Set transmit timestamp, remember it; the server will send that back
228 * as the origin timestamp and we have an indication that this is the
229 * matching answer to our request.
231 * The actual value does not matter, We do not care about the correct
232 * NTP UINT_MAX fraction; we just pass the plain nanosecond value.
234 assert_se(clock_gettime(CLOCK_MONOTONIC, &m->trans_time_mon) >= 0);
235 assert_se(clock_gettime(CLOCK_REALTIME, &m->trans_time) >= 0);
236 ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
237 ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
239 r = sockaddr_pretty(&m->current_server_address->sockaddr.sa, m->current_server_address->socklen, true, &pretty);
241 log_error("Failed to format sockaddr: %s", strerror(-r));
245 len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &m->current_server_address->sockaddr.sa, m->current_server_address->socklen);
246 if (len == sizeof(ntpmsg)) {
248 log_debug("Sent NTP request to %s (%s)", pretty, m->current_server_name->string);
250 log_debug("Sending NTP request to %s (%s) failed: %m", pretty, m->current_server_name->string);
251 return manager_connect(m);
254 /* re-arm timer with incresing timeout, in case the packets never arrive back */
255 if (m->retry_interval > 0) {
256 if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
257 m->retry_interval *= 2;
259 m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
261 r = manager_arm_timer(m, m->retry_interval);
263 log_error("Failed to rearm timer: %s", strerror(-r));
270 static int manager_timer(sd_event_source *source, usec_t usec, void *userdata) {
271 Manager *m = userdata;
275 return manager_send_request(m);
278 static int manager_arm_timer(Manager *m, usec_t next) {
282 assert(m->event_receive);
285 m->event_timer = sd_event_source_unref(m->event_timer);
289 if (m->event_timer) {
290 r = sd_event_source_set_time(m->event_timer, now(CLOCK_MONOTONIC) + next);
294 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
297 return sd_event_add_time(
301 now(CLOCK_MONOTONIC) + next, 0,
305 static int manager_clock_watch(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
306 Manager *m = userdata;
311 manager_clock_watch_setup(m);
313 /* skip our own jumps */
320 log_info("System time changed. Resyncing.");
321 m->poll_resync = true;
322 return manager_send_request(m);
325 /* wake up when the system time changes underneath us */
326 static int manager_clock_watch_setup(Manager *m) {
328 struct itimerspec its = {
329 .it_value.tv_sec = TIME_T_MAX
336 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
337 m->clock_watch_fd = safe_close(m->clock_watch_fd);
339 m->clock_watch_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
340 if (m->clock_watch_fd < 0) {
341 log_error("Failed to create timerfd: %m");
345 if (timerfd_settime(m->clock_watch_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
346 log_error("Failed to set up timerfd: %m");
350 r = sd_event_add_io(m->event, &m->event_clock_watch, m->clock_watch_fd, EPOLLIN, manager_clock_watch, m);
352 log_error("Failed to create clock watch event source: %s", strerror(-r));
359 static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
360 struct timex tmx = {};
366 * For small deltas, tell the kernel to gradually adjust the system
367 * clock to the NTP time, larger deltas are just directly set.
369 * Clear STA_UNSYNC, it will enable the kernel's 11-minute mode, which
370 * syncs the system time periodically to the hardware clock.
372 if (fabs(offset) < NTP_MAX_ADJUST) {
373 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
374 tmx.status = STA_PLL;
375 tmx.offset = offset * NSEC_PER_SEC;
376 tmx.constant = log2i(m->poll_interval_usec / USEC_PER_SEC) - 4;
379 log_debug(" adjust (slew): %+.3f sec\n", offset);
381 tmx.modes = ADJ_SETOFFSET | ADJ_NANO;
383 /* ADJ_NANO uses nanoseconds in the microseconds field */
384 tmx.time.tv_sec = (long)offset;
385 tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
387 /* the kernel expects -0.3s as {-1, 7000.000.000} */
388 if (tmx.time.tv_usec < 0) {
389 tmx.time.tv_sec -= 1;
390 tmx.time.tv_usec += NSEC_PER_SEC;
394 log_debug(" adjust (jump): %+.3f sec\n", offset);
399 tmx.status |= STA_INS;
402 tmx.status |= STA_DEL;
406 r = clock_adjtime(CLOCK_REALTIME, &tmx);
410 m->drift_ppm = tmx.freq / 65536;
412 log_debug(" status : %04i %s\n"
413 " time now : %li.%03lli\n"
415 " offset : %+.3f sec\n"
416 " freq offset : %+li (%i ppm)\n",
417 tmx.status, tmx.status & STA_UNSYNC ? "" : "sync",
418 tmx.time.tv_sec, tmx.time.tv_usec / NSEC_PER_MSEC,
420 (double)tmx.offset / NSEC_PER_SEC,
421 tmx.freq, m->drift_ppm);
426 static bool manager_sample_spike_detection(Manager *m, double offset, double delay) {
427 unsigned int i, idx_cur, idx_new, idx_min;
435 /* ignore initial sample */
436 if (m->packet_count == 1)
439 /* store the current data in our samples array */
440 idx_cur = m->samples_idx;
441 idx_new = (idx_cur + 1) % ELEMENTSOF(m->samples);
442 m->samples_idx = idx_new;
443 m->samples[idx_new].offset = offset;
444 m->samples[idx_new].delay = delay;
446 /* calculate new jitter value from the RMS differences relative to the lowest delay sample */
447 jitter = m->samples_jitter;
448 for (idx_min = idx_cur, i = 0; i < ELEMENTSOF(m->samples); i++)
449 if (m->samples[i].delay > 0 && m->samples[i].delay < m->samples[idx_min].delay)
453 for (i = 0; i < ELEMENTSOF(m->samples); i++)
454 j += square(m->samples[i].offset - m->samples[idx_min].offset);
455 m->samples_jitter = sqrt(j / (ELEMENTSOF(m->samples) - 1));
457 /* ignore samples when resyncing */
461 /* always accept offset if we are farther off than the round-trip delay */
462 if (fabs(offset) > delay)
465 /* we need a few samples before looking at them */
466 if (m->packet_count < 4)
469 /* do not accept anything worse than the maximum possible error of the best sample */
470 if (fabs(offset) > m->samples[idx_min].delay)
473 /* compare the difference between the current offset to the previous offset and jitter */
474 return fabs(offset - m->samples[idx_cur].offset) > 3 * jitter;
477 static void manager_adjust_poll(Manager *m, double offset, bool spike) {
480 if (m->poll_resync) {
481 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
482 m->poll_resync = false;
486 /* set to minimal poll interval */
487 if (!spike && fabs(offset) > NTP_ACCURACY_SEC) {
488 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
492 /* increase polling interval */
493 if (fabs(offset) < NTP_ACCURACY_SEC * 0.25) {
494 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
495 m->poll_interval_usec *= 2;
499 /* decrease polling interval */
500 if (spike || fabs(offset) > NTP_ACCURACY_SEC * 0.75) {
501 if (m->poll_interval_usec > NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC)
502 m->poll_interval_usec /= 2;
507 static bool sockaddr_equal(union sockaddr_union *a, union sockaddr_union *b) {
511 if (a->sa.sa_family != b->sa.sa_family)
514 if (a->sa.sa_family == AF_INET)
515 return a->in.sin_addr.s_addr == b->in.sin_addr.s_addr;
517 if (a->sa.sa_family == AF_INET6)
518 return memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof(a->in6.sin6_addr)) == 0;
523 static int manager_receive_response(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
524 _cleanup_free_ char *pretty = NULL;
525 Manager *m = userdata;
526 struct ntp_msg ntpmsg;
530 .iov_len = sizeof(ntpmsg),
533 struct cmsghdr cmsghdr;
534 uint8_t buf[CMSG_SPACE(sizeof(struct timeval))];
536 union sockaddr_union server_addr;
537 struct msghdr msghdr = {
540 .msg_control = &control,
541 .msg_controllen = sizeof(control),
542 .msg_name = &server_addr,
543 .msg_namelen = sizeof(server_addr),
545 struct cmsghdr *cmsg;
546 struct timespec now_ts;
547 struct timeval *recv_time;
549 double origin, receive, trans, dest;
550 double delay, offset;
558 if (revents & (EPOLLHUP|EPOLLERR)) {
559 log_warning("Server connection returned error.");
560 return manager_connect(m);
563 len = recvmsg(fd, &msghdr, MSG_DONTWAIT);
568 log_warning("Error receiving message. Disconnecting.");
569 return manager_connect(m);
572 if (iov.iov_len < sizeof(struct ntp_msg)) {
573 log_warning("Invalid response from server. Disconnecting.");
574 return manager_connect(m);
577 if (!m->current_server_name ||
578 !m->current_server_address ||
579 !sockaddr_equal(&server_addr, &m->current_server_address->sockaddr)) {
580 log_debug("Response from unknown server.");
585 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
586 if (cmsg->cmsg_level != SOL_SOCKET)
589 switch (cmsg->cmsg_type) {
591 recv_time = (struct timeval *) CMSG_DATA(cmsg);
596 log_error("Invalid packet timestamp.");
601 log_debug("Unexpected reply. Ignoring.");
605 /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
606 if (be32toh(ntpmsg.origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
607 be32toh(ntpmsg.origin_time.frac) != m->trans_time.tv_nsec) {
608 log_debug("Invalid reply; not our transmit time. Ignoring.");
612 if (NTP_FIELD_LEAP(ntpmsg.field) == NTP_LEAP_NOTINSYNC) {
613 log_debug("Server is not synchronized. Disconnecting.");
614 return manager_connect(m);
617 if (NTP_FIELD_VERSION(ntpmsg.field) != 4 && NTP_FIELD_VERSION(ntpmsg.field) != 3) {
618 log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg.field));
619 return manager_connect(m);
622 if (NTP_FIELD_MODE(ntpmsg.field) != NTP_MODE_SERVER) {
623 log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg.field));
624 return manager_connect(m);
629 m->retry_interval = 0;
631 /* announce leap seconds */
632 if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_PLUSSEC)
634 else if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_MINUSSEC)
640 * "Timestamp Name ID When Generated
641 * ------------------------------------------------------------
642 * Originate Timestamp T1 time request sent by client
643 * Receive Timestamp T2 time request received by server
644 * Transmit Timestamp T3 time reply sent by server
645 * Destination Timestamp T4 time reply received by client
647 * The round-trip delay, d, and system clock offset, t, are defined as:
648 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2"
650 assert_se(clock_gettime(CLOCK_MONOTONIC, &now_ts) >= 0);
651 origin = tv_to_d(recv_time) - (ts_to_d(&now_ts) - ts_to_d(&m->trans_time_mon)) + OFFSET_1900_1970;
652 receive = ntp_ts_to_d(&ntpmsg.recv_time);
653 trans = ntp_ts_to_d(&ntpmsg.trans_time);
654 dest = tv_to_d(recv_time) + OFFSET_1900_1970;
656 offset = ((receive - origin) + (trans - dest)) / 2;
657 delay = (dest - origin) - (trans - receive);
659 spike = manager_sample_spike_detection(m, offset, delay);
661 manager_adjust_poll(m, offset, spike);
663 log_debug("NTP response:\n"
668 " precision : %.6f sec (%d)\n"
669 " reference : %.4s\n"
674 " offset : %+.3f sec\n"
675 " delay : %+.3f sec\n"
676 " packet count : %"PRIu64"\n"
678 " poll interval: %llu\n",
679 NTP_FIELD_LEAP(ntpmsg.field),
680 NTP_FIELD_VERSION(ntpmsg.field),
681 NTP_FIELD_MODE(ntpmsg.field),
683 exp2(ntpmsg.precision), ntpmsg.precision,
684 ntpmsg.stratum == 1 ? ntpmsg.refid : "n/a",
685 origin - OFFSET_1900_1970,
686 receive - OFFSET_1900_1970,
687 trans - OFFSET_1900_1970,
688 dest - OFFSET_1900_1970,
691 m->samples_jitter, spike ? " spike" : "",
692 m->poll_interval_usec / USEC_PER_SEC);
695 r = manager_adjust_clock(m, offset, leap_sec);
697 log_error("Failed to call clock_adjtime(): %m");
700 r = sockaddr_pretty(&m->current_server_address->sockaddr.sa, m->current_server_address->socklen, true, &pretty);
702 log_error("Failed to format socket address: %s", strerror(-r));
706 log_info("%s (%s): interval/delta/delay/jitter/drift %llus/%+.3fs/%.3fs/%.3fs/%+ippm%s",
707 pretty, m->current_server_name->string, m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_ppm,
708 spike ? " (ignored)" : "");
710 r = manager_arm_timer(m, m->poll_interval_usec);
712 log_error("Failed to rearm timer: %s", strerror(-r));
719 static int manager_listen_setup(Manager *m) {
720 union sockaddr_union addr = {};
721 static const int tos = IPTOS_LOWDELAY;
722 static const int on = 1;
727 assert(m->server_socket < 0);
728 assert(!m->event_receive);
729 assert(m->current_server_address);
731 addr.sa.sa_family = m->current_server_address->sockaddr.sa.sa_family;
733 m->server_socket = socket(addr.sa.sa_family, SOCK_DGRAM | SOCK_CLOEXEC, 0);
734 if (m->server_socket < 0)
737 r = bind(m->server_socket, &addr.sa, m->current_server_address->socklen);
741 r = setsockopt(m->server_socket, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on));
745 setsockopt(m->server_socket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
747 return sd_event_add_io(m->event, &m->event_receive, m->server_socket, EPOLLIN, manager_receive_response, m);
750 static int manager_begin(Manager *m) {
751 _cleanup_free_ char *pretty = NULL;
755 assert_return(m->current_server_name, -EHOSTUNREACH);
756 assert_return(m->current_server_address, -EHOSTUNREACH);
758 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
760 r = sockaddr_pretty(&m->current_server_address->sockaddr.sa, m->current_server_address->socklen, true, &pretty);
762 log_warning("Failed to decode address of %s: %s", m->current_server_name->string, strerror(-r));
766 log_debug("Connecting to NTP server %s (%s).", pretty, m->current_server_name->string);
767 sd_notifyf(false, "STATUS=Using Time Server %s (%s)", pretty, m->current_server_name->string);
769 r = manager_listen_setup(m);
771 log_warning("Failed to setup connection socket: %s", strerror(-r));
775 r = manager_clock_watch_setup(m);
779 return manager_send_request(m);
782 static void server_name_flush_addresses(ServerName *n) {
787 while ((a = n->addresses)) {
788 LIST_REMOVE(addresses, n->addresses, a);
793 static void manager_flush_names(Manager *m) {
798 while ((n = m->servers)) {
799 LIST_REMOVE(names, m->servers, n);
801 server_name_flush_addresses(n);
806 static int manager_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata) {
807 Manager *m = userdata;
808 ServerAddress *a, *last = NULL;
812 assert(m->current_server_name);
814 m->resolve_query = sd_resolve_query_unref(m->resolve_query);
817 log_error("Failed to resolve %s: %s", m->current_server_name->string, gai_strerror(ret));
820 return manager_connect(m);
823 server_name_flush_addresses(m->current_server_name);
825 for (; ai; ai = ai->ai_next) {
826 _cleanup_free_ char *pretty = NULL;
829 assert(ai->ai_addrlen >= offsetof(struct sockaddr, sa_data));
830 assert(ai->ai_addrlen <= sizeof(union sockaddr_union));
832 if (!IN_SET(ai->ai_addr->sa_family, AF_INET, AF_INET6)) {
833 log_warning("Unsuitable address protocol for %s", m->current_server_name->string);
837 a = new0(ServerAddress, 1);
841 memcpy(&a->sockaddr, ai->ai_addr, ai->ai_addrlen);
842 a->socklen = ai->ai_addrlen;
844 LIST_INSERT_AFTER(addresses, m->current_server_name->addresses, last, a);
847 sockaddr_pretty(&a->sockaddr.sa, a->socklen, true, &pretty);
848 log_debug("Found address %s for %s.", pretty, m->current_server_name->string);
851 if (!m->current_server_name->addresses) {
852 log_error("Failed to find suitable address for host %s.", m->current_server_name->string);
855 return manager_connect(m);
858 m->current_server_address = m->current_server_name->addresses;
860 return manager_begin(m);
863 static int manager_retry(sd_event_source *source, usec_t usec, void *userdata) {
864 Manager *m = userdata;
868 return manager_connect(m);
871 static int manager_connect(Manager *m) {
873 struct addrinfo hints = {
874 .ai_flags = AI_NUMERICSERV|AI_ADDRCONFIG,
875 .ai_socktype = SOCK_DGRAM,
881 manager_disconnect(m);
883 m->event_retry = sd_event_source_unref(m->event_retry);
884 if (!ratelimit_test(&m->ratelimit)) {
885 log_debug("Slowing down attempts to contact servers.");
887 r = sd_event_add_time(m->event, &m->event_retry, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + RETRY_USEC, 0, manager_retry, m);
889 log_error("Failed to create retry timer: %s", strerror(-r));
896 /* If we already are operating on some address, switch to the
898 if (m->current_server_address && m->current_server_address->addresses_next)
899 m->current_server_address = m->current_server_address->addresses_next;
901 /* Hmm, we are through all addresses, let's look for the next host instead */
902 m->current_server_address = NULL;
904 if (m->current_server_name && m->current_server_name->names_next)
905 m->current_server_name = m->current_server_name->names_next;
908 m->current_server_name = NULL;
909 log_debug("No server found.");
913 m->current_server_name = m->servers;
916 r = sd_resolve_getaddrinfo(m->resolve, &m->resolve_query, m->current_server_name->string, "123", &hints, manager_resolve_handler, m);
918 log_error("Failed to create resolver: %s", strerror(-r));
925 r = manager_begin(m);
932 static int manager_add_server(Manager *m, const char *server) {
938 n = new0(ServerName, 1);
942 n->string = strdup(server);
948 LIST_PREPEND(names, m->servers, n);
952 static void manager_disconnect(Manager *m) {
955 m->resolve_query = sd_resolve_query_unref(m->resolve_query);
957 m->event_timer = sd_event_source_unref(m->event_timer);
959 m->event_receive = sd_event_source_unref(m->event_receive);
960 m->server_socket = safe_close(m->server_socket);
962 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
963 m->clock_watch_fd = safe_close(m->clock_watch_fd);
966 static int manager_new(Manager **ret) {
967 _cleanup_manager_free_ Manager *m = NULL;
970 m = new0(Manager, 1);
974 m->server_socket = m->clock_watch_fd = -1;
976 RATELIMIT_INIT(m->ratelimit, RATELIMIT_INTERVAL_USEC, RATELIMIT_BURST);
978 r = sd_event_default(&m->event);
982 sd_event_add_signal(m->event, &m->sigterm, SIGTERM, NULL, NULL);
983 sd_event_add_signal(m->event, &m->sigint, SIGINT, NULL, NULL);
985 r = sd_resolve_default(&m->resolve);
989 r = sd_resolve_attach_event(m->resolve, m->event, 0);
993 r = manager_clock_watch_setup(m);
1003 static void manager_free(Manager *m) {
1007 manager_disconnect(m);
1008 manager_flush_names(m);
1010 sd_event_source_unref(m->sigint);
1011 sd_event_source_unref(m->sigterm);
1013 sd_event_source_unref(m->event_retry);
1015 sd_resolve_unref(m->resolve);
1016 sd_event_unref(m->event);
1021 int main(int argc, char *argv[]) {
1022 _cleanup_manager_free_ Manager *m = NULL;
1026 log_set_target(LOG_TARGET_AUTO);
1027 log_parse_environment();
1030 assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, -1) == 0);
1032 r = manager_new(&m);
1034 log_error("Failed to allocate manager: %s", strerror(-r));
1038 sd_notify(false, "READY=1");
1040 FOREACH_STRING(x, "time1.google.com", "time2.google.com", "time3.google.com", "time4.google.com", "0.fedora.pool.ntp.org") {
1041 r = manager_add_server(m, x);
1043 log_error("Failed to add server %s: %s", x, strerror(-r));
1048 r = manager_connect(m);
1052 r = sd_event_loop(m->event);
1054 log_error("Failed to run event loop: %s", strerror(-r));
1058 sd_event_get_exit_code(m->event, &r);
1061 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;