diff options
Diffstat (limited to 'src/inspircd_io.cpp')
-rw-r--r-- | src/inspircd_io.cpp | 82 |
1 files changed, 61 insertions, 21 deletions
diff --git a/src/inspircd_io.cpp b/src/inspircd_io.cpp index a9e1ca691..15b5fb5a2 100644 --- a/src/inspircd_io.cpp +++ b/src/inspircd_io.cpp @@ -318,6 +318,8 @@ bool ValidateRules(const char* tag, const char* value, void* data) return true; } +/* Callback called before processing the first <connect> tag + */ bool InitConnect(const char* tag) { log(DEFAULT,"Reading connect classes..."); @@ -325,10 +327,12 @@ bool InitConnect(const char* tag) return true; } +/* Callback called to process a single <connect> tag + */ bool DoConnect(const char* tag, char** entries, void** values, int* types) { ConnectClass c; - char* allow = (char*)values[0]; + char* allow = (char*)values[0]; /* Yeah, there are a lot of values. Live with it. */ char* deny = (char*)values[1]; char* password = (char*)values[2]; int* timeout = (int*)values[3]; @@ -386,18 +390,24 @@ bool DoConnect(const char* tag, char** entries, void** values, int* types) return true; } +/* Callback called when there are no more <connect> tags + */ bool DoneConnect(const char* tag) { log(DEBUG,"DoneConnect called for tag: %s",tag); return true; } +/* Callback called before processing the first <uline> tag + */ bool InitULine(const char* tag) { Config->ulines.clear(); return true; } +/* Callback called to process a single <uline> tag + */ bool DoULine(const char* tag, char** entries, void** values, int* types) { char* server = (char*)values[0]; @@ -406,11 +416,15 @@ bool DoULine(const char* tag, char** entries, void** values, int* types) return true; } +/* Callback called when there are no more <uline> tags + */ bool DoneULine(const char* tag) { return true; } +/* Callback called before processing the first <module> tag + */ bool InitModule(const char* tag) { old_module_names.clear(); @@ -424,6 +438,8 @@ bool InitModule(const char* tag) return true; } +/* Callback called to process a single <module> tag + */ bool DoModule(const char* tag, char** entries, void** values, int* types) { char* modname = (char*)values[0]; @@ -431,6 +447,8 @@ bool DoModule(const char* tag, char** entries, void** values, int* types) return true; } +/* Callback called when there are no more <module> tags + */ bool DoneModule(const char* tag) { // now create a list of new modules that are due to be loaded @@ -464,12 +482,16 @@ bool DoneModule(const char* tag) return true; } +/* Callback called before processing the first <banlist> tag + */ bool InitMaxBans(const char* tag) { Config->maxbans.clear(); return true; } +/* Callback called to process a single <banlist> tag + */ bool DoMaxBans(const char* tag, char** entries, void** values, int* types) { char* channel = (char*)values[0]; @@ -478,6 +500,8 @@ bool DoMaxBans(const char* tag, char** entries, void** values, int* types) return true; } +/* Callback called when there are no more <banlist> tags. + */ bool DoneMaxBans(const char* tag) { return true; @@ -485,10 +509,19 @@ bool DoneMaxBans(const char* tag) void ServerConfig::Read(bool bail, userrec* user) { - char debug[MAXBUF]; - char dataline[1024]; - std::stringstream errstr; - + char debug[MAXBUF]; /* Temporary buffer for debugging value */ + char dataline[1024]; /* Temporary buffer for error output */ + char* convert; /* Temporary buffer used for reading singular values into */ + char* data[12]; /* Temporary buffers for reading multiple occurance tags into */ + void* ptr[12]; /* Temporary pointers for passing to callbacks */ + int r_i[12]; /* Temporary array for casting */ + int rem = 0, add = 0; /* Number of modules added, number of modules removed */ + std::stringstream errstr; /* String stream containing the error output */ + + /* These tags MUST occur and must ONLY occur once in the config file */ + static char* Once[] = { "server", "admin", "files", "power", "options", "pid" }; + + /* These tags can occur ONCE or not at all */ static InitialConfig Values[] = { {"options", "softlimit", &this->SoftLimit, DT_INTEGER, ValidateSoftLimit}, {"options", "somaxconn", &this->MaxConn, DT_INTEGER, ValidateMaxConn}, @@ -523,6 +556,9 @@ void ServerConfig::Read(bool bail, userrec* user) {NULL} }; + /* These tags can occur multiple times, and therefore they have special code to read them + * which is different to the code for reading the singular tags listed above. + */ static MultiConfig MultiValues[] = { {"connect", @@ -579,9 +615,11 @@ void ServerConfig::Read(bool bail, userrec* user) {NULL} }; - + include_stack.clear(); + /* Initially, load the config into memory, bail if there are errors + */ if (!LoadConf(CONFIG_FILE,&Config->config_f,&errstr)) { errstr.seekg(0); @@ -617,15 +655,14 @@ void ServerConfig::Read(bool bail, userrec* user) } } - /* Check we dont have more than one of singular tags + /* Check we dont have more than one of singular tags, or any of them missing */ - if (!CheckOnce("server",bail,user) || !CheckOnce("admin",bail,user) || !CheckOnce("files",bail,user) - || !CheckOnce("power",bail,user) || !CheckOnce("options",bail,user) || !CheckOnce("pid",bail,user)) - { - return; - } + for (int Index = 0; Once[Index]; Index++) + if (!CheckOnce(Once[Index],bail,user)) + return; - char* convert; + /* Read the values of all the tags which occur once or not at all, and call their callbacks. + */ for (int Index = 0; Values[Index].tag; Index++) { int* val_i = (int*) Values[Index].val; @@ -658,13 +695,15 @@ void ServerConfig::Read(bool bail, userrec* user) Values[Index].validation_function(Values[Index].tag, Values[Index].value, Values[Index].val); } - char* data[12]; - void* ptr[12]; - int r_i[12]; - + /* Claim memory for use when reading multiple tags + */ for (int n = 0; n < 12; n++) data[n] = new char[MAXBUF]; + /* Read the multiple-tag items (class tags, connect tags, etc) + * and call the callbacks associated with them. We have three + * callbacks for these, a 'start', 'item' and 'end' callback. + */ for (int Index = 0; MultiValues[Index].tag; Index++) { MultiValues[Index].init_function(MultiValues[Index].tag); @@ -700,6 +739,8 @@ void ServerConfig::Read(bool bail, userrec* user) MultiValues[Index].finish_function(MultiValues[Index].tag); } + /* Free any memory we claimed + */ for (int n = 0; n < 12; n++) delete[] data[n]; @@ -707,11 +748,11 @@ void ServerConfig::Read(bool bail, userrec* user) WritePID(Config->PID); log(DEFAULT,"Done reading configuration file, InspIRCd is now starting."); + + /* If we're rehashing, let's load any new modules, and unload old ones + */ if (!bail) { - log(DEFAULT,"Adding and removing modules due to rehash..."); - - int rem = 0, add = 0; if (!removed_modules.empty()) for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++) { @@ -754,7 +795,6 @@ void ServerConfig::Read(bool bail, userrec* user) } } - void Exit (int status) { if (Config->log_file) |