diff options
-rw-r--r-- | src/gallium/auxiliary/util/u_network.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/gallium/auxiliary/util/u_network.c b/src/gallium/auxiliary/util/u_network.c index 45b3691f901..a7a4d28abcd 100644 --- a/src/gallium/auxiliary/util/u_network.c +++ b/src/gallium/auxiliary/util/u_network.c @@ -3,9 +3,11 @@ #include "util/u_network.h" #include "util/u_debug.h" +#include <stdio.h> #if defined(PIPE_SUBSYSTEM_WINDOWS_USER) # include <winsock2.h> # include <windows.h> +# include <ws2tcpip.h> #elif defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) || \ defined(PIPE_OS_APPLE) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS) # include <sys/socket.h> @@ -110,28 +112,35 @@ int u_socket_connect(const char *hostname, uint16_t port) { #if defined(PIPE_HAVE_SOCKETS) - int s; - struct sockaddr_in sa; - struct hostent *host = NULL; + int s, r; + struct addrinfo hints, *addr; + char portString[20]; - memset(&sa, 0, sizeof(struct sockaddr_in)); - host = gethostbyname(hostname); - if (!host) - return -1; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version + hints.ai_socktype = SOCK_STREAM; - memcpy((char *)&sa.sin_addr,host->h_addr_list[0],host->h_length); - sa.sin_family= host->h_addrtype; - sa.sin_port = htons(port); + snprintf(portString, sizeof(portString), "%d", port); - s = socket(host->h_addrtype, SOCK_STREAM, IPPROTO_TCP); - if (s < 0) + r = getaddrinfo(hostname, portString, NULL, &addr); + if (r != 0) { return -1; + } - if (connect(s, (struct sockaddr *)&sa, sizeof(sa))) { + s = socket(addr->ai_family, SOCK_STREAM, IPPROTO_TCP); + if (s < 0) { + freeaddrinfo(addr); + return -1; + } + + if (connect(s, addr->ai_addr, (int) addr->ai_addrlen)) { u_socket_close(s); + freeaddrinfo(addr); return -1; } + freeaddrinfo(addr); + return s; #else assert(0); |