/*
* InspIRCd -- Internet Relay Chat Daemon
*
+ * Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
+ * Copyright (C) 2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2013, 2016 Adam <Adam@anope.org>
+ * Copyright (C) 2012-2016, 2018 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012 Robby <robby@chatbelgie.be>
* Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2007-2009 Craig Edwards <craigedwards@brainbox.cc>
- * Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
- * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2007-2009 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2007-2009 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2005, 2007-2010 Craig Edwards <brain@inspircd.org>
*
* 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 "socket.h"
#include "xline.h"
#include "iohook.h"
-#include "modules/server.h"
#include "resolvers.h"
#include "main.h"
, currmembid(0)
, broadcasteventprov(this, "event/server-broadcast")
, linkeventprov(this, "event/server-link")
+ , messageeventprov(this, "event/server-message")
, synceventprov(this, "event/server-sync")
, sslapi(this)
+ , servicetag(this)
, DNS(this, "DNS")
- , tagevprov(this, "event/messagetag")
+ , tagevprov(this)
, loopCall(false)
{
}
// If this fails then the IP sa will be AF_UNSPEC.
irc::sockets::aptosa(x->IPAddr, x->Port, sa);
}
-
+
/* Do we already have an IP? If so, no need to resolve it. */
if (sa.family() != AF_UNSPEC)
{
// Create a TreeServer object that will start connecting immediately in the background
TreeSocket* newsocket = new TreeSocket(x, y, sa);
- if (newsocket->GetFd() > -1)
- {
- /* Handled automatically on success */
- }
- else
+ if (!newsocket->HasFd())
{
ServerInstance->SNO->WriteToSnoMask('l', "CONNECT: Error connecting \002%s\002: %s.",
x->Name.c_str(), newsocket->getError().c_str());
if (IS_LOCAL(source))
{
CmdBuilder params(source, "INVITE");
- params.push_back(dest->uuid);
- params.push_back(channel->name);
+ params.push(dest->uuid);
+ params.push(channel->name);
params.push_int(channel->age);
- params.push_back(ConvToStr(expiry));
+ params.push(ConvToStr(expiry));
params.Broadcast();
}
}
{
CmdBuilder params(user, message_type);
params.push_tags(details.tags_out);
- params.push_back(d->uuid);
+ params.push(d->uuid);
params.push_last(details.text);
params.Unicast(d);
}
const std::string* serverglob = target.Get<std::string>();
CmdBuilder par(user, message_type);
par.push_tags(details.tags_out);
- par.push_back(*serverglob);
+ par.push(std::string("$") + *serverglob);
par.push_last(details.text);
par.Broadcast();
break;
{
CmdBuilder params(user, "TAGMSG");
params.push_tags(details.tags_out);
- params.push_back(d->uuid);
+ params.push(d->uuid);
params.Unicast(d);
}
break;
const std::string* serverglob = target.Get<std::string>();
CmdBuilder par(user, "TAGMSG");
par.push_tags(details.tags_out);
- par.push_back(*serverglob);
+ par.push(std::string("$") + *serverglob);
par.Broadcast();
break;
}
for(Extensible::ExtensibleStore::const_iterator i = user->GetExtList().begin(); i != user->GetExtList().end(); i++)
{
ExtensionItem* item = i->first;
- std::string value = item->serialize(FORMAT_NETWORK, user, i->second);
+ std::string value = item->ToNetwork(user, i->second);
if (!value.empty())
ServerInstance->PI->SendMetaData(user, item->name, value);
}
else
{
CmdBuilder params(memb->user, "IJOIN");
- params.push_back(memb->chan->name);
+ params.push(memb->chan->name);
params.push_int(memb->id);
if (!memb->modes.empty())
{
- params.push_back(ConvToStr(memb->chan->age));
- params.push_back(memb->modes);
+ params.push(ConvToStr(memb->chan->age));
+ params.push(memb->modes);
}
params.Broadcast();
}
if (IS_LOCAL(memb->user))
{
CmdBuilder params(memb->user, "PART");
- params.push_back(memb->chan->name);
+ params.push(memb->chan->name);
if (!partmessage.empty())
params.push_last(partmessage);
params.Broadcast();
{
// The nick TS is updated by the core, we don't do it
CmdBuilder params(user, "NICK");
- params.push_back(user->nick);
- params.push_back(ConvToStr(user->age));
+ params.push(user->nick);
+ params.push(ConvToStr(user->age));
params.Broadcast();
}
else if (!loopCall)
return;
CmdBuilder params(source, "KICK");
- params.push_back(memb->chan->name);
- params.push_back(memb->user->uuid);
+ params.push(memb->chan->name);
+ params.push(memb->user->uuid);
// If a remote user is being kicked by us then send the membership id in the kick too
if (!IS_LOCAL(memb->user))
params.push_int(memb->id);
if (!parameter.empty() && parameter[0] != '-')
{
CmdBuilder params(user ? user : ServerInstance->FakeClient, "REHASH");
- params.push_back(parameter);
+ params.push(parameter);
params.Forward(user ? TreeServer::Get(user)->GetRoute() : NULL);
}
}
{
TreeServer* server = i->second;
if (!server->IsRoot())
- FOREACH_MOD_CUSTOM(GetLinkEventProvider(), ServerProtocol::LinkEventListener, OnServerSplit, (server));
+ FOREACH_MOD_CUSTOM(GetLinkEventProvider(), ServerProtocol::LinkEventListener, OnServerSplit, (server, false));
}
return;
}
user = ServerInstance->FakeClient;
CmdBuilder params(user, "DELLINE");
- params.push_back(x->type);
- params.push_back(x->Displayable());
+ params.push(x->type);
+ params.push(x->Displayable());
params.Broadcast();
}
}
}
+void ModuleSpanningTree::OnShutdown(const std::string& reason)
+{
+ const TreeServer::ChildServers& children = Utils->TreeRoot->GetChildren();
+ while (!children.empty())
+ children.front()->SQuit(reason, true);
+}
+
CullResult ModuleSpanningTree::cull()
{
if (Utils)
{
ServerInstance->PI = &ServerInstance->DefaultProtocolInterface;
- Server* newsrv = new Server(ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc);
+ Server* newsrv = new Server(ServerInstance->Config->GetSID(), ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc);
SetLocalUsersServer(newsrv);
delete Utils;