]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treesocket1.cpp
Add a subclass of IOHookProvider for SSL modules.
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treesocket1.cpp
index fd20d04c4568efaa31ee5f6596fa73dba91443e9..27888d74c29d4ac18d7d65f8c489f1be6a3ebfde 100644 (file)
@@ -1,10 +1,13 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2007 Craig Edwards <craigedwards@brainbox.cc>
- *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2007-2008, 2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2007-2008 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
@@ -24,7 +27,6 @@
 #include "iohook.h"
 
 #include "main.h"
-#include "modules/server.h"
 #include "utils.h"
 #include "treeserver.h"
 #include "link.h"
  * and only do minor initialization tasks ourselves.
  */
 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())
+       : linkID(link->Name)
+       , LinkState(CONNECTING)
+       , MyRoot(NULL)
+       , proto_version(0)
+       , burstsent(false)
+       , age(ServerInstance->Time())
 {
        capab = new CapabData;
        capab->link = link;
        capab->ac = myac;
        capab->capab_phase = 0;
+       capab->remotesa = dest;
 
        irc::sockets::sockaddrs bind;
        memset(&bind, 0, sizeof(bind));
-       if ((dest.family() == AF_INET || dest.family() == AF_INET6) && !irc::sockets::aptosa(link->Bind, 0, bind))
+       if (!link->Bind.empty() && (dest.family() == AF_INET || dest.family() == AF_INET6))
        {
-               state = I_ERROR;
-               SetError("Bind address '" + link->Bind + "' is not an valid IPv4 or IPv6 address");
-               TreeSocket::OnError(I_ERR_BIND);
-               return;
+               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);
@@ -64,11 +81,16 @@ TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const irc::sockets::sockad
  */
 TreeSocket::TreeSocket(int newfd, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server)
        : BufferedSocket(newfd)
-       , linkID("inbound from " + client->addr()), LinkState(WAIT_AUTH_1), MyRoot(NULL), proto_version(0)
-       , burstsent(false), age(ServerInstance->Time())
+       , linkID("inbound from " + client->addr())
+       , LinkState(WAIT_AUTH_1)
+       , MyRoot(NULL)
+       , proto_version(0)
+       , burstsent(false)
+       , age(ServerInstance->Time())
 {
        capab = new CapabData;
        capab->capab_phase = 0;
+       capab->remotesa = *client;
 
        for (ListenSocket::IOHookProvList::iterator i = via->iohookprovs.begin(); i != via->iohookprovs.end(); ++i)
        {
@@ -133,7 +155,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);
        }