Allow listeners to be able to listen on unavailable addresses.

This commit is contained in:
Peter Powell 2016-11-12 16:04:16 +00:00
parent 1457c8738c
commit 0b8a13ab51
2 changed files with 20 additions and 0 deletions

View File

@ -168,6 +168,12 @@
# To change it on a running bind, you'll have to comment it out,
# rehash, comment it in and rehash again.
defer="0"
# free: When this is enabled the listener will be created regardless of
# whether the interface that provides the bind address is available. This
# is useful for if you are starting InspIRCd on boot when the server may
# not have brought the network interfaces up yet.
free="no"
>
<bind address="" port="6660-6669" type="clients">

View File

@ -54,6 +54,20 @@ ListenSocket::ListenSocket(ConfigTag* tag, const irc::sockets::sockaddrs& bind_t
}
#endif
if (tag->getBool("free"))
{
socklen_t enable = 1;
#if defined IP_FREEBIND // Linux 2.4+
setsockopt(fd, SOL_IP, IP_FREEBIND, &enable, sizeof(enable));
#elif defined IP_BINDANY // FreeBSD
setsockopt(fd, IPPROTO_IP, IP_BINDANY, &enable, sizeof(enable));
#elif defined SO_BINDANY // NetBSD/OpenBSD
setsockopt(fd, SOL_SOCKET, SO_BINDANY, &enable, sizeof(enable));
#else
(void)enable;
#endif
}
SocketEngine::SetReuse(fd);
int rv = SocketEngine::Bind(this->fd, bind_to);
if (rv >= 0)