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