Use AI_ADDRCONFIG for more efficient getaddrinfo
authorGreg Hudson <ghudson@mit.edu>
Thu, 23 Jun 2011 04:13:45 +0000 (04:13 +0000)
committerGreg Hudson <ghudson@mit.edu>
Thu, 23 Jun 2011 04:13:45 +0000 (04:13 +0000)
Add AI_ADDRCONFIG to the hint flags for every invocation of
getaddrinfo which wasn't already using it.  This is often the default
behavior when no hints are specified, but we tend to specify hints a
lot, so we have to say it ourselves.  AI_ADDRCONFIG causes AAAA
lookups to be skipped if the system has no public IPv6 interface
addresses, usually saving a couple of DNS queries per getaddrinfo
call and allowing DNS caching to be much more effective without the
need for negative caching.

ticket: 6923

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@24978 dc483132-0cff-0310-8789-dd5450dbe970

src/appl/sample/sclient/sclient.c
src/kadmin/dbutil/kadm5_create.c
src/lib/kadm5/alt_prof.c
src/lib/kadm5/clnt/client_init.c
src/lib/krb5/os/hostaddr.c
src/lib/krb5/os/hst_realm.c
src/lib/krb5/os/sendto_kdc.c
src/plugins/locate/python/py-locate.c
src/slave/kprop.c

index eb868d2d2fce60d5d4fa0fe60308f709e2d37c62..7ec8edd0e68fafb6768d93c231e61267b5bb98de 100644 (file)
@@ -125,6 +125,7 @@ main(int argc, char *argv[])
 
     memset(&aihints, 0, sizeof(aihints));
     aihints.ai_socktype = SOCK_STREAM;
+    aihints.ai_flags = AI_ADDRCONFIG;
     aierr = getaddrinfo(argv[1], portstr, &aihints, &ap);
     if (aierr) {
         fprintf(stderr, "%s: error looking up host '%s' port '%s'/tcp: %s\n",
index 65cd68be5d988c5d65bddeec4e4477dc14094beb..9d5ee1da4ef6ac9cdcc067c919401fff052b6ec5 100644 (file)
@@ -184,7 +184,7 @@ static int add_admin_princs(void *handle, krb5_context context, char *realm)
         goto clean_and_exit;
     }
     memset(&ai_hints, 0, sizeof(ai_hints));
-    ai_hints.ai_flags = AI_CANONNAME;
+    ai_hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
     gai_error = getaddrinfo(localname, (char *)NULL, &ai_hints, &ai);
     if (gai_error) {
         ret = EINVAL;
index 98231ab3308d33858aa6dde007e03a675e2a5147..6537d302573fedde678722e039b965a9fb6127ba 100644 (file)
@@ -897,7 +897,7 @@ kadm5_get_admin_service_name(krb5_context ctx,
     }
 
     memset(&hint, 0, sizeof(hint));
-    hint.ai_flags = AI_CANONNAME;
+    hint.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
     err = getaddrinfo(params_out.admin_server, NULL, &hint, &ai);
     if (err != 0) {
         ret = KADM5_CANT_RESOLVE;
index 735ddfd317c008bccfc2900d630a6d69b0c1b7d2..d6309979ffe0a0b4286fe3f019c20e5a591009b7 100644 (file)
@@ -563,8 +563,9 @@ connect_to_server(const char *hostname, int port, int *fd)
     (void) snprintf(portbuf, sizeof(portbuf), "%d", port);
     memset(&hint, 0, sizeof(hint));
     hint.ai_socktype = SOCK_STREAM;
+    hint.ai_flags = AI_ADDRCONFIG;
 #ifdef AI_NUMERICSERV
-    hint.ai_flags = AI_NUMERICSERV;
+    hint.ai_flags |= AI_NUMERICSERV;
 #endif
     err = getaddrinfo(hostname, portbuf, &hint, &addrs);
     if (err != 0)
index ccab1d0e4aa8a1fb0dfcc3c83bf2caf2534b117d..5046f9b3184b26eef6c76a23df5ec182a56110d2 100644 (file)
@@ -41,7 +41,7 @@ krb5_os_hostaddr(krb5_context context, const char *name,
         return KRB5_ERR_BAD_HOSTNAME;
 
     memset (&hints, 0, sizeof (hints));
-    hints.ai_flags = AI_NUMERICHOST;
+    hints.ai_flags = AI_NUMERICHOST | AI_ADDRCONFIG;
     /* We don't care what kind at this point, really, but without
        this, we can get back multiple sockaddrs per address, for
        SOCK_DGRAM, SOCK_STREAM, and SOCK_RAW.  I haven't checked if
index 33e13e1c595bc22b2ecc2ba6932c52d5229b9d2a..d780433f8f3cc108df99e38b6f233f40d4103876 100644 (file)
@@ -107,7 +107,7 @@ get_fq_hostname(char *buf, size_t bufsize, const char *name)
     int err;
 
     memset (&hints, 0, sizeof (hints));
-    hints.ai_flags = AI_CANONNAME;
+    hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
     err = getaddrinfo (name, 0, &hints, &ai);
     if (err)
         return krb5int_translate_gai_error (err);
index a3eb322341ec01789eca83c000e5e1cc03522262..371af9d23f0eaafe6c1805c6358d3760983fc4a5 100644 (file)
@@ -725,8 +725,9 @@ resolve_server(krb5_context context, const struct serverlist *servers,
     memset(&hint, 0, sizeof(hint));
     hint.ai_family = entry->family;
     hint.ai_socktype = (entry->socktype != 0) ? entry->socktype : socktype1;
+    hint.ai_flags = AI_ADDRCONFIG;
 #ifdef AI_NUMERICSERV
-    hint.ai_flags = AI_NUMERICSERV;
+    hint.ai_flags |= AI_NUMERICSERV;
 #endif
     result = snprintf(portbuf, sizeof(portbuf), "%d", ntohs(entry->port));
     if (SNPRINTF_OVERFLOW(result, sizeof(portbuf)))
index 23b407c6338a6114ca55a0c1c664e152d4bb42c0..7273026760fb8d8eb0d92db146f38c597d184717 100644 (file)
@@ -302,6 +302,7 @@ lookup(void *blob, enum locate_service_type svc, const char *realm,
             return -1;
         }
         aihints.ai_socktype = thissocktype;
+        aihints.ai_flags = AI_ADDRCONFIG;
         x = getaddrinfo (hoststr, portstr, &aihints, &airesult);
         if (x != 0)
             continue;
index f1b676fb8ac50143097b2f07e6e8157060836078..1c2a93b17549d0ff36af944b3e83beabe381e951 100644 (file)
@@ -322,6 +322,7 @@ open_connection(krb5_context context, char *host, int *fd)
     memset(&hints, 0, sizeof(hints));
     hints.ai_family = PF_UNSPEC;
     hints.ai_socktype = SOCK_STREAM;
+    hints.ai_flags = AI_ADDRCONFIG;
     error = getaddrinfo(host, port, &hints, &answers);
     if (error != 0) {
         com_err(progname, 0, "%s: %s", host, gai_strerror(error));