X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=0bb22e43a679aa2e9212cde11e07dc421d7bf929;hb=e17a512c8dbd16a6e1e8101205a45e9a7d094708;hp=c66b6730a35ba0056201d142021d551d4de889de;hpb=b848ca14335adcb924acb7977d93e0d76b9437b7;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index c66b6730a..0bb22e43a 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -17,6 +17,7 @@ #include "inspircd.h" #include "xline.h" #include "exitcodes.h" +#include "commands/cmd_whowas.h" std::vector old_module_names, new_module_names, added_modules, removed_modules; @@ -77,7 +78,6 @@ bool ServerConfig::AddIOHook(Module* iomod, InspSocket* is) { if (!GetIOHook(is)) { - ServerInstance->Log(DEBUG,"Hooked inspsocket %08x", is); SocketIOHookModule[is] = iomod; is->IsIOHooked = true; return true; @@ -151,46 +151,12 @@ bool ServerConfig::CheckOnce(char* tag, bool bail, userrec* user) if (count > 1) { - if (bail) - { - printf("There were errors in your configuration:\nYou have more than one <%s> tag, this is not permitted.\n",tag); - InspIRCd::Exit(EXIT_STATUS_CONFIG); - } - else - { - if (user) - { - user->WriteServ("There were errors in your configuration:"); - user->WriteServ("You have more than one <%s> tag, this is not permitted.\n",tag); - } - else - { - ServerInstance->WriteOpers("There were errors in the configuration file:"); - ServerInstance->WriteOpers("You have more than one <%s> tag, this is not permitted.\n",tag); - } - } + throw CoreException("You have more than one <"+std::string(tag)+"> tag, this is not permitted."); return false; } if (count < 1) { - if (bail) - { - printf("There were errors in your configuration:\nYou have not defined a <%s> tag, this is required.\n",tag); - InspIRCd::Exit(EXIT_STATUS_CONFIG); - } - else - { - if (user) - { - user->WriteServ("There were errors in your configuration:"); - user->WriteServ("You have not defined a <%s> tag, this is required.",tag); - } - else - { - ServerInstance->WriteOpers("There were errors in the configuration file:"); - ServerInstance->WriteOpers("You have not defined a <%s> tag, this is required.",tag); - } - } + throw CoreException("You have not defined a <"+std::string(tag)+"> tag, this is required."); return false; } return true; @@ -198,7 +164,6 @@ bool ServerConfig::CheckOnce(char* tag, bool bail, userrec* user) bool NoValidation(ServerConfig* conf, const char* tag, const char* value, ValueItem &data) { - conf->GetInstance()->Log(DEBUG,"No validation for <%s:%s>",tag,value); return true; } @@ -244,7 +209,6 @@ bool InitializeDisabledCommands(const char* data, InspIRCd* ServerInstance) nspace::hash_map::iterator cm = ServerInstance->Parser->cmdlist.find(thiscmd); if (cm != ServerInstance->Parser->cmdlist.end()) { - ServerInstance->Log(DEBUG,"Disabling command '%s'",cm->second->command.c_str()); cm->second->Disable(true); } } @@ -291,6 +255,13 @@ bool ValidateDnsServer(ServerConfig* conf, const char* tag, const char* value, V bool ValidateServerName(ServerConfig* conf, const char* tag, const char* value, ValueItem &data) { + /* If we already have a servername, and they changed it, we should throw an exception. */ + if ((strcasecmp(conf->ServerName, data.GetString())) && (*conf->ServerName)) + { + throw CoreException("Configuration error: You cannot change your servername at runtime! Please restart your server for this change to be applied."); + /* XXX: We don't actually reach this return of course... */ + return false; + } if (!strchr(data.GetString(),'.')) { conf->GetInstance()->Log(DEFAULT,"WARNING: '%s' is not a fully-qualified domain name. Changed to '%s%c'",data.GetString(),data.GetString(),'.'); @@ -368,8 +339,14 @@ bool ValidateWhoWas(ServerConfig* conf, const char* tag, const char* value, Valu conf->WhoWasMaxKeep = 3600; conf->GetInstance()->Log(DEFAULT,"WARNING: value less than 3600, setting to default 3600"); } - conf->GetInstance()->Log(DEBUG,"whowas:groupsize:%d maxgroups:%d maxkeep:%d",conf->WhoWasGroupSize,conf->WhoWasMaxGroups,conf->WhoWasMaxKeep); - irc::whowas::PruneWhoWas(conf->GetInstance(), conf->GetInstance()->Time()); + + command_t* whowas_command = conf->GetInstance()->Parser->GetHandler("WHOWAS"); + if (whowas_command) + { + std::deque params; + whowas_command->HandleInternal(WHOWAS_PRUNE, params); + } + return true; } @@ -417,7 +394,6 @@ bool DoConnect(ServerConfig* conf, const char* tag, char** entries, ValueList &v */ bool DoneConnect(ServerConfig* conf, const char* tag) { - conf->GetInstance()->Log(DEBUG,"DoneConnect called for tag: %s",tag); return true; } @@ -434,7 +410,6 @@ bool InitULine(ServerConfig* conf, const char* tag) bool DoULine(ServerConfig* conf, const char* tag, char** entries, ValueList &values, int* types) { const char* server = values[0].GetString(); - conf->GetInstance()->Log(DEBUG,"Read ULINE '%s'",server); conf->ulines.push_back(server); return true; } @@ -586,7 +561,7 @@ void ServerConfig::Read(bool bail, userrec* user) {"server", "name", "", new ValueContainerChar (this->ServerName), DT_CHARPTR, ValidateServerName}, {"server", "description", "Configure Me", new ValueContainerChar (this->ServerDesc), DT_CHARPTR, NoValidation}, {"server", "network", "Network", new ValueContainerChar (this->Network), DT_CHARPTR, NoValidation}, - {"admin", "name", "Miss Configured", new ValueContainerChar (this->AdminName), DT_CHARPTR, NoValidation}, + {"admin", "name", "", new ValueContainerChar (this->AdminName), DT_CHARPTR, NoValidation}, {"admin", "email", "Mis@configu.red", new ValueContainerChar (this->AdminEmail), DT_CHARPTR, NoValidation}, {"admin", "nick", "Misconfigured", new ValueContainerChar (this->AdminNick), DT_CHARPTR, NoValidation}, {"files", "motd", "", new ValueContainerChar (this->motd), DT_CHARPTR, ValidateMotd}, @@ -657,25 +632,25 @@ void ServerConfig::Read(bool bail, userrec* user) {"reason", "ipmask", NULL}, {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, - InitXLine, DoZLine, DoneXLine}, + InitXLine, DoZLine, DoneZLine}, {"badnick", {"reason", "nick", NULL}, {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, - InitXLine, DoQLine, DoneXLine}, + InitXLine, DoQLine, DoneQLine}, {"badhost", {"reason", "host", NULL}, {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, - InitXLine, DoKLine, DoneXLine}, + InitXLine, DoKLine, DoneKLine}, {"exception", {"reason", "host", NULL}, {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, - InitXLine, DoELine, DoneXLine}, + InitXLine, DoELine, DoneELine}, {"type", {"name", "classes", NULL}, @@ -731,7 +706,8 @@ void ServerConfig::Read(bool bail, userrec* user) ConfValue(this->config_data, Values[Index].tag, Values[Index].value, Values[Index].default_value, 0, item, MAXBUF, allow_newlines); ValueItem vi(item); - Values[Index].validation_function(this, Values[Index].tag, Values[Index].value, vi); + if (!Values[Index].validation_function(this, Values[Index].tag, Values[Index].value, vi)) + throw CoreException("One or more values in your configuration file failed to validate. Please see your ircd.log for more information."); switch (Values[Index].datatype) { @@ -961,10 +937,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o { case '\n': if (in_quote) - { - ServerInstance->Log(DEBUG, "Got \\n inside value"); line += '\n'; - } linenumber++; case '\r': if (!in_quote) @@ -989,11 +962,9 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o if ((ch == '\\') && (in_quote) && (in_tag)) { line += ch; - ServerInstance->Log(DEBUG,"Escape sequence in config line."); char real_character; if (conf.get(real_character)) { - ServerInstance->Log(DEBUG,"Escaping %c", real_character); if (real_character == 'n') real_character = '\n'; line += real_character; @@ -1304,7 +1275,6 @@ bool ServerConfig::ConfValue(ConfigDataHash &target, const std::string &tag, con if (!default_value.empty()) { result = default_value; - ServerInstance->Log(DEBUG, "No config option for '%s' in tag <%s> using default: %s", var.c_str(), tag.c_str(), default_value.c_str()); return true; } } @@ -1313,14 +1283,8 @@ bool ServerConfig::ConfValue(ConfigDataHash &target, const std::string &tag, con if (!default_value.empty()) { result = default_value; - ServerInstance->Log(DEBUG, "No <%s:%s> tags in config file using default: %s", tag.c_str(), var.c_str(), default_value.c_str()); return true; } - ServerInstance->Log(DEBUG, "No <%s> tags in config file.", tag.c_str()); - } - else - { - ServerInstance->Log(DEBUG, "ConfValue got an out-of-range index %d, there are only %d occurences of %s", pos, target.count(tag), tag.c_str()); } return false; } @@ -1348,6 +1312,42 @@ bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const std::string &t stream.str(value); if(!(stream >> result)) return false; + else + { + if (!value.empty()) + { + if (value.substr(0,2) == "0x") + { + char* endptr; + + value.erase(0,2); + result = strtol(value.c_str(), &endptr, 16); + + /* No digits found */ + if (endptr == value.c_str()) + return false; + } + else + { + char denominator = *(value.end() - 1); + switch (toupper(denominator)) + { + case 'K': + /* Kilobytes -> bytes */ + result = result * 1024; + break; + case 'M': + /* Megabytes -> bytes */ + result = result * 1024 * 1024; + break; + case 'G': + /* Gigabytes -> bytes */ + result = result * 1024 * 1024 * 1024; + break; + } + } + } + } return r; } @@ -1404,14 +1404,6 @@ int ServerConfig::ConfVarEnum(ConfigDataHash &target, const std::string &tag, in return iter->second.size(); } - else if(pos == 0) - { - ServerInstance->Log(DEBUG, "No <%s> tags in config file.", tag.c_str()); - } - else - { - ServerInstance->Log(DEBUG, "ConfVarEnum got an out-of-range index %d, there are only %d occurences of %s", pos, target.count(tag), tag.c_str()); - } return 0; } @@ -1420,6 +1412,9 @@ int ServerConfig::ConfVarEnum(ConfigDataHash &target, const std::string &tag, in */ bool ServerConfig::ReadFile(file_cache &F, const char* fname) { + if (!fname || !*fname) + return false; + FILE* file = NULL; char linebuf[MAXBUF];