Prefer IPv6 addrinfo structures when binding a listening port. Not all platforms (OSX) return IPv6 addrinfo blocks as the first entry in the list.
This commit is contained in:
parent
f1c6f1b2e4
commit
6dfef8a471
1 changed files with 16 additions and 3 deletions
19
sim_sock.c
19
sim_sock.c
|
@ -679,7 +679,7 @@ int32 sta;
|
||||||
char host[CBUFSIZE], port[CBUFSIZE];
|
char host[CBUFSIZE], port[CBUFSIZE];
|
||||||
t_stat r;
|
t_stat r;
|
||||||
struct addrinfo hints;
|
struct addrinfo hints;
|
||||||
struct addrinfo *result = NULL;
|
struct addrinfo *result = NULL, *preferred;
|
||||||
|
|
||||||
r = sim_parse_addr (hostport, host, sizeof(host), NULL, port, sizeof(port), NULL, NULL);
|
r = sim_parse_addr (hostport, host, sizeof(host), NULL, port, sizeof(port), NULL, NULL);
|
||||||
if (parse_status)
|
if (parse_status)
|
||||||
|
@ -697,13 +697,26 @@ if (p_getaddrinfo(host[0] ? host : NULL, port[0] ? port : NULL, &hints, &result)
|
||||||
*parse_status = SCPE_ARG;
|
*parse_status = SCPE_ARG;
|
||||||
return newsock;
|
return newsock;
|
||||||
}
|
}
|
||||||
newsock = sim_create_sock (result->ai_family); /* create socket */
|
preferred = result;
|
||||||
|
#ifdef IPV6_V6ONLY
|
||||||
|
/*
|
||||||
|
When we can create a dual stack socket, be sure to find the IPv6 addrinfo
|
||||||
|
to bind to.
|
||||||
|
*/
|
||||||
|
for (; preferred != NULL; preferred = preferred->ai_next) {
|
||||||
|
if (preferred->ai_family == AF_INET6)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (preferred == NULL)
|
||||||
|
preferred = result;
|
||||||
|
#endif
|
||||||
|
newsock = sim_create_sock (preferred->ai_family); /* create socket */
|
||||||
if (newsock == INVALID_SOCKET) { /* socket error? */
|
if (newsock == INVALID_SOCKET) { /* socket error? */
|
||||||
p_freeaddrinfo(result);
|
p_freeaddrinfo(result);
|
||||||
return newsock;
|
return newsock;
|
||||||
}
|
}
|
||||||
#ifdef IPV6_V6ONLY
|
#ifdef IPV6_V6ONLY
|
||||||
if (result->ai_family == AF_INET6) {
|
if (preferred->ai_family == AF_INET6) {
|
||||||
int off = FALSE;
|
int off = FALSE;
|
||||||
sta = setsockopt (newsock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&off, sizeof(off));
|
sta = setsockopt (newsock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&off, sizeof(off));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue