]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treesocket1.cpp
Fix some regressions in sending tags between servers.
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treesocket1.cpp
index f9dccf7ce97ae3bd02f4afe17da5404ec1cfb512..2e08dea630e66a8b138fbdc3e279b1e514ed3a8b 100644 (file)
@@ -24,7 +24,6 @@
 #include "iohook.h"
 
 #include "main.h"
-#include "modules/spanningtree.h"
 #include "utils.h"
 #include "treeserver.h"
 #include "link.h"
@@ -36,7 +35,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 +44,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 +142,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);
        }
@@ -145,7 +164,7 @@ void TreeSocket::SendError(const std::string &errormessage)
        SetError(errormessage);
 }
 
-CmdResult CommandSQuit::HandleServer(TreeServer* server, std::vector<std::string>& params)
+CmdResult CommandSQuit::HandleServer(TreeServer* server, CommandBase::Params& params)
 {
        TreeServer* quitting = Utils->FindServer(params[0]);
        if (!quitting)