From 52278b8df9433b2e32d2d842637024b42fcf1a94 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Fri, 13 May 2016 00:00:11 +0300 Subject: [PATCH 4007/4007] ntpd: postpone hostname resolution if fails on startup Signed-off-by: Kaarle Ritvanen --- networking/ntpd.c | 116 +++++++++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/networking/ntpd.c b/networking/ntpd.c index 4103189..7f7d69e 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c @@ -765,34 +765,48 @@ reset_peer_stats(peer_t *p, double offset) } static void +resolve_peer_hostname(peer_t *p) { + len_and_sockaddr *lsa = host2sockaddr(p->p_hostname, 123); + if (lsa) { + if (p->p_lsa) { + free(p->p_lsa); + free(p->p_dotted); + } + p->p_lsa = lsa; + p->p_dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa); + } + set_next(p, lsa ? 0 : RETRY_INTERVAL); +} + +static void add_peers(const char *s) { llist_t *item; peer_t *p; p = xzalloc(sizeof(*p)); - p->p_lsa = xhost2sockaddr(s, 123); - p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa); + p->p_hostname = xstrdup(s); + resolve_peer_hostname(p); /* Names like N..pool.ntp.org are randomly resolved * to a pool of machines. Sometimes different N's resolve to the same IP. * It is not useful to have two peers with same IP. We skip duplicates. */ - for (item = G.ntp_peers; item != NULL; item = item->link) { - peer_t *pp = (peer_t *) item->data; - if (strcmp(p->p_dotted, pp->p_dotted) == 0) { - bb_error_msg("duplicate peer %s (%s)", s, p->p_dotted); - free(p->p_lsa); - free(p->p_dotted); - free(p); - return; + if (p->p_lsa) + for (item = G.ntp_peers; item != NULL; item = item->link) { + peer_t *pp = (peer_t *) item->data; + if (pp->p_lsa && strcmp(p->p_dotted, pp->p_dotted) == 0) { + bb_error_msg("duplicate peer %s (%s)", s, p->p_dotted); + free(p->p_hostname); + free(p->p_lsa); + free(p->p_dotted); + free(p); + return; + } } - } - p->p_hostname = xstrdup(s); p->p_fd = -1; p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3); - p->next_action_time = G.cur_time; /* = set_next(p, 0); */ reset_peer_stats(p, STEP_THRESHOLD); llist_add_to(&G.ntp_peers, p); @@ -2317,54 +2331,50 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv) for (item = G.ntp_peers; item != NULL; item = item->link) { peer_t *p = (peer_t *) item->data; - if (p->next_action_time <= G.cur_time) { - if (p->p_fd == -1) { - /* Time to send new req */ - if (--cnt == 0) { - VERB4 bb_error_msg("disabling burst mode"); - G.polladj_count = 0; - G.poll_exp = MINPOLL; - } - send_query_to_peer(p); - } else { - /* Timed out waiting for reply */ - close(p->p_fd); - p->p_fd = -1; - /* If poll interval is small, increase it */ - if (G.poll_exp < BIGPOLL) - adjust_poll(MINPOLL); - timeout = poll_interval(NOREPLY_INTERVAL); - bb_error_msg("timed out waiting for %s, reach 0x%02x, next query in %us", - p->p_dotted, p->reachable_bits, timeout); - - /* What if don't see it because it changed its IP? */ - if (p->reachable_bits == 0) { - len_and_sockaddr *lsa = host2sockaddr(p->p_hostname, 123); - if (lsa) { - char *dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa); - //if (strcmp(dotted, p->p_dotted) != 0) - // bb_error_msg("peer IP changed"); - free(p->p_lsa); - free(p->p_dotted); - p->p_lsa = lsa; - p->p_dotted = dotted; + if (p->p_lsa) { + + if (p->next_action_time <= G.cur_time) { + if (p->p_fd == -1) { + /* Time to send new req */ + if (--cnt == 0) { + VERB4 bb_error_msg("disabling burst mode"); + G.polladj_count = 0; + G.poll_exp = MINPOLL; } + send_query_to_peer(p); + } else { + /* Timed out waiting for reply */ + close(p->p_fd); + p->p_fd = -1; + /* If poll interval is small, increase it */ + if (G.poll_exp < BIGPOLL) + adjust_poll(MINPOLL); + timeout = poll_interval(NOREPLY_INTERVAL); + bb_error_msg("timed out waiting for %s, reach 0x%02x, next query in %us", + p->p_dotted, p->reachable_bits, timeout); + + /* What if don't see it because it changed its IP? */ + if (p->reachable_bits == 0) + resolve_peer_hostname(p); + + set_next(p, timeout); } + } - set_next(p, timeout); + if (p->p_fd >= 0) { + /* Wait for reply from this peer */ + pfd[i].fd = p->p_fd; + pfd[i].events = POLLIN; + idx2peer[i] = p; + i++; } - } + + } else + resolve_peer_hostname(p); if (p->next_action_time < nextaction) nextaction = p->next_action_time; - if (p->p_fd >= 0) { - /* Wait for reply from this peer */ - pfd[i].fd = p->p_fd; - pfd[i].events = POLLIN; - idx2peer[i] = p; - i++; - } } timeout = nextaction - G.cur_time; -- 2.8.3