From d8bc4631788ebc58c8a505ac1411486cf58fac84 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Fri, 24 May 2019 22:00:30 +0200 Subject: [PATCH] Default to IPv4 if IPv6 not supported --- src/main.cpp | 5 +++++ src/utils/net.c | 10 ++++++++++ src/utils/net.h | 1 + 3 files changed, 16 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 98fe66322..0f133dfa3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -939,6 +939,11 @@ int main(int argc, char *argv[]) audio_host = requested_receiver; } + if (!is_ipv6_supported()) { + log_msg(LOG_LEVEL_WARNING, "IPv6 support missing, setting IPv4-only mode.\n"); + force_ip_version = 4; + } + if (!set_output_buffering()) { log_msg(LOG_LEVEL_WARNING, "Cannot set console output buffering!\n"); } diff --git a/src/utils/net.c b/src/utils/net.c index 3c853e0c6..63888e95e 100644 --- a/src/utils/net.c +++ b/src/utils/net.c @@ -297,3 +297,13 @@ bool get_local_addresses(struct sockaddr_storage *addrs, size_t *len, int ip_ver #endif } +bool is_ipv6_supported(void) +{ + int fd = socket(AF_INET6, SOCK_DGRAM, 0); + if (fd == INVALID_SOCKET && errno == EAFNOSUPPORT) { + return false; + } + CLOSESOCKET(fd); + return true; +} + diff --git a/src/utils/net.h b/src/utils/net.h index 720b1befa..826e69ffa 100644 --- a/src/utils/net.h +++ b/src/utils/net.h @@ -48,6 +48,7 @@ bool is_addr_loopback(struct sockaddr *sa); bool is_host_loopback(const char *hostname); uint16_t socket_get_recv_port(int fd); bool get_local_addresses(struct sockaddr_storage *addrs, size_t *len, int ip_version); +bool is_ipv6_supported(void); #ifdef WIN32 #define CLOSESOCKET closesocket