X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=68495623c778b1a03ad9a02fad1f3e7ac3f87e01;hb=f757c2d75bc284211f3b53b2819b88becfd8632f;hp=15d9298b6503c1751ab0e47ed503e843e1808b4c;hpb=5a6fd54f8fd217232f98804431928609580742bc;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index 15d9298b6..68495623c 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -29,7 +29,31 @@ #include "configparser.h" #include +ServerLimits::ServerLimits(ConfigTag* tag) + : NickMax(tag->getInt("maxnick", 32)) + , ChanMax(tag->getInt("maxchan", 64)) + , MaxModes(tag->getInt("maxmodes", 20)) + , IdentMax(tag->getInt("maxident", 11)) + , MaxQuit(tag->getInt("maxquit", 255)) + , MaxTopic(tag->getInt("maxtopic", 307)) + , MaxKick(tag->getInt("maxkick", 255)) + , MaxGecos(tag->getInt("maxgecos", 128)) + , MaxAway(tag->getInt("maxaway", 200)) + , MaxLine(tag->getInt("maxline", 512)) + , MaxHost(tag->getInt("maxhost", 64)) +{ +} + +static ConfigTag* CreateEmptyTag() +{ + std::vector* items; + return ConfigTag::create("empty", "", 0, items); +} + ServerConfig::ServerConfig() + : EmptyTag(CreateEmptyTag()) + , Limits(EmptyTag) + , NoSnoticeStack(false) { RawLog = HideBans = HideSplits = UndernetMsgPrefix = false; WildcardIPv6 = InvBypassModes = true; @@ -43,6 +67,11 @@ ServerConfig::ServerConfig() c_ipv6_range = 128; } +ServerConfig::~ServerConfig() +{ + delete EmptyTag; +} + static void ValidHost(const std::string& p, const std::string& msg) { int num_dots = 0; @@ -69,17 +98,16 @@ bool ServerConfig::ApplyDisabledCommands(const std::string& data) std::string thiscmd; /* Enable everything first */ - for (Commandtable::iterator x = ServerInstance->Parser->cmdlist.begin(); x != ServerInstance->Parser->cmdlist.end(); x++) + const CommandParser::CommandMap& commands = ServerInstance->Parser.GetCommands(); + for (CommandParser::CommandMap::const_iterator x = commands.begin(); x != commands.end(); ++x) x->second->Disable(false); /* Now disable all the ones which the user wants disabled */ while (dcmds >> thiscmd) { - Commandtable::iterator cm = ServerInstance->Parser->cmdlist.find(thiscmd); - if (cm != ServerInstance->Parser->cmdlist.end()) - { - cm->second->Disable(true); - } + Command* handler = ServerInstance->Parser.GetHandler(thiscmd); + if (handler) + handler->Disable(true); } return true; } @@ -394,17 +422,7 @@ void ServerConfig::Fill() OperMaxChans = ConfValue("channels")->getInt("opers"); c_ipv4_range = ConfValue("cidr")->getInt("ipv4clone", 32); c_ipv6_range = ConfValue("cidr")->getInt("ipv6clone", 128); - Limits.NickMax = ConfValue("limits")->getInt("maxnick", 32); - Limits.ChanMax = ConfValue("limits")->getInt("maxchan", 64); - Limits.MaxModes = ConfValue("limits")->getInt("maxmodes", 20); - Limits.IdentMax = ConfValue("limits")->getInt("maxident", 11); - Limits.MaxHost = ConfValue("limits")->getInt("maxhost", 64); - Limits.MaxQuit = ConfValue("limits")->getInt("maxquit", 255); - Limits.MaxTopic = ConfValue("limits")->getInt("maxtopic", 307); - Limits.MaxKick = ConfValue("limits")->getInt("maxkick", 255); - Limits.MaxGecos = ConfValue("limits")->getInt("maxgecos", 128); - Limits.MaxAway = ConfValue("limits")->getInt("maxaway", 200); - Limits.MaxLine = ConfValue("limits")->getInt("maxline", 512); + Limits = ServerLimits(ConfValue("limits")); Paths.Config = ConfValue("path")->getString("configdir", INSPIRCD_CONFIG_PATH); Paths.Data = ConfValue("path")->getString("datadir", INSPIRCD_DATA_PATH); Paths.Log = ConfValue("path")->getString("logdir", INSPIRCD_LOG_PATH); @@ -458,11 +476,6 @@ void ServerConfig::Fill() DisabledCModes[*p - 'A'] = 1; } - memset(HideModeLists, 0, sizeof(HideModeLists)); - modes = ConfValue("security")->getString("hidemodes"); - for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) - HideModeLists[(unsigned char) *p] = true; - std::string v = security->getString("announceinvites"); if (v == "ops") @@ -563,7 +576,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) errstr << "Possible configuration error: you have not defined any blocks." << std::endl << "You will need to do this if you want clients to be able to connect!" << std::endl; - if (old) + if (old && valid) { // On first run, ports are bound later on FailedPortList pl; @@ -713,7 +726,7 @@ ConfigTag* ServerConfig::ConfValue(const std::string &tag) { ConfigTagList found = config_data.equal_range(tag); if (found.first == found.second) - return NULL; + return EmptyTag; ConfigTag* rv = found.first->second; found.first++; if (found.first != found.second) @@ -772,6 +785,7 @@ void ConfigReaderThread::Finish() * XXX: The order of these is IMPORTANT, do not reorder them without testing * thoroughly!!! */ + ServerInstance->Users.RehashCloneCounts(); ServerInstance->XLines->CheckELines(); ServerInstance->XLines->ApplyLines(); ChanModeReference ban(NULL, "ban"); @@ -784,6 +798,9 @@ void ConfigReaderThread::Finish() for (ModuleManager::ModuleMap::const_iterator i = mods.begin(); i != mods.end(); ++i) i->second->ReadConfig(status); + // The description of this server may have changed - update it for WHOIS etc. + ServerInstance->FakeClient->server->description = Config->ServerDesc; + ServerInstance->ISupport.Build(); ServerInstance->Logs->CloseLogs();