ntpd: if peer does not reply anymore, try re-resolving its hostname
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 4 Mar 2016 06:26:08 +0000 (07:26 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 4 Mar 2016 06:26:08 +0000 (07:26 +0100)
function                                             old     new   delta
ntpd_main                                           1053    1130     +77
add_peers                                            166     195     +29

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ntpd.c

index 517806e7514aa971d455402e88a1379cebb56dad..410318979008a101ebcdfa7e6003ad52bb215c02 100644 (file)
@@ -267,6 +267,7 @@ typedef struct {
 
 typedef struct {
        len_and_sockaddr *p_lsa;
+       char             *p_hostname;
        char             *p_dotted;
        int              p_fd;
        int              datapoint_idx;
@@ -781,11 +782,14 @@ add_peers(const char *s)
                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;
                }
        }
 
+       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); */
@@ -2332,6 +2336,21 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
                                        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;
+                                               }
+                                       }
+
                                        set_next(p, timeout);
                                }
                        }