X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fconfigreader.h;h=514e5e9b3834a9a8bd4d58ef80d429f6009d33e6;hb=b1d06ea1d3a4a11a8253e0d81c832cb54c3c0946;hp=5bf26e69523ff024678d894d461f6b722ade2f02;hpb=396c9ef9f7a96934d3227bb7d1d091315e3d4fa8;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/configreader.h b/include/configreader.h index 5bf26e695..514e5e9b3 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -2,13 +2,9 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * - * - * - * Written by Craig Edwards, Craig McLure, and others. + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * * This program is free but copyrighted software; see * the file COPYING for details. * @@ -25,35 +21,153 @@ #include "inspircd.h" #include "globals.h" #include "modules.h" +#include "socketengine.h" +#include "socket.h" class ServerConfig; class InspIRCd; +class InspSocket; -typedef bool (*Validator)(ServerConfig* conf, const char*, const char*, void*); -typedef bool (*MultiValidator)(ServerConfig* conf, const char*, char**, void**, int*); -typedef bool (*MultiNotify)(ServerConfig* conf, const char*); +/** Types of data in the core config + */ +enum ConfigDataType +{ + DT_NOTHING = 0, + DT_INTEGER = 1, + DT_CHARPTR = 2, + DT_BOOLEAN = 3, + DT_ALLOW_NEWLINE = 128 +}; + +/** Holds a config value, either string, integer or boolean. + * Callback functions receive one or more of these, either on + * their own as a reference, or in a reference to a deque of them. + * The callback function can then alter the values of the ValueItem + * classes to validate the settings. + */ +class ValueItem +{ + std::string v; + public: + ValueItem(int value); + ValueItem(bool value); + ValueItem(char* value); + void Set(char* value); + void Set(const char* val); + void Set(int value); + int GetInteger(); + char* GetString(); + bool GetBool(); +}; + +/** The base class of the container 'ValueContainer' + * used internally by the core to hold core values. + */ +class ValueContainerBase +{ + public: + ValueContainerBase() { } + virtual ~ValueContainerBase() { } +}; + +/** ValueContainer is used to contain pointers to different + * core values such as the server name, maximum number of + * clients etc. + * It is specialized to hold a data type, then pointed at + * a value in the ServerConfig class. When the value has been + * read and validated, the Set method is called to write the + * value safely in a type-safe manner. + */ +template class ValueContainer : public ValueContainerBase +{ + T val; + + public: + + ValueContainer() + { + val = NULL; + } + + ValueContainer(T Val) + { + val = Val; + } + + void Set(T newval, size_t s) + { + memcpy(val, newval, s); + } +}; + +/** A specialization of ValueContainer to hold a pointer to a bool + */ +typedef ValueContainer ValueContainerBool; + +/** A specialization of ValueContainer to hold a pointer to + * an unsigned int + */ +typedef ValueContainer ValueContainerUInt; + +/** A specialization of ValueContainer to hold a pointer to + * a char array. + */ +typedef ValueContainer ValueContainerChar; -enum ConfigDataType { DT_NOTHING, DT_INTEGER, DT_CHARPTR, DT_BOOLEAN }; +/** A specialization of ValueContainer to hold a pointer to + * an int + */ +typedef ValueContainer ValueContainerInt; + +/** A set of ValueItems used by multi-value validator functions + */ +typedef std::deque ValueList; + +/** A callback for validating a single value + */ +typedef bool (*Validator)(ServerConfig* conf, const char*, const char*, ValueItem&); +/** A callback for validating multiple value entries + */ +typedef bool (*MultiValidator)(ServerConfig* conf, const char*, char**, ValueList&, int*); +/** A callback indicating the end of a group of entries + */ +typedef bool (*MultiNotify)(ServerConfig* conf, const char*); +/** Holds a core configuration item and its callbacks + */ struct InitialConfig { char* tag; char* value; - void* val; + char* default_value; + ValueContainerBase* val; ConfigDataType datatype; Validator validation_function; }; +/** Holds a core configuration item and its callbacks + * where there may be more than one item + */ struct MultiConfig { - const char* tag; - char* items[12]; - int datatype[12]; + const char* tag; + char* items[13]; + char* items_default[13]; + int datatype[13]; MultiNotify init_function; MultiValidator validation_function; MultiNotify finish_function; }; +/** A set of oper types + */ +typedef std::map opertype_t; + +/** A Set of oper classes + */ +typedef std::map operclass_t; + + /** This class holds the bulk of the runtime configuration for the ircd. * It allows for reading new config values, accessing configuration files, * and storage of the configuration data needed to run the ircd, such as @@ -62,6 +176,8 @@ struct MultiConfig class ServerConfig : public Extensible { private: + /** Creator/owner + */ InspIRCd* ServerInstance; /** This variable holds the names of all @@ -77,6 +193,8 @@ class ServerConfig : public Extensible */ bool ParseLine(ConfigDataHash &target, std::string &line, long linenumber, std::ostringstream &errorstream); + /** Process an include directive + */ bool DoInclude(ConfigDataHash &target, const std::string &file, std::ostringstream &errorstream); /** Check that there is only one of each configuration item @@ -84,12 +202,27 @@ class ServerConfig : public Extensible bool CheckOnce(char* tag, bool bail, userrec* user); public: + + InspIRCd* GetInstance(); /** This holds all the information in the config file, * it's indexed by tag name to a vector of key/values. */ ConfigDataHash config_data; + /** Max number of WhoWas entries per user. + */ + int WhoWasGroupSize; + + /** Max number of cumulative user-entries in WhoWas. + * When max reached and added to, push out oldest entry FIFO style. + */ + int WhoWasMaxGroups; + + /** Max seconds a user is kept in WhoWas before being pruned. + */ + int WhoWasMaxKeep; + /** Holds the server name of the local server * as defined by the administrator. */ @@ -143,6 +276,14 @@ class ServerConfig : public Extensible */ char PrefixQuit[MAXBUF]; + /** The quit suffix in use, or an empty string + */ + char SuffixQuit[MAXBUF]; + + /** The fixed quit message in use, or an empty string + */ + char FixedQuit[MAXBUF]; + /** The last string found within a tag, or * an empty string. */ @@ -165,10 +306,6 @@ class ServerConfig : public Extensible */ char ModPath[1024]; - /** The temporary directory where modules are copied - */ - char TempDir[1024]; - /** The full pathname to the executable, as * given in argv[0] when the program starts. */ @@ -266,6 +403,10 @@ class ServerConfig : public Extensible */ bool HideBans; + /** Announce invites to the channel with a server notice + */ + bool AnnounceInvites; + /** If this is enabled then operators will * see invisible (+i) channels in /whois. */ @@ -308,7 +449,7 @@ class ServerConfig : public Extensible /** A list of the file descriptors for the listening client ports */ - int openSockfd[MAX_DESCRIPTORS]; + ListenSocket* openSockfd[255]; /** Boolean sets of which modules implement which functions */ @@ -322,16 +463,19 @@ class ServerConfig : public Extensible */ std::map IOHookModule; + std::map SocketIOHookModule; + /** The 005 tokens of this server (ISUPPORT) * populated/repopulated upon loading or unloading * modules. */ std::string data005; + std::vector isupport; /** STATS characters in this list are available * only to operators. */ - char OperOnlyStats[MAXBUF]; + char UserStats[MAXBUF]; /** The path and filename of the ircd.log file */ @@ -343,12 +487,16 @@ class ServerConfig : public Extensible /** List of u-lined servers */ - std::vector ulines; + std::map ulines; /** Max banlist sizes for channels (the std::string is a glob) */ std::map maxbans; + /** Directory where the inspircd binary resides + */ + std::string MyDir; + /** If set to true, no user DNS lookups are to be performed */ bool NoUserDns; @@ -357,13 +505,61 @@ class ServerConfig : public Extensible */ bool SyntaxHints; + /** If set to true, users appear to quit then rejoin when their hosts change. + * This keeps clients synchronized properly. + */ + bool CycleHosts; + + /** If set to true, prefixed channel NOTICEs and PRIVMSGs will have the prefix + * added to the outgoing text for undernet style msg prefixing. + */ + bool UndernetMsgPrefix; + + /** If set to true, the full nick!user@host will be shown in the TOPIC command + * for who set the topic last. If false, only the nick is shown. + */ + bool FullHostInTopic; + + /** All oper type definitions from the config file + */ + opertype_t opertypes; + + /** All oper class definitions from the config file + */ + operclass_t operclass; + + /** Saved argv from startup + */ + char** argv; + + /** Saved argc from startup + */ + int argc; + + /** Max channels per user + */ + unsigned int MaxChans; + + /** Oper max channels per user + */ + unsigned int OperMaxChans; + + /** Construct a new ServerConfig + */ ServerConfig(InspIRCd* Instance); - /** Clears the include stack in preperation for - * a Read() call. + /** Clears the include stack in preperation for a Read() call. */ void ClearStack(); + /** Update the 005 vector + */ + void Update005(); + + /** Send the 005 numerics (ISUPPORT) to a user + */ + void Send005(userrec* user); + /** Read the entire configuration into memory * and initialize this class. All other methods * should be used only by the core. @@ -374,39 +570,92 @@ class ServerConfig : public Extensible */ bool ReadFile(file_cache &F, const char* fname); + /** Load 'filename' into 'target', with the new config parser everything is parsed into + * tag/key/value at load-time rather than at read-value time. + */ + + /** Report a configuration error given in errormessage. + * @param bail If this is set to true, the error is sent to the console, and the program exits + * @param user If this is set to a non-null value, and bail is false, the errors are spooled to + * this user as SNOTICEs. + * If the parameter is NULL, the messages are spooled to all users via WriteOpers as SNOTICEs. + */ + void ReportConfigError(const std::string &errormessage, bool bail, userrec* user); + /** Load 'filename' into 'target', with the new config parser everything is parsed into * tag/key/value at load-time rather than at read-value time. */ bool LoadConf(ConfigDataHash &target, const char* filename, std::ostringstream &errorstream); + + /** Load 'filename' into 'target', with the new config parser everything is parsed into + * tag/key/value at load-time rather than at read-value time. + */ bool LoadConf(ConfigDataHash &target, const std::string &filename, std::ostringstream &errorstream); /* Both these return true if the value existed or false otherwise */ - /* Writes 'length' chars into 'result' as a string */ - bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, int index, char* result, int length); - bool ConfValue(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, std::string &result); + /** Writes 'length' chars into 'result' as a string + */ + bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, int index, char* result, int length, bool allow_linefeeds = false); + bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index, char* result, int length, bool allow_linefeeds = false); + + /** Writes 'length' chars into 'result' as a string + */ + bool ConfValue(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, std::string &result, bool allow_linefeeds = false); + bool ConfValue(ConfigDataHash &target, const std::string &tag, const std::string &var, const std::string &default_value, int index, std::string &result, bool allow_linefeeds = false); - /* Tries to convert the value to an integer and write it to 'result' */ + /** Tries to convert the value to an integer and write it to 'result' + */ bool ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, int index, int &result); + bool ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index, int &result); + /** Tries to convert the value to an integer and write it to 'result' + */ bool ConfValueInteger(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, int &result); + bool ConfValueInteger(ConfigDataHash &target, const std::string &tag, const std::string &var, const std::string &default_value, int index, int &result); - /* Returns true if the value exists and has a true value, false otherwise */ + /** Returns true if the value exists and has a true value, false otherwise + */ bool ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, int index); + bool ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index); + /** Returns true if the value exists and has a true value, false otherwise + */ bool ConfValueBool(ConfigDataHash &target, const std::string &tag, const std::string &var, int index); + bool ConfValueBool(ConfigDataHash &target, const std::string &tag, const std::string &var, const std::string &default_value, int index); - /* Returns the number of occurences of tag in the config file */ + /** Returns the number of occurences of tag in the config file + */ int ConfValueEnum(ConfigDataHash &target, const char* tag); + /** Returns the number of occurences of tag in the config file + */ int ConfValueEnum(ConfigDataHash &target, const std::string &tag); - /* Returns the numbers of vars inside the index'th 'tag in the config file */ + /** Returns the numbers of vars inside the index'th 'tag in the config file + */ int ConfVarEnum(ConfigDataHash &target, const char* tag, int index); + /** Returns the numbers of vars inside the index'th 'tag in the config file + */ int ConfVarEnum(ConfigDataHash &target, const std::string &tag, int index); Module* GetIOHook(int port); bool AddIOHook(int port, Module* iomod); bool DelIOHook(int port); + Module* GetIOHook(InspSocket* is); + bool AddIOHook(Module* iomod, InspSocket* is); + bool DelIOHook(InspSocket* is); + + static std::string GetFullProgDir(char** argv, int argc); + static bool DirValid(const char* dirandfile); + static char* CleanFilename(char* name); + static bool FileExists(const char* file); + }; bool InitializeDisabledCommands(const char* data, InspIRCd* ServerInstance); +bool InitTypes(ServerConfig* conf, const char* tag); +bool InitClasses(ServerConfig* conf, const char* tag); +bool DoType(ServerConfig* conf, const char* tag, char** entries, ValueList &values, int* types); +bool DoClass(ServerConfig* conf, const char* tag, char** entries, ValueList &values, int* types); +bool DoneClassesAndTypes(ServerConfig* conf, const char* tag); + #endif