From c384697c88aa54b5a532cd2edce3c063c70d7868 Mon Sep 17 00:00:00 2001 From: danieldg Date: Wed, 1 Jul 2009 22:55:46 +0000 Subject: Make rehash generate a new ServerInstance->Config object This makes it possible to cancel a pending rehash, and fixes possible threading issues with rehash and other events. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11424 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/configreader.h | 72 ++++++++++++++++++++++---------------------------- include/inspircd.h | 16 +++++------ include/modules.h | 31 ---------------------- 3 files changed, 40 insertions(+), 79 deletions(-) (limited to 'include') diff --git a/include/configreader.h b/include/configreader.h index 60adbf868..36e5badfd 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -48,8 +48,7 @@ enum ConfigDataType DT_IPADDRESS = 6, /* IP address (v4, v6) */ DT_CHANNEL = 7, /* Channel name */ DT_ALLOW_WILD = 64, /* Allow wildcards/CIDR in DT_IPADDRESS */ - DT_ALLOW_NEWLINE = 128, /* New line characters allowed in DT_CHARPTR */ - DT_BOOTONLY = 256 /* Can only be set on startup, not on rehash */ + DT_ALLOW_NEWLINE = 128 /* New line characters allowed in DT_CHARPTR */ }; /** The maximum number of values in a core configuration tag. Can be increased if needed. @@ -323,34 +322,27 @@ class CoreExport ServerConfig : public Extensible * configutation, appending errors to errorstream * and setting error if an error has occured. */ - bool ParseLine(ConfigDataHash &target, const std::string &filename, std::string &line, long &linenumber, std::ostringstream &errorstream); + bool ParseLine(const std::string &filename, std::string &line, long &linenumber); /** Check that there is only one of each configuration item */ - bool CheckOnce(const char* tag, ConfigDataHash &newconf); + bool CheckOnce(const char* tag); public: /** Process an include executable directive */ - bool DoPipe(ConfigDataHash &target, const std::string &file, std::ostringstream &errorstream); + bool DoPipe(const std::string &file); /** Process an include file directive */ - bool DoInclude(ConfigDataHash &target, const std::string &file, std::ostringstream &errorstream); - - /** User that is currently performing a rehash, needed because the - * rehash code is now threaded and needs to know who to give errors and feedback to. - */ - std::string RehashUserUID; + bool DoInclude(const std::string &file); /** Error stream, contains error output from any failed configuration parsing. */ - std::ostringstream* errstr; + std::ostringstream errstr; - /** Holds the new configuration when a rehash occurs so we dont overwrite the existing - * working config with a broken one without checking it first and swapping pointers. - */ - ConfigDataHash newconfig; + /** True if this configuration is valid enough to run with */ + bool valid; /** Set of included files. Do we use this any more? */ @@ -794,7 +786,11 @@ class CoreExport ServerConfig : public Extensible * and initialize this class. All other methods * should be used only by the core. */ - void Read(bool bail, const std::string &useruid); + void Read(); + + /** Apply configuration changes from the old configuration. + */ + void Apply(ServerConfig* old, const std::string &useruid); /** Read a file into a file_cache object */ @@ -805,84 +801,80 @@ class CoreExport ServerConfig : public Extensible bool StartsWithWindowsDriveLetter(const std::string &path); /** 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 useruid If this is set to a non-empty value which is a valid UID, and bail is false, - * the errors are spooled to this user as SNOTICEs. - * If the parameter is not a valid UID, the messages are spooled to all opers. */ - void ReportConfigError(const std::string &errormessage, bool bail, const std::string &useruid); + void ReportConfigError(const std::string &errormessage); /** 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, FILE* &conf, const char* filename, std::ostringstream &errorstream); + bool LoadConf(FILE* &conf, const char* filename); /** 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, FILE* &conf, const std::string &filename, std::ostringstream &errorstream); + bool LoadConf(FILE* &conf, const std::string &filename); /** 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(const char* tag, const char* var, int index, char* result, int length, bool allow_linefeeds = false); /** Writes 'length' chars into 'result' as a string */ - bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index, char* result, int length, bool allow_linefeeds = false); + bool ConfValue(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(const std::string &tag, const std::string &var, int index, std::string &result, bool allow_linefeeds = false); /** Writes 'length' chars into 'result' as a string */ - 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); + bool ConfValue(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' */ - bool ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, int index, int &result); + bool ConfValueInteger(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 char* tag, const char* var, const char* default_value, int index, int &result); + bool ConfValueInteger(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(const std::string &tag, const std::string &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, const std::string &default_value, int index, int &result); + bool ConfValueInteger(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 */ - bool ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, int index); + bool ConfValueBool(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 char* tag, const char* var, const char* default_value, int index); + bool ConfValueBool(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(const std::string &tag, const std::string &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, const std::string &default_value, int index); + bool ConfValueBool(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 */ - int ConfValueEnum(ConfigDataHash &target, const char* tag); + int ConfValueEnum(const char* tag); /** Returns the number of occurences of tag in the config file */ - int ConfValueEnum(ConfigDataHash &target, const std::string &tag); + int ConfValueEnum(const std::string &tag); /** Returns the numbers of vars inside the index'th 'tag in the config file */ - int ConfVarEnum(ConfigDataHash &target, const char* tag, int index); + int ConfVarEnum(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); + int ConfVarEnum(const std::string &tag, int index); /** Validates a hostname value, throwing ConfigException if it is not valid */ diff --git a/include/inspircd.h b/include/inspircd.h index afe4dcd7c..ef6c86f28 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -290,12 +290,12 @@ class BanCacheManager; class CoreExport ConfigReaderThread : public Thread { InspIRCd* ServerInstance; - bool do_bail; + ServerConfig* Config; bool done; - std::string TheUserUID; public: - ConfigReaderThread(InspIRCd* Instance, bool bail, const std::string &useruid) - : Thread(), ServerInstance(Instance), do_bail(bail), done(false), TheUserUID(useruid) + std::string TheUserUID; + ConfigReaderThread(InspIRCd* Instance, const std::string &useruid) + : Thread(), ServerInstance(Instance), done(false), TheUserUID(useruid) { } @@ -304,6 +304,8 @@ class CoreExport ConfigReaderThread : public Thread } void Run(); + /** Run in the main thread to apply the configuration */ + void Finish(); bool IsDone() { return done; } }; @@ -536,11 +538,9 @@ class CoreExport InspIRCd : public classbase caller1 ProcessUser; /** Bind all ports specified in the configuration file. - * @param bail True if the function should bail back to the shell on failure - * @param found_ports The actual number of ports found in the config, as opposed to the number actually bound - * @return The number of ports actually bound without error + * @return The number of ports bound without error */ - int BindPorts(bool bail, int &found_ports, FailedPortList &failed_ports); + int BindPorts(FailedPortList &failed_ports); /** Binds a socket on an already open file descriptor * @param sockfd A valid file descriptor of an open socket diff --git a/include/modules.h b/include/modules.h index 31ed6ec8c..1761b1b54 100644 --- a/include/modules.h +++ b/include/modules.h @@ -1447,21 +1447,6 @@ class CoreExport ConfigReader : public classbase { protected: InspIRCd* ServerInstance; - /** The contents of the configuration file - * This protected member should never be accessed by a module (and cannot be accessed unless the - * core is changed). It will contain a pointer to the configuration file data with unneeded data - * (such as comments) stripped from it. - */ - ConfigDataHash* data; - /** Used to store errors - */ - std::ostringstream* errorlog; - /** If we're using our own config data hash or not - */ - bool privatehash; - /** True if an error occured reading the config file - */ - bool readerror; /** Error code */ long error; @@ -1472,10 +1457,6 @@ class CoreExport ConfigReader : public classbase * as specified when running ./configure. */ ConfigReader(InspIRCd* Instance); - /** Overloaded constructor. - * This constructor initialises the ConfigReader class to read a user-specified config file - */ - ConfigReader(InspIRCd* Instance, const std::string &filename); /** Default destructor. * This method destroys the ConfigReader class. */ @@ -1539,18 +1520,6 @@ class CoreExport ConfigReader : public classbase * multiple instance tag. */ int Enumerate(const std::string &tag); - /** Returns true if a config file is valid. - * This method is partially implemented and will only return false if the config - * file does not exist or could not be opened. - */ - bool Verify(); - /** Dumps the list of errors in a config file to an output location. If bail is true, - * then the program will abort. If bail is false and user points to a valid user - * record, the error report will be spooled to the given user by means of NOTICE. - * if bool is false AND user is false, the error report will be spooled to all opers - * by means of a NOTICE to all opers. - */ - void DumpErrors(bool bail,User* user); /** Returns the number of items within a tag. * For example if the tag was <test tag="blah" data="foo"> then this -- cgit v1.2.3