X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Finspircd.h;h=1b88ca0b72cce49b264cea77bfb483b4ace723f2;hb=8c2d96013084de950e3a63be4ae6ed626c4093ab;hp=67408ad6e195d52ee978297fdcf4cc2d3f0349f9;hpb=18b1ec50803714aa836a32a42806b7a8c367d9fd;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/inspircd.h b/include/inspircd.h index 67408ad6e..1b88ca0b7 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * InspIRCd: (C) 2002-2008 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -25,22 +25,38 @@ #undef ERROR #endif +#ifdef __GNUC__ +#define CUSTOM_PRINTF(STRING, FIRST) __attribute__((format(printf, STRING, FIRST))) +#else +#define CUSTOM_PRINTF(STRING, FIRST) +#endif + +// Required system headers. #include -#include -#include -#include +#include + #include "inspircd_config.h" #include "uid.h" #include "users.h" #include "channels.h" +#include "timer.h" +#include "hashcomp.h" +#include "typedefs.h" +#include "logger.h" +#include "usermanager.h" #include "socket.h" +#include "ctables.h" +#include "command_parse.h" #include "mode.h" #include "socketengine.h" -#include "command_parse.h" #include "snomasks.h" #include "cull_list.h" #include "filelogger.h" #include "caller.h" +#include "modules.h" +#include "configreader.h" +#include "inspstring.h" +#include "protocol.h" /** * Used to define the maximum number of parameters a command may have. @@ -56,14 +72,6 @@ */ #define ETIREDHAMSTERS EAGAIN -/** Delete a pointer, and NULL its value - */ -template inline void DELETE(T* x) -{ - delete x; - x = NULL; -} - /** Template function to convert any input type to std::string */ template inline std::string ConvNumeric(const T &in) @@ -219,9 +227,6 @@ class serverstats : public classbase /** A list of failed port bindings, used for informational purposes on startup */ typedef std::vector > FailedPortList; -/** A list of ip addresses cross referenced against clone counts */ -typedef std::map clonemap; - class InspIRCd; DEFINE_HANDLER1(ProcessUserHandler, void, User*); @@ -229,9 +234,30 @@ DEFINE_HANDLER1(IsNickHandler, bool, const char*); DEFINE_HANDLER1(IsIdentHandler, bool, const char*); DEFINE_HANDLER1(FindDescriptorHandler, User*, int); DEFINE_HANDLER1(FloodQuitUserHandler, void, User*); +DEFINE_HANDLER1(IsChannelHandler, bool, const char*); +DEFINE_HANDLER1(IsSIDHandler, bool, const std::string&); +DEFINE_HANDLER1(RehashHandler, void, const std::string&); /* Forward declaration - required */ class XLineManager; +class BanCacheManager; + +class CoreExport ConfigReaderThread : public Thread +{ + InspIRCd* ServerInstance; + bool do_bail; + User* TheUser; + public: + ConfigReaderThread(InspIRCd* Instance, bool bail, User* user) : Thread(), ServerInstance(Instance), do_bail(bail), TheUser(user) + { + } + + virtual ~ConfigReaderThread() + { + } + + void Run(); +}; /** The main class of the irc server. * This class contains instances of all the other classes @@ -267,9 +293,9 @@ class CoreExport InspIRCd : public classbase */ void DoSocketTimeouts(time_t TIME); - /** Sets up UID subsystem + /** Increments the current UID by one. */ - void InitialiseUID(); + void IncrementUID(int pos); /** Perform background user events such as PING checks */ @@ -299,21 +325,12 @@ class CoreExport InspIRCd : public classbase /** Used when connecting clients */ - insp_sockaddr client, server; + irc::sockets::insp_sockaddr client, server; /** Used when connecting clients */ socklen_t length; - /** Nonblocking file writer - */ - FileLogger* Logger; - - /** Time offset in seconds - * This offset is added to all calls to Time(). Use SetTimeDelta() to update - */ - int time_delta; - #ifdef WIN32 IPC* WindowsIPC; #endif @@ -331,6 +348,9 @@ class CoreExport InspIRCd : public classbase IsIdentHandler HandleIsIdent; FindDescriptorHandler HandleFindDescriptor; FloodQuitUserHandler HandleFloodQuitUser; + IsChannelHandler HandleIsChannel; + IsSIDHandler HandleIsSID; + RehashHandler HandleRehash; /** BufferedSocket classes pending deletion after being closed. * We don't delete these immediately as this may cause a segmentation fault. @@ -367,11 +387,6 @@ class CoreExport InspIRCd : public classbase */ void BuildISupport(); - /** Number of unregistered users online right now. - * (Unregistered means before USER/NICK/dns) - */ - int unregistered_count; - /** List of server names we've seen. */ servernamelist servernames; @@ -395,12 +410,29 @@ class CoreExport InspIRCd : public classbase /** Socket engine, handles socket activity events */ SocketEngine* SE; + + /** Thread engine, Handles threading where required + */ + ThreadEngine* Threads; + + /** The thread/class used to read config files in REHASH and on startup + */ + ConfigReaderThread* ConfigThread; + + /** LogManager handles logging. + */ + LogManager *Logs; /** ModuleManager contains everything related to loading/unloading * modules. */ ModuleManager* Modules; + /** BanCacheManager is used to speed up checking of restrictions on connection + * to the IRCd. + */ + BanCacheManager *BanCache; + /** Stats class, holds miscellaneous stats counters */ serverstats* stats; @@ -414,35 +446,6 @@ class CoreExport InspIRCd : public classbase */ SnomaskManager* SNO; - /** Client list, a hash_map containing all clients, local and remote - */ - user_hash* clientlist; - - /** Client list stored by UUID. Contains all clients, and is updated - * automatically by the constructor and destructor of User. - */ - user_hash* uuidlist; - - /** Channel list, a hash_map containing all channels - */ - chan_hash* chanlist; - - /** Local client list, a vector containing only local clients - */ - std::vector local_users; - - /** Oper list, a vector containing all local and remote opered users - */ - std::list all_opers; - - /** Map of local ip addresses for clone counting - */ - clonemap local_clones; - - /** Map of global ip addresses for clone counting - */ - clonemap global_clones; - /** DNS class, provides resolver facilities to the core and modules */ DNS* Res; @@ -455,44 +458,28 @@ class CoreExport InspIRCd : public classbase */ XLineManager* XLines; - /** Set to the current signal recieved + /** User manager. Various methods and data associated with users. */ - int s_signal; + UserManager *Users; - /** Get the current time - * Because this only calls time() once every time around the mainloop, - * it is much faster than calling time() directly. - * @param delta True to use the delta as an offset, false otherwise - * @return The current time as an epoch value (time_t) + /** Channel list, a hash_map containing all channels XXX move to channel manager class */ - time_t Time(bool delta = false); + chan_hash* chanlist; - /** Set the time offset in seconds - * This offset is added to Time() to offset the system time by the specified - * number of seconds. - * @param delta The number of seconds to offset - * @return The old time delta + /** Set to the current signal recieved */ - int SetTimeDelta(int delta); + int s_signal; - /** Add a user to the local clone map - * @param user The user to add + /** Protocol interface, overridden by server protocol modules */ - void AddLocalClone(User* user); + ProtocolInterface* PI; - /** Add a user to the global clone map - * @param user The user to add - */ - void AddGlobalClone(User* user); - - /** Number of users with a certain mode set on them - */ - int ModeCount(const char mode); - - /** Get the time offset in seconds - * @return The current time delta (in seconds) + /** Get the current time + * Because this only calls time() once every time around the mainloop, + * it is much faster than calling time() directly. + * @return The current time as an epoch value (time_t) */ - int GetTimeDelta(); + time_t Time(); /** Process a user whos socket has been flagged as active * @param cu The user to process @@ -514,7 +501,7 @@ class CoreExport InspIRCd : public classbase * @param addr The address to bind to (IP only) * @return True if the port was bound successfully */ - bool BindSocket(int sockfd, int port, char* addr, bool dolisten = true); + bool BindSocket(int sockfd, int port, const char* addr, bool dolisten = true); /** Adds a server name to the list of servers we've seen * @param The servername to add @@ -543,17 +530,6 @@ class CoreExport InspIRCd : public classbase */ std::string GetServerDescription(const char* servername); - /** Write text to all opers connected to this server - * @param text The text format string - * @param ... Format args - */ - void WriteOpers(const char* text, ...); - - /** Write text to all opers connected to this server - * @param text The text to send - */ - void WriteOpers(const std::string &text); - /** Find a user in the nick hash. * If the user cant be found in the nick hash check the uuid hash * @param nick The nickname to find @@ -605,41 +581,20 @@ class CoreExport InspIRCd : public classbase */ bool OpenLog(char** argv, int argc); - /** Close the currently open log file - */ - void CloseLog(); - - /** Send a server notice to all local users - * @param text The text format string to send - * @param ... The format arguments - */ - void ServerNoticeAll(char* text, ...); - - /** Send a server message (PRIVMSG) to all local users - * @param text The text format string to send - * @param ... The format arguments - */ - void ServerPrivmsgAll(char* text, ...); - - /** Send text to all users with a specific set of modes - * @param modes The modes to check against, without a +, e.g. 'og' - * @param flags one of WM_OR or WM_AND. If you specify WM_OR, any one of the - * mode characters in the first parameter causes receipt of the message, and - * if you specify WM_OR, all the modes must be present. - * @param text The text format string to send - * @param ... The format arguments - */ - void WriteMode(const char* modes, int flags, const char* text, ...); - /** Return true if a channel name is valid * @param chname A channel name to verify * @return True if the name is valid */ - bool IsChannel(const char *chname); + caller1 IsChannel; + + /** Return true if str looks like a server ID + * @param string to check against + */ + caller1 IsSID; /** Rehash the local server */ - void Rehash(); + caller1 Rehash; /** Handles incoming signals after being set * @param signal the signal recieved @@ -664,36 +619,11 @@ class CoreExport InspIRCd : public classbase */ static void QuickExit(int status); - /** Return a count of users, unknown and known connections - * @return The number of users - */ - int UserCount(); - - /** Return a count of fully registered connections only - * @return The number of registered users - */ - int RegisteredUserCount(); - - /** Return a count of opered (umode +o) users only - * @return The number of opers - */ - int OperCount(); - - /** Return a count of unregistered (before NICK/USER) users only - * @return The number of unregistered (unknown) connections - */ - int UnregisteredUserCount(); - /** Return a count of channels on the network * @return The number of channels */ long ChannelCount(); - /** Return a count of local users on this server only - * @return The number of local users - */ - long LocalUserCount(); - /** Send an error notice to all local users, opered and unopered * @param s The error string to send */ @@ -718,25 +648,6 @@ class CoreExport InspIRCd : public classbase */ caller1 FindDescriptor; - /** Add a new mode to this server's mode parser - * @param mh The modehandler to add - * @param modechar The mode character this modehandler handles - * @return True if the mode handler was added - */ - bool AddMode(ModeHandler* mh, const unsigned char modechar); - - /** Add a new mode watcher to this server's mode parser - * @param mw The modewatcher to add - * @return True if the modewatcher was added - */ - bool AddModeWatcher(ModeWatcher* mw); - - /** Delete a mode watcher from this server's mode parser - * @param mw The modewatcher to delete - * @return True if the modewatcher was deleted - */ - bool DelModeWatcher(ModeWatcher* mw); - /** Add a dns Resolver class to this server's active set * @param r The resolver to add * @param cached If this value is true, then the cache will @@ -768,7 +679,7 @@ class CoreExport InspIRCd : public classbase * @param pcnt The number of items you have given in the first parameter * @param user The user to send error messages to */ - void SendMode(const char **parameters, int pcnt, User *user); + void SendMode(const char* const* parameters, int pcnt, User *user); /** Match two strings using pattern matching. * This operates identically to the global function match(), @@ -786,7 +697,7 @@ class CoreExport InspIRCd : public classbase * @param user The user to execute the command as * @return True if the command handler was called successfully */ - CmdResult CallCommandHandler(const std::string &commandname, const char** parameters, int pcnt, User* user); + CmdResult CallCommandHandler(const std::string &commandname, const char* const* parameters, int pcnt, User* user); /** Return true if the command is a module-implemented command and the given parameters are valid for it * @param parameters The mode parameters @@ -796,76 +707,6 @@ class CoreExport InspIRCd : public classbase */ bool IsValidModuleCommand(const std::string &commandname, int pcnt, User* user); - /** Add a gline and apply it - * @param duration How long the line should last - * @param source Who set the line - * @param reason The reason for the line - * @param hostmask The hostmask to set the line against - */ - void AddGLine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); - - /** Add a qline and apply it - * @param duration How long the line should last - * @param source Who set the line - * @param reason The reason for the line - * @param nickname The nickmask to set the line against - */ - void AddQLine(long duration, const std::string &source, const std::string &reason, const std::string &nickname); - - /** Add a zline and apply it - * @param duration How long the line should last - * @param source Who set the line - * @param reason The reason for the line - * @param ipaddr The ip-mask to set the line against - */ - void AddZLine(long duration, const std::string &source, const std::string &reason, const std::string &ipaddr); - - /** Add a kline and apply it - * @param duration How long the line should last - * @param source Who set the line - * @param reason The reason for the line - * @param hostmask The hostmask to set the line against - */ - void AddKLine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); - - /** Add an eline - * @param duration How long the line should last - * @param source Who set the line - * @param reason The reason for the line - * @param hostmask The hostmask to set the line against - */ - void AddELine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask); - - /** Delete a gline - * @param hostmask The gline to delete - * @return True if the item was removed - */ - bool DelGLine(const std::string &hostmask); - - /** Delete a qline - * @param nickname The qline to delete - * @return True if the item was removed - */ - bool DelQLine(const std::string &nickname); - - /** Delete a zline - * @param ipaddr The zline to delete - * @return True if the item was removed - */ - bool DelZLine(const std::string &ipaddr); - - /** Delete a kline - * @param hostmask The kline to delete - * @return True if the item was removed - */ - bool DelKLine(const std::string &hostmask); - - /** Delete an eline - * @param hostmask The kline to delete - * @return True if the item was removed - */ - bool DelELine(const std::string &hostmask); - /** Return true if the given parameter is a valid nick!user\@host mask * @param mask A nick!user\@host masak to match against * @return True i the mask is valid @@ -887,7 +728,7 @@ class CoreExport InspIRCd : public classbase * @param LinePrefix text to prefix each complete line with * @param TextStream the text to send to the user */ - void DumpText(User* User, const std::string &LinePrefix, stringstream &TextStream); + void DumpText(User* User, const std::string &LinePrefix, std::stringstream &TextStream); /** Check if the given nickmask matches too many users, send errors to the given user * @param nick A nickmask to match against @@ -917,15 +758,16 @@ class CoreExport InspIRCd : public classbase */ long Duration(const std::string &str); - /** Attempt to compare an oper password to a string from the config file. + /** Attempt to compare a password to a string from the config file. * This will be passed to handling modules which will compare the data * against possible hashed equivalents in the input string. + * @param ex The object (user, server, whatever) causing the comparison. * @param data The data from the config file * @param input The data input by the oper - * @param tagnum the tag number of the oper's tag in the config file + * @param hashtype The hash from the config file * @return 0 if the strings match, 1 or -1 if they do not */ - int OperPassCompare(const char* data,const char* input, int tagnum); + int PassCompare(Extensible* ex, const char* data,const char* input, const char* hashtype); /** Check if a given server is a uline. * An empty string returns true, this is by design. @@ -964,23 +806,6 @@ class CoreExport InspIRCd : public classbase */ InspIRCd(int argc, char** argv); - /** Output a log message to the ircd.log file - * The text will only be output if the current loglevel - * is less than or equal to the level you provide - * @param level A log level from the DebugLevel enum - * @param text Format string of to write to the log - * @param ... Format arguments of text to write to the log - */ - void Log(int level, const char* text, ...); - - /** Output a log message to the ircd.log file - * The text will only be output if the current loglevel - * is less than or equal to the level you provide - * @param level A log level from the DebugLevel enum - * @param text Text to write to the log - */ - void Log(int level, const std::string &text); - /** Send a line of WHOIS data to a user. * @param user user to send the line to * @param dest user being WHOISed @@ -996,7 +821,7 @@ class CoreExport InspIRCd : public classbase * @param format Format string for the numeric * @param ... Parameters for the format string */ - void SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...); + void SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...) CUSTOM_PRINTF(5, 6); /** Quit a user for excess flood, and if they are not * fully registered yet, temporarily zline their IP.