address_family == ADDRTYPE_IPV6 ? AF_INET6 :
#endif
AF_UNSPEC);
+#ifndef NO_IPV6
+ ret->ai = ret->ais = NULL;
+#endif
ret_family = AF_UNSPEC;
*realhost = '\0';
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;
(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
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;
} 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 */
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;
}