Start using notify_remote_exit() in the Windows front end, in place
[u/mdw/putty] / windows / winnet.c
index 8a7580b..47ac8b2 100644 (file)
@@ -356,6 +356,7 @@ SockAddr sk_namelookup(const char *host, char **canonicalname,
 #ifndef NO_IPV6
     ret->ai = ret->ais = NULL;
 #endif
+    ret->addresses = NULL;
     ret_family = AF_UNSPEC;
     *realhost = '\0';
 
@@ -368,6 +369,7 @@ SockAddr sk_namelookup(const char *host, char **canonicalname,
            struct addrinfo hints;
            memset(&hints, 0, sizeof(hints));
            hints.ai_family = ret->family;
+           hints.ai_flags = AI_CANONNAME;
            if ((err = p_getaddrinfo(host, NULL, &hints, &ret->ais)) == 0)
                ret_family = ret->ais->ai_family;
            ret->ai = ret->ais;
@@ -406,17 +408,10 @@ SockAddr sk_namelookup(const char *host, char **canonicalname,
                           (char *) &((SOCKADDR_IN *) ret->ai->
                                      ai_addr)->sin_addr, sizeof(a));
 
-               /* Now let's find that canonicalname... */
-               if (p_getnameinfo) {
-                   if (p_getnameinfo
-                       ((struct sockaddr *) ret->ai->ai_addr,
-                        ret->family ==
-                        AF_INET ? sizeof(SOCKADDR_IN) :
-                        sizeof(SOCKADDR_IN6), realhost,
-                        sizeof(realhost), NULL, 0, 0) != 0) {
-                       strncpy(realhost, host, sizeof(realhost));
-                   }
-               }
+               if (ret->ai->ai_canonname)
+                   strncpy(realhost, ret->ai->ai_canonname, lenof(realhost));
+               else
+                   strncpy(realhost, host, lenof(realhost));
            }
            /* We used the IPv4-only gethostbyname()... */
            else
@@ -462,6 +457,7 @@ SockAddr sk_nonamelookup(const char *host)
 #ifndef NO_IPV6
     ret->ai = ret->ais = NULL;
 #endif
+    ret->addresses = NULL;
     ret->naddresses = 0;
     strncpy(ret->hostname, host, lenof(ret->hostname));
     ret->hostname[lenof(ret->hostname)-1] = '\0';
@@ -572,10 +568,18 @@ int sk_address_is_local(SockAddr addr)
     } else
 #endif
     if (addr->family == AF_INET) {
-       struct in_addr a;
-       assert(addr->addresses && addr->curraddr < addr->naddresses);
-       a.s_addr = p_htonl(addr->addresses[addr->curraddr]);
-       return ipv4_is_local_addr(a);
+#ifndef NO_IPV6
+       if (addr->ai) {
+           return ipv4_is_local_addr(((struct sockaddr_in *)addr->ai->ai_addr)
+                                     ->sin_addr);
+       } else
+#endif
+       {
+           struct in_addr a;
+           assert(addr->addresses && addr->curraddr < addr->naddresses);
+           a.s_addr = p_htonl(addr->addresses[addr->curraddr]);
+           return ipv4_is_local_addr(a);
+       }
     } else {
        assert(addr->family == AF_UNSPEC);
        return 0;                      /* we don't know; assume not */