diff options
-rw-r--r-- | networking/ntpd.c | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c index 410318979..98158a304 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
@@ -267,7 +267,6 @@ typedef struct { | |||
267 | 267 | ||
268 | typedef struct { | 268 | typedef struct { |
269 | len_and_sockaddr *p_lsa; | 269 | len_and_sockaddr *p_lsa; |
270 | char *p_hostname; | ||
271 | char *p_dotted; | 270 | char *p_dotted; |
272 | int p_fd; | 271 | int p_fd; |
273 | int datapoint_idx; | 272 | int datapoint_idx; |
@@ -293,6 +292,7 @@ typedef struct { | |||
293 | datapoint_t filter_datapoint[NUM_DATAPOINTS]; | 292 | datapoint_t filter_datapoint[NUM_DATAPOINTS]; |
294 | /* last sent packet: */ | 293 | /* last sent packet: */ |
295 | msg_t p_xmt_msg; | 294 | msg_t p_xmt_msg; |
295 | char p_hostname[1]; | ||
296 | } peer_t; | 296 | } peer_t; |
297 | 297 | ||
298 | 298 | ||
@@ -765,14 +765,38 @@ reset_peer_stats(peer_t *p, double offset) | |||
765 | } | 765 | } |
766 | 766 | ||
767 | static void | 767 | static void |
768 | resolve_peer_hostname(peer_t *p, int loop_on_fail) | ||
769 | { | ||
770 | len_and_sockaddr *lsa; | ||
771 | |||
772 | again: | ||
773 | lsa = host2sockaddr(p->p_hostname, 123); | ||
774 | if (!lsa) { | ||
775 | /* error message already emitted by host2sockaddr() */ | ||
776 | if (!loop_on_fail) | ||
777 | return; | ||
778 | //FIXME: do this to avoid infinite looping on typo in a hostname? | ||
779 | //well... in which case, what is a good value for loop_on_fail? | ||
780 | //if (--loop_on_fail == 0) | ||
781 | // xfunc_die(); | ||
782 | sleep(5); | ||
783 | goto again; | ||
784 | } | ||
785 | free(p->p_lsa); | ||
786 | free(p->p_dotted); | ||
787 | p->p_lsa = lsa; | ||
788 | p->p_dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa); | ||
789 | } | ||
790 | |||
791 | static void | ||
768 | add_peers(const char *s) | 792 | add_peers(const char *s) |
769 | { | 793 | { |
770 | llist_t *item; | 794 | llist_t *item; |
771 | peer_t *p; | 795 | peer_t *p; |
772 | 796 | ||
773 | p = xzalloc(sizeof(*p)); | 797 | p = xzalloc(sizeof(*p) + strlen(s)); |
774 | p->p_lsa = xhost2sockaddr(s, 123); | 798 | strcpy(p->p_hostname, s); |
775 | p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa); | 799 | resolve_peer_hostname(p, /*loop_on_fail=*/ 1); |
776 | 800 | ||
777 | /* Names like N.<country2chars>.pool.ntp.org are randomly resolved | 801 | /* Names like N.<country2chars>.pool.ntp.org are randomly resolved |
778 | * to a pool of machines. Sometimes different N's resolve to the same IP. | 802 | * to a pool of machines. Sometimes different N's resolve to the same IP. |
@@ -789,7 +813,6 @@ add_peers(const char *s) | |||
789 | } | 813 | } |
790 | } | 814 | } |
791 | 815 | ||
792 | p->p_hostname = xstrdup(s); | ||
793 | p->p_fd = -1; | 816 | p->p_fd = -1; |
794 | p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3); | 817 | p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3); |
795 | p->next_action_time = G.cur_time; /* = set_next(p, 0); */ | 818 | p->next_action_time = G.cur_time; /* = set_next(p, 0); */ |
@@ -2338,18 +2361,8 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv) | |||
2338 | p->p_dotted, p->reachable_bits, timeout); | 2361 | p->p_dotted, p->reachable_bits, timeout); |
2339 | 2362 | ||
2340 | /* What if don't see it because it changed its IP? */ | 2363 | /* What if don't see it because it changed its IP? */ |
2341 | if (p->reachable_bits == 0) { | 2364 | if (p->reachable_bits == 0) |
2342 | len_and_sockaddr *lsa = host2sockaddr(p->p_hostname, 123); | 2365 | resolve_peer_hostname(p, /*loop_on_fail=*/ 0); |
2343 | if (lsa) { | ||
2344 | char *dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa); | ||
2345 | //if (strcmp(dotted, p->p_dotted) != 0) | ||
2346 | // bb_error_msg("peer IP changed"); | ||
2347 | free(p->p_lsa); | ||
2348 | free(p->p_dotted); | ||
2349 | p->p_lsa = lsa; | ||
2350 | p->p_dotted = dotted; | ||
2351 | } | ||
2352 | } | ||
2353 | 2366 | ||
2354 | set_next(p, timeout); | 2367 | set_next(p, timeout); |
2355 | } | 2368 | } |