Start using notify_remote_exit() in the Windows front end, in place
[u/mdw/putty] / windows / winnet.c
index 1ddfa5c..47ac8b2 100644 (file)
@@ -353,6 +353,10 @@ SockAddr sk_namelookup(const char *host, char **canonicalname,
                   address_family == ADDRTYPE_IPV6 ? AF_INET6 :
 #endif
                   AF_UNSPEC);
+#ifndef NO_IPV6
+    ret->ai = ret->ais = NULL;
+#endif
+    ret->addresses = NULL;
     ret_family = AF_UNSPEC;
     *realhost = '\0';
 
@@ -365,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;
@@ -403,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
@@ -456,6 +454,11 @@ SockAddr sk_nonamelookup(const char *host)
     SockAddr ret = snew(struct SockAddr_tag);
     ret->error = NULL;
     ret->family = AF_UNSPEC;
+#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';
     return ret;
@@ -565,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 */
@@ -1509,9 +1520,12 @@ static void sk_tcp_set_frozen(Socket sock, int is_frozen)
     if (s->frozen == is_frozen)
        return;
     s->frozen = is_frozen;
-    if (!is_frozen && s->frozen_readable) {
-       char c;
-       p_recv(s->s, &c, 1, MSG_PEEK);
+    if (!is_frozen) {
+       do_select(s->s, 1);
+       if (s->frozen_readable) {
+           char c;
+           p_recv(s->s, &c, 1, MSG_PEEK);
+       }
     }
     s->frozen_readable = 0;
 }