Skip to content

Commit

Permalink
Fix disabling IPV6_V6ONLY on sockets, issue #511
Browse files Browse the repository at this point in the history
  • Loading branch information
Adam- authored and attilamolnar committed May 2, 2013
1 parent 51c302c commit 9bee202
Showing 1 changed file with 9 additions and 7 deletions.
16 changes: 9 additions & 7 deletions src/listensocket.cpp
Expand Up @@ -33,11 +33,6 @@ ListenSocket::ListenSocket(ConfigTag* tag, const irc::sockets::sockaddrs& bind_t
if (this->fd == -1)
return;

ServerInstance->SE->SetReuse(fd);
int rv = ServerInstance->SE->Bind(this->fd, bind_to);
if (rv >= 0)
rv = ServerInstance->SE->Listen(this->fd, ServerInstance->Config->MaxConn);

#ifdef IPV6_V6ONLY
/* This OS supports IPv6 sockets that can also listen for IPv4
* connections. If our address is "*" or empty, enable both v4 and v6 to
Expand All @@ -48,12 +43,19 @@ ListenSocket::ListenSocket(ConfigTag* tag, const irc::sockets::sockaddrs& bind_t
if (bind_to.sa.sa_family == AF_INET6)
{
std::string addr = tag->getString("address");
const char enable = (addr.empty() || addr == "*") ? 0 : 1;
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &enable, sizeof(enable));
/* This must be >= sizeof(DWORD) on Windows */
const int enable = (addr.empty() || addr == "*") ? 0 : 1;
/* This must be before bind() */
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<const char *>(&enable), sizeof(enable));
// errors ignored intentionally
}
#endif

ServerInstance->SE->SetReuse(fd);
int rv = ServerInstance->SE->Bind(this->fd, bind_to);
if (rv >= 0)
rv = ServerInstance->SE->Listen(this->fd, ServerInstance->Config->MaxConn);

if (rv < 0)
{
int errstore = errno;
Expand Down

0 comments on commit 9bee202

Please sign in to comment.