X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimesync%2Ftimesyncd-manager.c;h=e5b156b7ddf1ed4b38da1322141f061bde2d69b8;hb=e4746b57387ffaf8be01c177ed4bbf02c8088341;hp=3261bc1fb12edc221e11a0ed25d5eaa832fd43f3;hpb=80cd2606b91ce2735a0609c6f964917cf12685aa;p=elogind.git diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c index 3261bc1fb..e5b156b7d 100644 --- a/src/timesync/timesyncd-manager.c +++ b/src/timesync/timesyncd-manager.c @@ -54,8 +54,7 @@ #include "mkdir.h" #include "timesyncd-conf.h" #include "timesyncd-manager.h" - -#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1) +#include "time-util.h" #ifndef ADJ_SETOFFSET #define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */ @@ -209,6 +208,19 @@ static int manager_send_request(Manager *m) { return manager_connect(m); } + /* re-arm timer with increasing timeout, in case the packets never arrive back */ + if (m->retry_interval > 0) { + if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC) + m->retry_interval *= 2; + } else + m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC; + + r = manager_arm_timer(m, m->retry_interval); + if (r < 0) { + log_error("Failed to rearm timer: %s", strerror(-r)); + return r; + } + m->missed_replies++; if (m->missed_replies > NTP_MAX_MISSED_REPLIES) { r = sd_event_add_time( @@ -596,6 +608,7 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re /* valid packet */ m->pending = false; + m->retry_interval = 0; /* announce leap seconds */ if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_PLUSSEC) @@ -707,7 +720,9 @@ static int manager_listen_setup(Manager *m) { if (r < 0) return -errno; - setsockopt(m->server_socket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)); + r = setsockopt(m->server_socket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)); + if (r < 0) + return -errno; return sd_event_add_io(m->event, &m->event_receive, m->server_socket, EPOLLIN, manager_receive_response, m); }