* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2010 InspIRCd Development Team
* See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
#include "socket.h"
#include "inspircd.h"
#include "xline.h"
-#include "../transport.h"
#include "utils.h"
-#include "handshaketimer.h"
/*
* The server list in InspIRCd is maintained as two structures
*/
enum ServerState { CONNECTING, WAIT_AUTH_1, WAIT_AUTH_2, CONNECTED };
+struct CapabData
+{
+ std::string ModuleList; /* Required module list of other server from CAPAB */
+ std::string OptModuleList; /* Optional module list of other server from CAPAB */
+ std::string ChanModes;
+ std::string UserModes;
+ std::map<std::string,std::string> CapKeys; /* CAPAB keys from other server */
+ std::string ourchallenge; /* Challenge sent for challenge/response */
+ std::string theirchallenge; /* Challenge recv for challenge/response */
+ std::string OutboundPass; /* Outbound password */
+ int capab_phase; /* Have sent CAPAB already */
+ bool auth_fingerprint; /* Did we auth using SSL fingerprint */
+ bool auth_challenge; /* Did we auth using challenge/response */
+};
+
/** Every SERVER connection inbound or outbound is represented by
* an object of type TreeSocket.
* TreeSockets, being inherited from BufferedSocket, can be tied into
std::string InboundServerName; /* Server name sent to us by other side */
std::string InboundDescription; /* Server description (GECOS) sent to us by the other side */
std::string InboundSID; /* Server ID sent to us by the other side */
+ std::string IP;
+ CapabData* capab;
int num_lost_users; /* Users lost in split */
int num_lost_servers; /* Servers lost in split */
time_t NextPing; /* Time when we are due to ping this server */
bool LastPingWasGood; /* Responded to last ping we sent? */
- std::string IP;
- std::string ModuleList; /* Required module list of other server from CAPAB */
- std::string OptModuleList; /* Optional module list of other server from CAPAB */
- std::map<std::string,std::string> CapKeys; /* CAPAB keys from other server */
- std::string ourchallenge; /* Challenge sent for challenge/response */
- std::string theirchallenge; /* Challenge recv for challenge/response */
- std::string OutboundPass; /* Outbound password */
- int capab_phase; /* Have sent CAPAB already */
- bool auth_fingerprint; /* Did we auth using SSL fingerprint */
- bool auth_challenge; /* Did we auth using challenge/response */
int proto_version; /* Remote protocol version */
public:
- HandshakeTimer* hstimer; /* Handshake timer, needed to work around I/O hook buffering */
- Autoconnect* myautoconnect; /* Autoconnect used to cause this connection, if any */
+ reference<Autoconnect> myautoconnect; /* Autoconnect used to cause this connection, if any */
time_t age;
/** Because most of the I/O gubbins are encapsulated within
* most of the action, and append a few of our own values
* to it.
*/
- TreeSocket(SpanningTreeUtilities* Util, std::string host, int port, unsigned long maxtime, const std::string &ServerName, const std::string &bindto, Autoconnect* myac, Module* HookMod = NULL);
+ TreeSocket(SpanningTreeUtilities* Util, const std::string& host, int port, unsigned long maxtime, const std::string &ServerName, const std::string &bindto, Autoconnect* myac, const std::string& Hook);
/** When a listening socket gives us a new file descriptor,
* we must associate it with a socket without creating a new
* connection. This constructor is used for this purpose.
*/
- TreeSocket(SpanningTreeUtilities* Util, int newfd, char* ip, Autoconnect* myac, Module* HookMod = NULL);
+ TreeSocket(SpanningTreeUtilities* Util, int newfd, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
/** Get link state
*/
*/
void CleanNegotiationInfo();
+ CullResult cull();
/** Destructor
*/
~TreeSocket();
/** Add modules to VF_COMMON list for backwards compatability */
void CompatAddModules(std::vector<std::string>& modlist);
- /* Check a comma seperated list for an item */
- bool HasItem(const std::string &list, const std::string &item);
-
- /* Isolate and return the elements that are different between two comma seperated lists */
- std::string ListDifference(const std::string &one, const std::string &two);
+ /* Isolate and return the elements that are different between two lists */
+ void ListDifference(const std::string &one, const std::string &two, char sep,
+ std::string& mleft, std::string& mright);
bool Capab(const parameterlist ¶ms);
void Squit(TreeServer* Current, const std::string &reason);
/** FMODE command - server mode with timestamp checks */
- bool ForceMode(const std::string &source, parameterlist ¶ms);
+ void ForceMode(User* who, parameterlist ¶ms);
/** FTOPIC command */
bool ForceTopic(const std::string &source, parameterlist ¶ms);
/** FJOIN, similar to TS6 SJOIN, but not quite. */
- bool ForceJoin(const std::string &source, parameterlist ¶ms);
+ void ForceJoin(User* who, parameterlist ¶ms);
/* Used on nick collision ... XXX ugly function HACK */
int DoCollision(User *u, time_t remotets, const std::string &remoteident, const std::string &remoteip, const std::string &remoteuid);
void WriteLine(std::string line);
/** Handle ERROR command */
- bool Error(parameterlist ¶ms);
+ void Error(parameterlist ¶ms);
- /** remote MOTD. leet, huh? */
+ /** remote MOTD. */
bool Motd(const std::string &prefix, parameterlist ¶ms);
- /** remote ADMIN. leet, huh? */
+ /** remote ADMIN. */
bool Admin(const std::string &prefix, parameterlist ¶ms);
- /** Remote MODULES */
- bool Modules(const std::string &prefix, parameterlist ¶ms);
-
bool Stats(const std::string &prefix, parameterlist ¶ms);
/** Because the core won't let users or even SERVERS set +o,
/** Remote AWAY */
bool Away(const std::string &prefix, parameterlist ¶ms);
- /** Because Andy insists that services-compatible servers must
- * implement SVSNICK and SVSJOIN, that's exactly what we do :p
- */
- bool SVSNick(const std::string &prefix, parameterlist ¶ms);
-
/** SAVE to resolve nick collisions without killing */
bool ForceNick(const std::string &prefix, parameterlist ¶ms);
- /** PRIVMSG or NOTICE with server origin ONLY
- */
- bool ServerMessage(const std::string &messagetype, const std::string &prefix, parameterlist ¶ms, const std::string &sourceserv);
-
/** ENCAP command
*/
- bool Encap(const std::string &prefix, parameterlist ¶ms);
+ void Encap(User* who, parameterlist ¶ms);
/** OPERQUIT command
*/
bool OperQuit(const std::string &prefix, parameterlist ¶ms);
- /** SVSJOIN
- */
- bool ServiceJoin(const std::string &prefix, parameterlist ¶ms);
-
- /** SVSPART
- */
- bool ServicePart(const std::string &prefix, parameterlist ¶ms);
-
/** KILL
*/
bool RemoteKill(const std::string &prefix, parameterlist ¶ms);
/** Remove all modes from a channel, including statusmodes (+qaovh etc), simplemodes, parameter modes.
* This does not update the timestamp of the target channel, this must be done seperately.
*/
- bool RemoveStatus(const std::string &prefix, parameterlist ¶ms);
+ void RemoveStatus(User* source, parameterlist ¶ms);
/** <- (remote) <- SERVER
*/
*/
bool Inbound_Server(parameterlist ¶ms);
- /** Handle netsplit
+ /** Handle IRC line split
*/
- void Split(const std::string &line, parameterlist &n);
+ void Split(const std::string &line, std::string& prefix, std::string& command, parameterlist ¶ms);
/** Process complete line from buffer
*/
- bool ProcessLine(std::string &line);
+ void ProcessLine(std::string &line);
+
+ void ProcessConnectedLine(std::string& prefix, std::string& command, parameterlist& params);
/** Get this server's name
*/