diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2016-12-29 17:05:27 +0100 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2016-12-29 16:10:34 +0000 |
commit | 6cd2a0970fff43c9000bfb5f48d0e348963875fb (patch) | |
tree | 1ccdf651e58cef2f2d889b482cafd908cf632af3 /main/busybox/0011-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch | |
parent | 338b9d74c73b3c61c93da3b3abd9c5a5cffe6d4f (diff) | |
download | aports-6cd2a0970fff43c9000bfb5f48d0e348963875fb.tar.bz2 aports-6cd2a0970fff43c9000bfb5f48d0e348963875fb.tar.xz |
main/busybox: upgrade to 1.26.0
Diffstat (limited to 'main/busybox/0011-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch')
-rw-r--r-- | main/busybox/0011-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/main/busybox/0011-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch b/main/busybox/0011-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch new file mode 100644 index 0000000000..a7e5d14fd1 --- /dev/null +++ b/main/busybox/0011-ntpd-postpone-hostname-resolution-if-fails-on-startu.patch @@ -0,0 +1,205 @@ +From 838188511cb2085d8980956b270cc68ed9911102 Mon Sep 17 00:00:00 2001 +From: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> +Date: Thu, 4 Aug 2016 12:26:56 +0200 +Subject: [PATCH 11/12] ntpd: postpone hostname resolution if fails on startup + +Signed-off-by: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> +--- + networking/ntpd.c | 130 +++++++++++++++++++++++++++--------------------------- + 1 file changed, 64 insertions(+), 66 deletions(-) + +diff --git a/networking/ntpd.c b/networking/ntpd.c +index b7fa5dce9..c6d07adac 100644 +--- a/networking/ntpd.c ++++ b/networking/ntpd.c +@@ -155,6 +155,7 @@ + #define RETRY_INTERVAL 32 /* on send/recv error, retry in N secs (need to be power of 2) */ + #define NOREPLY_INTERVAL 512 /* sent, but got no reply: cap next query by this many seconds */ + #define RESPONSE_INTERVAL 16 /* wait for reply up to N secs */ ++#define HOSTNAME_INTERVAL 4 /* hostname lookup failed. Wait N secs for next try */ + + /* Step threshold (sec). std ntpd uses 0.128. + */ +@@ -293,6 +294,7 @@ typedef struct { + + typedef struct { + len_and_sockaddr *p_lsa; ++ char *p_hostname; + char *p_dotted; + int p_fd; + int datapoint_idx; +@@ -318,7 +320,6 @@ typedef struct { + datapoint_t filter_datapoint[NUM_DATAPOINTS]; + /* last sent packet: */ + msg_t p_xmt_msg; +- char p_hostname[1]; + } peer_t; + + +@@ -791,27 +792,17 @@ reset_peer_stats(peer_t *p, double offset) + } + + static void +-resolve_peer_hostname(peer_t *p, int loop_on_fail) +-{ +- len_and_sockaddr *lsa; +- +- again: +- lsa = host2sockaddr(p->p_hostname, 123); +- if (!lsa) { +- /* error message already emitted by host2sockaddr() */ +- if (!loop_on_fail) +- return; +-//FIXME: do this to avoid infinite looping on typo in a hostname? +-//well... in which case, what is a good value for loop_on_fail? +- //if (--loop_on_fail == 0) +- // xfunc_die(); +- sleep(5); +- goto again; ++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); + } +- 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 : HOSTNAME_INTERVAL); + } + + static void +@@ -820,28 +811,29 @@ add_peers(const char *s) + llist_t *item; + peer_t *p; + +- p = xzalloc(sizeof(*p) + strlen(s)); +- strcpy(p->p_hostname, s); +- resolve_peer_hostname(p, /*loop_on_fail=*/ 1); ++ p = xzalloc(sizeof(*p)); ++ 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_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); +@@ -2378,44 +2370,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; ++ 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); + } +- 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, /*loop_on_fail=*/ 0); +- +- 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.11.0 + |