X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Finspircd.h;h=fc0f2a04e03fa0635e2f1fe08fcd361d57afe380;hb=ca781714c1651a9e7042eb930c6b117449f8e1fc;hp=7db8bf210fac97fc031395b5ea5f46fc4e6c71d9;hpb=e4acbc95b8b6cd5b28d38a2242c02e8ff4991e4a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/inspircd.h b/include/inspircd.h index 7db8bf210..fc0f2a04e 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -15,8 +15,8 @@ #define __INSPIRCD_H__ #ifndef WIN32 -#define DllExport -#define CoreExport +#define DllExport +#define CoreExport #define printf_c printf #else #include "inspircd_win32wrapper.h" @@ -25,22 +25,76 @@ #undef ERROR #endif -#include -#include +#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 + #include -#include +#include +#include +#include +#include +#include + + +/** A list of failed port bindings, used for informational purposes on startup */ +typedef std::vector > FailedPortList; + +/** A cached text file stored with its contents as lines + */ +typedef std::deque< std::string > file_cache; + +/** A configuration key and value pair + */ +typedef std::pair< std::string, std::string > KeyVal; + +/** A list of related configuration keys and values + */ +typedef std::vector< KeyVal > KeyValList; + +/** An entire config file, built up of KeyValLists + */ +typedef std::multimap< std::string, KeyValList > ConfigDataHash; + + #include "inspircd_config.h" +#include "numerics.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" + +#ifndef PATH_MAX +#warning Potentially broken system, PATH_MAX undefined +#define PATH_MAX 4096 +#endif /** * Used to define the maximum number of parameters a command may have. @@ -208,36 +262,45 @@ 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*); -DEFINE_HANDLER1(IsNickHandler, bool, const char*); +DEFINE_HANDLER2(IsNickHandler, bool, const char*, size_t); DEFINE_HANDLER1(IsIdentHandler, bool, const char*); DEFINE_HANDLER1(FindDescriptorHandler, User*, int); DEFINE_HANDLER1(FloodQuitUserHandler, void, User*); +DEFINE_HANDLER2(IsChannelHandler, bool, const char*, size_t); +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 * in this software, with the exception of the base class, * classbase. Amongst other things, it contains a ModeParser, * a DNS object, a CommandParser object, and a list of active * Module objects, and facilities for Module objects to - * interact with the core system it implements. You should - * NEVER attempt to instantiate a class of type InspIRCd - * yourself. If you do, this is equivalent to spawning a second - * IRC server, and could have catastrophic consequences for the - * program in terms of ram usage (basically, you could create - * an obese forkbomb built from recursively spawning irc servers!) + * interact with the core system it implements. */ class CoreExport InspIRCd : public classbase { @@ -260,9 +323,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 */ @@ -292,21 +355,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 @@ -324,6 +378,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. @@ -360,11 +417,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; @@ -388,7 +440,19 @@ 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. */ @@ -412,35 +476,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; @@ -453,44 +488,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); - - /** 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 - */ - int SetTimeDelta(int delta); + chan_hash* chanlist; - /** Add a user to the local clone map - * @param user The user to add + /** Set to the current signal recieved */ - void AddLocalClone(User* user); + int s_signal; - /** 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 + /** Protocol interface, overridden by server protocol modules */ - int ModeCount(const char mode); + ProtocolInterface* PI; - /** 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 @@ -512,7 +531,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 @@ -541,17 +560,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 @@ -603,48 +611,27 @@ 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); + caller2 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 */ void SignalHandler(int signal); - /** Sets the signal recieved + /** Sets the signal recieved * @param signal the signal recieved */ static void SetSignal(int signal); @@ -662,36 +649,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 */ @@ -701,7 +663,7 @@ class CoreExport InspIRCd : public classbase * @param n A nickname to verify * @return True if the nick is valid */ - caller1 IsNick; + caller2 IsNick; /** Return true if an ident is valid * @param An ident to verify @@ -716,24 +678,6 @@ class CoreExport InspIRCd : public classbase */ caller1 FindDescriptor; - /** Add a new mode to this server's mode parser - * @param mh The modehandler to add - * @return True if the mode handler was added - */ - bool AddMode(ModeHandler* mh); - - /** 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 @@ -765,7 +709,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 std::vector& parameters, User *user); /** Match two strings using pattern matching. * This operates identically to the global function match(), @@ -783,7 +727,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 std::vector& parameters, 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 @@ -814,7 +758,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 @@ -844,15 +788,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 std::string &data, const std::string &input, const std::string &hashtype); /** Check if a given server is a uline. * An empty string returns true, this is by design. @@ -891,23 +836,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 @@ -923,7 +851,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. @@ -972,6 +900,10 @@ class CoreExport InspIRCd : public classbase */ void BufferedSocketCull(); + /** Adds an extban char to the 005 token. + */ + void AddExtBanChar(char c); + char* GetReadBuffer() { return this->ReadBuffer;