diff -up openssl-1.0.0c/apps/s_socket.c.ipv6listen openssl-1.0.0c/apps/s_socket.c --- openssl-1.0.0c/apps/s_socket.c.ipv6listen 2011-01-24 16:44:18.000000000 +0100 +++ openssl-1.0.0c/apps/s_socket.c 2011-01-24 16:56:25.000000000 +0100 @@ -335,15 +335,16 @@ int do_server(char *port, int type, int static int init_server(int *sock, char *port, int type) { - struct addrinfo *res, *res0, hints; + struct addrinfo *res, *res0 = NULL, hints; char * failed_call = NULL; - char port_name[8]; int s; int e; if (!ssl_sock_init()) return(0); memset(&hints, '\0', sizeof(hints)); + hints.ai_family = AF_INET6; +tryipv4: hints.ai_socktype = type; hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; @@ -365,6 +366,12 @@ static int init_server(int *sock, char * failed_call = "socket"; goto nextres; } + if (hints.ai_family == AF_INET6) + { + int j = 0; + setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, + (void *) &j, sizeof j); + } #if defined SOL_SOCKET && defined SO_REUSEADDR { int j = 1; @@ -392,9 +399,19 @@ nextres: close(s); res = res->ai_next; } - freeaddrinfo(res0); + if (res0) + freeaddrinfo(res0); - if (s == INVALID_SOCKET) { perror("socket"); return(0); } + if (s == INVALID_SOCKET) + { + if (hints.ai_family == AF_INET6) + { + hints.ai_family = AF_INET; + goto tryipv4; + } + perror("socket"); + return(0); + } perror(failed_call); return(0);