From 30a07c2e8d23cbef24b841e7c2ad15ae9e80aa41 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 30 Apr 2018 17:09:36 -0700 Subject: [PATCH] net: Support local ipv6 formatting. Let's hope no platform has issues with inet_ntop... --- ext/native/file/fd_util.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ext/native/file/fd_util.cpp b/ext/native/file/fd_util.cpp index 8663d44760..b61703c263 100644 --- a/ext/native/file/fd_util.cpp +++ b/ext/native/file/fd_util.cpp @@ -133,11 +133,22 @@ void SetNonBlocking(int sock, bool non_blocking) { } std::string GetLocalIP(int sock) { - struct sockaddr_in server_addr; + union { + struct sockaddr sa; + struct sockaddr_in ipv4; + struct sockaddr_in6 ipv6; + } server_addr; memset(&server_addr, 0, sizeof(server_addr)); socklen_t len = sizeof(server_addr); if (getsockname(sock, (struct sockaddr *)&server_addr, &len) == 0) { - char *result = inet_ntoa(*(in_addr *)&server_addr.sin_addr); + char temp[64]; + void *addr; + if (server_addr.sa.sa_family == AF_INET6) { + addr = &server_addr.ipv6.sin6_addr; + } else { + addr = &server_addr.ipv4.sin_addr; + } + const char *result = inet_ntop(server_addr.sa.sa_family, addr, temp, sizeof(temp)); if (result) { return result; }