ntpd: try to avoid DNS requests *during* NTP roundtrip. +23 bytes
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 2 Dec 2009 22:46:25 +0000 (23:46 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 2 Dec 2009 22:46:25 +0000 (23:46 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ntpd.c

index 3bca69a4c58797b7be107e1dc7f3335533cac15d..375f009a626baf749242fe8dd1f0b99864348eb5 100644 (file)
@@ -166,6 +166,15 @@ set_next(ntp_peer_t *p, unsigned t)
        p->next_action_time = time(NULL) + t;
 }
 
+static len_and_sockaddr*
+resolve_hostname(ntp_peer_t *p)
+{
+       p->lsa = host2sockaddr(p->hostname, 123);
+       if (p->lsa)
+               p->dotted = xmalloc_sockaddr2dotted_noport(&p->lsa->u.sa);
+       return p->lsa;
+}
+
 static void
 add_peers(char *s)
 {
@@ -174,6 +183,7 @@ add_peers(char *s)
        p = xzalloc(sizeof(*p));
        p->hostname = s;
        p->dotted = s;
+       resolve_hostname(p);
        p->fd = -1;
        p->msg.m_status = MODE_CLIENT | (NTP_VERSION << 3);
        p->trustlevel = TRUSTLEVEL_PATHETIC;
@@ -300,12 +310,10 @@ send_query_to_peer(ntp_peer_t *p)
 //TODO: big ntpd uses all IPs, not just 1st, do we need to mimic that?
 //TODO: periodically re-resolve DNS names?
                if (!p->lsa) {
-                       p->lsa = host2sockaddr(p->hostname, 123);
-                       if (!p->lsa) {
+                       if (!resolve_hostname(p)) {
                                set_next(p, INTERVAL_QUERY_PATHETIC);
                                return -1;
                        }
-                       p->dotted = xmalloc_sockaddr2dotted_noport(&p->lsa->u.sa);
                }
 
                family = p->lsa->u.sa.sa_family;