Fixed socket creation issue which happens on some IPv6 capable systems which don't have IPv6 enabled but return IPv6 family addresses with getaddrinfo. This is issue #48

This commit is contained in:
Mark Pizzolato 2013-04-23 12:27:16 -07:00
parent 02b3477d20
commit b04b7ae5b1
2 changed files with 24 additions and 4 deletions

View file

@ -136,6 +136,9 @@ static struct sock_errors {
{WSAECONNREFUSED, "Connection refused"},
{WSAEHOSTUNREACH, "No route to host"},
{WSAEADDRINUSE, "Address already in use"},
#if defined (WSAEAFNOSUPPORT)
{WSAEAFNOSUPPORT, "Address family not supported by protocol"},
#endif
{WSAEACCES, "Permission denied"},
{0, NULL}
};
@ -154,7 +157,12 @@ for (i=0; (sock_errors[i].text) && (sock_errors[i].value != err); i++)
if (sock_errors[i].value == err)
printf ("Sockets: %s error %d - %s\n", emsg, err, sock_errors[i].text);
else
#if defined(_WIN32)
printf ("Sockets: %s error %d\n", emsg, err);
#else
printf ("Sockets: %s error %d - %s\n", emsg, err, strerror(err));
#endif
if (s != INVALID_SOCKET)
sim_close_sock (s, flg);
return INVALID_SOCKET;
}
@ -692,8 +700,11 @@ int32 err;
newsock = socket (af, SOCK_STREAM, 0); /* create socket */
if (newsock == INVALID_SOCKET) { /* socket error? */
err = WSAGetLastError ();
printf ("Sockets: socket error %d\n", err);
return INVALID_SOCKET;
#if defined(WSAEAFNOSUPPORT)
if (err == WSAEAFNOSUPPORT) /* expected error, just return */
return newsock;
#endif
return sim_err_sock (newsock, "socket", 0); /* report error and return */
}
return newsock;
}
@ -752,6 +763,12 @@ if (newsock == INVALID_SOCKET) { /* socket error? */
preferred = preferred->ai_next;
goto retry;
}
#else
if ((preferred->ai_family == AF_INET6) &&
(preferred != result)) {
preferred = result;
goto retry;
}
#endif
p_freeaddrinfo(result);
return newsock;

View file

@ -66,6 +66,9 @@
#define WSAECONNREFUSED ECONNREFUSED
#define WSAEHOSTUNREACH EHOSTUNREACH
#define WSAEADDRINUSE EADDRINUSE
#if defined(EAFNOSUPPORT)
#define WSAEAFNOSUPPORT EAFNOSUPPORT
#endif
#define WSAEACCES EACCES
#define INVALID_SOCKET ((SOCKET)-1)
#define SOCKET_ERROR -1