diff options
| author | 2019-05-15 15:11:31 +0100 | |
|---|---|---|
| committer | 2019-05-15 15:26:55 +0100 | |
| commit | 1d5b18de82a90317291a10acb3b9132324c0e98b (patch) | |
| tree | be49087463332fcb617dd88567afce5cea6eb8c6 /src/modules/m_spanningtree/treesocket1.cpp | |
| parent | Merge branch 'insp3' into master. (diff) | |
| parent | Document the --disable-auto-extras configure option. (diff) | |
Merge branch 'insp3' into master.
Diffstat (limited to 'src/modules/m_spanningtree/treesocket1.cpp')
| -rw-r--r-- | src/modules/m_spanningtree/treesocket1.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index acd673be8..919b064fe 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -36,7 +36,7 @@ * BufferedSocket, we just call DoConnect() for most of the action, * and only do minor initialization tasks ourselves. */ -TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const std::string& ipaddr) +TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const irc::sockets::sockaddrs& dest) : linkID(link->Name), LinkState(CONNECTING), MyRoot(NULL), proto_version(0) , burstsent(false), age(ServerInstance->Time()) { @@ -45,7 +45,27 @@ TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const std::string& ipaddr) capab->ac = myac; capab->capab_phase = 0; - DoConnect(ipaddr, link->Port, link->Timeout, link->Bind); + irc::sockets::sockaddrs bind; + memset(&bind, 0, sizeof(bind)); + if (!link->Bind.empty() && (dest.family() == AF_INET || dest.family() == AF_INET6)) + { + if (!irc::sockets::aptosa(link->Bind, 0, bind)) + { + state = I_ERROR; + SetError("Bind address '" + link->Bind + "' is not a valid IPv4 or IPv6 address"); + TreeSocket::OnError(I_ERR_BIND); + return; + } + else if (bind.family() != dest.family()) + { + state = I_ERROR; + SetError("Bind address '" + bind.addr() + "' is not the same address family as destination address '" + dest.addr() + "'"); + TreeSocket::OnError(I_ERR_BIND); + return; + } + } + + DoConnect(dest, bind, link->Timeout); Utils->timeoutlist[this] = std::pair<std::string, unsigned int>(linkID, link->Timeout); SendCapabilities(1); } @@ -123,7 +143,7 @@ void TreeSocket::OnConnected() static_cast<IOHookProvider*>(prov)->OnConnect(this); } - ServerInstance->SNO.WriteGlobalSno('l', "Connection to \2%s\2[%s] started.", linkID.c_str(), + ServerInstance->SNO.WriteGlobalSno('l', "Connection to \002%s\002[%s] started.", linkID.c_str(), (capab->link->HiddenFromStats ? "<hidden>" : capab->link->IPAddr.c_str())); this->SendCapabilities(1); } |
