From b04b7ae5b1c615a7fdc7e2b5db75814d12fc311a Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 23 Apr 2013 12:27:16 -0700 Subject: [PATCH] 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 --- sim_sock.c | 25 +++++++++++++++++++++---- sim_sock.h | 3 +++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/sim_sock.c b/sim_sock.c index 2d826770..1aa6d0e9 100644 --- a/sim_sock.c +++ b/sim_sock.c @@ -135,7 +135,10 @@ static struct sock_errors { {WSAECONNRESET, "Connection reset by peer"}, {WSAECONNREFUSED, "Connection refused"}, {WSAEHOSTUNREACH, "No route to host"}, - {WSAEADDRINUSE, "Address already in use "}, + {WSAEADDRINUSE, "Address already in use"}, +#if defined (WSAEAFNOSUPPORT) + {WSAEAFNOSUPPORT, "Address family not supported by protocol"}, +#endif {WSAEACCES, "Permission denied"}, {0, NULL} }; @@ -154,8 +157,13 @@ 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); -sim_close_sock (s, flg); +#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; diff --git a/sim_sock.h b/sim_sock.h index 17c29afd..e6fcfb50 100644 --- a/sim_sock.h +++ b/sim_sock.h @@ -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