aboutsummaryrefslogtreecommitdiffstats
path: root/main/busybox/4007-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/busybox/4007-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch')
-rw-r--r--main/busybox/4007-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch171
1 files changed, 171 insertions, 0 deletions
diff --git a/main/busybox/4007-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch b/main/busybox/4007-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch
new file mode 100644
index 0000000000..81f4ef8c92
--- /dev/null
+++ b/main/busybox/4007-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch
@@ -0,0 +1,171 @@
+From 52278b8df9433b2e32d2d842637024b42fcf1a94 Mon Sep 17 00:00:00 2001
+From: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
+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 <kaarle.ritvanen@datakunkku.fi>
+---
+ 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.<country2chars>.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
+