X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fconfigreader.h;h=622c44d0d9ae61b8138c418c1afb437ec533a5ab;hb=f240285155d115ee3a0fd437944f2bec05a0c14c;hp=44551b1329cbace399038e42a86e6fc3d64d92c9;hpb=b45e7cfebbeaad4ecc3c55bc3060140f50f710d3;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/configreader.h b/include/configreader.h index 44551b132..622c44d0d 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -30,20 +30,113 @@ 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, DT_INTEGER, DT_CHARPTR, DT_BOOLEAN }; +/** 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; + +/** 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; + ValueContainerBase* val; ConfigDataType datatype; Validator validation_function; }; @@ -53,14 +146,23 @@ struct InitialConfig */ struct MultiConfig { - const char* tag; - char* items[12]; - int datatype[12]; + const char* tag; + char* items[12]; + int datatype[12]; 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 @@ -69,6 +171,8 @@ struct MultiConfig class ServerConfig : public Extensible { private: + /** Creator/owner + */ InspIRCd* ServerInstance; /** This variable holds the names of all @@ -84,6 +188,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 @@ -99,6 +205,19 @@ class ServerConfig : public Extensible */ 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. */ @@ -174,10 +293,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. */ @@ -331,16 +446,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 */ @@ -371,12 +489,30 @@ class ServerConfig : public Extensible */ bool CycleHosts; + /** All oper type definitions from the config file + */ + opertype_t opertypes; + + /** All oper class definitions from the config file + */ + operclass_t operclass; + + /** Construct a new ServerConfig + */ ServerConfig(InspIRCd* Instance); /** 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. @@ -391,33 +527,54 @@ class ServerConfig : public Extensible * 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 */ + /** Writes 'length' chars into 'result' as a string + */ bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, int index, char* result, int length); + /** 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); - /* 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); + /** 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); - /* 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); + /** 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); - /* 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); @@ -428,4 +585,10 @@ class ServerConfig : public Extensible 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