diff options
author | Max Kellermann <max@duempel.org> | 2013-11-04 23:36:00 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-11-04 23:36:02 +0100 |
commit | 7bca61f5bbacfdf19c9e143f3829aa157d22e003 (patch) | |
tree | 1094473c2087382f059b65878fd548307ab9eacf | |
parent | ecf12a60e8f82df59b1cf1fcbab1609fb2dfd7f4 (diff) |
event/ServerSocket: don't abort if IPv6 is not available
First check if an IPv6 socket can be created.
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/event/ServerSocket.cxx | 20 |
2 files changed, 20 insertions, 1 deletions
@@ -4,6 +4,7 @@ ver 0.18.1 (2013/11/??) * networking: - log UNIX domain path names instead of "localhost" - open listener sockets in the order they were configured + - don't abort if IPv6 is not available * filter: - autoconvert: fix "volume_normalization" with mp3 files * add missing files to source tarball diff --git a/src/event/ServerSocket.cxx b/src/event/ServerSocket.cxx index e1fbb34ff..781d29181 100644 --- a/src/event/ServerSocket.cxx +++ b/src/event/ServerSocket.cxx @@ -339,6 +339,7 @@ ServerSocket::AddPortIPv4(unsigned port) } #ifdef HAVE_IPV6 + inline void ServerSocket::AddPortIPv6(unsigned port) { @@ -349,6 +350,22 @@ ServerSocket::AddPortIPv6(unsigned port) AddAddress((const sockaddr &)sin, sizeof(sin)); } + +/** + * Is IPv6 supported by the kernel? + */ +gcc_pure +static bool +SupportsIPv6() +{ + int fd = socket(AF_INET6, SOCK_STREAM, 0); + if (fd < 0) + return false; + + close(fd); + return true; +} + #endif /* HAVE_IPV6 */ #endif /* HAVE_TCP */ @@ -363,7 +380,8 @@ ServerSocket::AddPort(unsigned port, Error &error) } #ifdef HAVE_IPV6 - AddPortIPv6(port); + if (SupportsIPv6()) + AddPortIPv6(port); #endif AddPortIPv4(port); |