/*
* 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
#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);
*/
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)
{
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);
}