X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd_io.cpp;h=f4ab7ce071ea360ac33e41101015453cc51b528d;hb=bf3b7b4696115c5f90b9c2a7ea966d0f9d3eb394;hp=825b4eb313d387f9f59e73e1293bda128b1d4295;hpb=024048d646e5b98846e9967984ad452d2d6bf210;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd_io.cpp b/src/inspircd_io.cpp index 825b4eb31..f4ab7ce07 100644 --- a/src/inspircd_io.cpp +++ b/src/inspircd_io.cpp @@ -262,7 +262,7 @@ bool ValidateServerName(const char* tag, const char* value, void* data) log(DEFAULT,"WARNING: '%s' is not a fully-qualified domain name. Changed to '%s%c'",x,x,'.'); charlcat(x,'.',MAXBUF); } - strlower(x); + //strlower(x); return true; } @@ -318,6 +318,8 @@ bool ValidateRules(const char* tag, const char* value, void* data) return true; } +/* Callback called before processing the first 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 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]; @@ -340,64 +344,70 @@ bool DoConnect(const char* tag, char** entries, void** values, int* types) int* localmax = (int*)values[9]; int* globalmax = (int*)values[10]; - if (*allow) - { - c.host = allow; - c.type = CC_ALLOW; - c.pass = password; - c.registration_timeout = *timeout; - c.pingtime = *pingfreq; - c.flood = *flood; - c.threshold = *threshold; - c.sendqmax = *sendq; - c.recvqmax = *recvq; - c.maxlocal = *localmax; - c.maxglobal = *globalmax; - - - if (c.maxlocal == 0) + if (*allow) + { + c.host = allow; + c.type = CC_ALLOW; + c.pass = password; + c.registration_timeout = *timeout; + c.pingtime = *pingfreq; + c.flood = *flood; + c.threshold = *threshold; + c.sendqmax = *sendq; + c.recvqmax = *recvq; + c.maxlocal = *localmax; + c.maxglobal = *globalmax; + + + if (c.maxlocal == 0) c.maxlocal = 3; - if (c.maxglobal == 0) + if (c.maxglobal == 0) c.maxglobal = 3; - if (c.threshold == 0) - { + if (c.threshold == 0) + { c.threshold = 1; c.flood = 999; log(DEFAULT,"Warning: Connect allow line '%s' has no flood/threshold settings. Setting this tag to 999 lines in 1 second.",c.host.c_str()); - } - if (c.sendqmax == 0) + } + if (c.sendqmax == 0) c.sendqmax = 262114; - if (c.recvqmax == 0) + if (c.recvqmax == 0) c.recvqmax = 4096; - if (c.registration_timeout == 0) + if (c.registration_timeout == 0) c.registration_timeout = 90; - if (c.pingtime == 0) + if (c.pingtime == 0) c.pingtime = 120; - Config->Classes.push_back(c); - } - else - { - c.host = deny; - c.type = CC_DENY; - Config->Classes.push_back(c); - log(DEBUG,"Read connect class type DENY, host=%s",deny); - } + Config->Classes.push_back(c); + } + else + { + c.host = deny; + c.type = CC_DENY; + Config->Classes.push_back(c); + log(DEBUG,"Read connect class type DENY, host=%s",deny); + } return true; } +/* Callback called when there are no more tags + */ bool DoneConnect(const char* tag) { log(DEBUG,"DoneConnect called for tag: %s",tag); return true; } +/* Callback called before processing the first tag + */ bool InitULine(const char* tag) { Config->ulines.clear(); return true; } +/* Callback called to process a single 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 tags + */ bool DoneULine(const char* tag) { return true; } +/* Callback called before processing the first 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 tag + */ bool DoModule(const char* tag, char** entries, void** values, int* types) { char* modname = (char*)values[0]; @@ -431,45 +447,51 @@ bool DoModule(const char* tag, char** entries, void** values, int* types) return true; } +/* Callback called when there are no more tags + */ bool DoneModule(const char* tag) { - // now create a list of new modules that are due to be loaded - // and a seperate list of modules which are due to be unloaded - for (std::vector::iterator _new = new_module_names.begin(); _new != new_module_names.end(); _new++) - { - bool added = true; - - for (std::vector::iterator old = old_module_names.begin(); old != old_module_names.end(); old++) - { - if (*old == *_new) - added = false; - } - - if (added) - added_modules.push_back(*_new); - } - - for (std::vector::iterator oldm = old_module_names.begin(); oldm != old_module_names.end(); oldm++) - { - bool removed = true; - for (std::vector::iterator newm = new_module_names.begin(); newm != new_module_names.end(); newm++) - { - if (*newm == *oldm) - removed = false; - } - - if (removed) - removed_modules.push_back(*oldm); - } + // now create a list of new modules that are due to be loaded + // and a seperate list of modules which are due to be unloaded + for (std::vector::iterator _new = new_module_names.begin(); _new != new_module_names.end(); _new++) + { + bool added = true; + + for (std::vector::iterator old = old_module_names.begin(); old != old_module_names.end(); old++) + { + if (*old == *_new) + added = false; + } + + if (added) + added_modules.push_back(*_new); + } + + for (std::vector::iterator oldm = old_module_names.begin(); oldm != old_module_names.end(); oldm++) + { + bool removed = true; + for (std::vector::iterator newm = new_module_names.begin(); newm != new_module_names.end(); newm++) + { + if (*newm == *oldm) + removed = false; + } + + if (removed) + removed_modules.push_back(*oldm); + } return true; } +/* Callback called before processing the first tag + */ bool InitMaxBans(const char* tag) { Config->maxbans.clear(); return true; } +/* Callback called to process a single 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 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", NULL }; + + /* 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,11 +556,14 @@ 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", {"allow", "deny", "password", "timeout", "pingfreq", "flood", - "threshold", "sendq", "recvq", "localmax", "globalmax", NULL}, + "threshold", "sendq", "recvq", "localmax", "globalmax", NULL}, {DT_CHARPTR, DT_CHARPTR, DT_CHARPTR, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER}, InitConnect, DoConnect, DoneConnect}, @@ -575,13 +611,15 @@ void ServerConfig::Read(bool bail, userrec* user) {"class", {"name", "commands", NULL}, {DT_CHARPTR, DT_CHARPTR}, - InitClasss, DoClass, DoneClassesAndTypes}, + InitClasses, DoClass, DoneClassesAndTypes}, {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::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) @@ -799,7 +839,7 @@ void Start (void) printf("Name concept:\t\t\033[1;32mLord_Zathras\033[0m\n\n"); } -void WritePID(std::string filename) +void WritePID(const std::string &filename) { ofstream outfile(filename.c_str()); if (outfile.is_open())