* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2010 InspIRCd Development Team
* See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
#include "socketengine.h"
#include "socket.h"
-/* Required forward definitions */
-class ServerConfig;
-class ServerLimits;
-class InspIRCd;
-class BufferedSocket;
-
-/** A cached text file stored with its contents as lines
- */
-typedef std::vector<std::string> file_cache;
-
-/** A configuration key and value pair
- */
-typedef std::pair<std::string, std::string> KeyVal;
-
-struct CoreExport ConfigTag : public refcountbase
+/** Structure representing a single <tag> in config */
+class CoreExport ConfigTag : public refcountbase
{
+ std::vector<KeyVal> items;
+ public:
const std::string tag;
const std::string src_name;
const int src_line;
- std::vector<KeyVal> items;
-
- ConfigTag(const std::string& Tag, const std::string& file, int line)
- : tag(Tag), src_name(file), src_line(line) {}
+ /** Get the value of an option, using def if it does not exist */
std::string getString(const std::string& key, const std::string& def = "");
+ /** Get the value of an option, using def if it does not exist */
long getInt(const std::string& key, long def = 0);
+ /** Get the value of an option, using def if it does not exist */
double getFloat(const std::string& key, double def = 0);
+ /** Get the value of an option, using def if it does not exist */
bool getBool(const std::string& key, bool def = false);
+ /** Get the value of an option
+ * @param key The option to get
+ * @param value The location to store the value (unmodified if does not exist)
+ * @param allow_newline Allow newlines in the option (normally replaced with spaces)
+ * @return true if the option exists
+ */
bool readString(const std::string& key, std::string& value, bool allow_newline = false);
std::string getTagLocation();
-};
-/** An entire config file, built up of KeyValLists
- */
-typedef std::multimap<std::string, reference<ConfigTag> > ConfigDataHash;
+ inline const std::vector<KeyVal>& getItems() const { return items; }
+
+ /** Create a new ConfigTag, giving access to the private KeyVal item list */
+ static ConfigTag* create(const std::string& Tag, const std::string& file, int line,
+ std::vector<KeyVal>*&items);
+ private:
+ ConfigTag(const std::string& Tag, const std::string& file, int line);
+};
/** Defines the server's length limits on various length-limited
* items such as topics, nicknames, channel names etc.
}
};
-typedef std::map<std::string, reference<ConfigTag> > TagIndex;
-typedef std::map<std::string, reference<OperInfo> > OperIndex;
-typedef ConfigDataHash::iterator ConfigIter;
-typedef std::pair<ConfigDataHash::iterator, ConfigDataHash::iterator> ConfigTagList;
-
/** 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
*/
bool RestrictBannedUsers;
- /** If this value is true, halfops have been
- * enabled in the configuration file.
- */
- bool AllowHalfop;
-
/** If this is set to true, then mode lists (e.g
* MODE #chan b) are hidden from unprivileged
* users.
*/
unsigned int MaxTargets;
- /** The maximum number of /WHO results allowed
- * in any single /WHO command.
- */
- int MaxWhoResults;
-
- /** How many seconds to wait before exiting
- * the program when /DIE is correctly issued.
- */
- int DieDelay;
-
/** True if we're going to hide netsplits as *.net *.split for non-opers
*/
bool HideSplits;
};
+/** The background thread for config reading, so that reading from executable includes
+ * does not block.
+ */
+class CoreExport ConfigReaderThread : public Thread
+{
+ ServerConfig* Config;
+ volatile bool done;
+ public:
+ const std::string TheUserUID;
+ ConfigReaderThread(const std::string &useruid)
+ : Config(new ServerConfig), done(false), TheUserUID(useruid)
+ {
+ }
+
+ virtual ~ConfigReaderThread()
+ {
+ delete Config;
+ }
+
+ void Run();
+ /** Run in the main thread to apply the configuration */
+ void Finish();
+ bool IsDone() { return done; }
+};
+
#endif