* | 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 */
reference<Autoconnect> myautoconnect; /* Autoconnect used to cause this connection, if any */
time_t age;
* 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();
- bool cull();
+ 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. */
bool Motd(const std::string &prefix, parameterlist ¶ms);
/** 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);
/** 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
*/