X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/7555d6a50b05d96de39b5e95cf11a8f05f0c4fd9..8c1835c0f951be43da1fb19405c7ff958a9b8661:/windows/winnet.c?ds=sidebyside diff --git a/windows/winnet.c b/windows/winnet.c index f6f7bab0..715c492f 100644 --- a/windows/winnet.c +++ b/windows/winnet.c @@ -251,8 +251,10 @@ void sk_cleanup(void) p_WSACleanup(); if (winsock_module) FreeLibrary(winsock_module); +#ifndef NO_IPV6 if (wship6_module) FreeLibrary(wship6_module); +#endif } char *winsock_error_string(int error) @@ -351,6 +353,9 @@ 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_family = AF_UNSPEC; *realhost = '\0'; @@ -363,6 +368,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; @@ -401,17 +407,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 @@ -454,6 +453,10 @@ 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->naddresses = 0; strncpy(ret->hostname, host, lenof(ret->hostname)); ret->hostname[lenof(ret->hostname)-1] = '\0'; return ret; @@ -563,10 +566,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 */ @@ -1507,9 +1518,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; }