X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=bcee938d55208e1aefc3dcc5d0db93cf81820175;hb=4e3d7a6e30eadf714483994681b8b2534229f4a8;hp=660df77d7025b2065525b6c1cc4627fd6d145cd8;hpb=c05ad37bfd03486475889485606ed5cffc7bf5a2;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index 660df77d7..bcee938d5 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -28,12 +28,14 @@ #include "exitcodes.h" #include "commands/cmd_whowas.h" #include "configparser.h" +#include #ifdef _WIN32 #include #pragma comment(lib, "Iphlpapi.lib") #endif ServerConfig::ServerConfig() + : NoSnoticeStack(false) { WhoWasGroupSize = WhoWasMaxGroups = WhoWasMaxKeep = 0; RawLog = NoUserDns = HideBans = HideSplits = UndernetMsgPrefix = false; @@ -47,6 +49,14 @@ ServerConfig::ServerConfig() OperMaxChans = 30; c_ipv4_range = 32; c_ipv6_range = 128; + + std::vector* items; + EmptyTag = ConfigTag::create("empty", "", 0, items); +} + +ServerConfig::~ServerConfig() +{ + delete EmptyTag; } void ServerConfig::Update005() @@ -388,7 +398,7 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) throw CoreException("Two connect classes with name \"" + name + "\" defined!"); names[name] = i; - ConnectClass* me = parent ? + ConnectClass* me = parent ? new ConnectClass(tag, type, mask, *parent) : new ConnectClass(tag, type, mask); @@ -470,7 +480,7 @@ static const Deprecated ChangedConfig[] = { {"die", "value", "you need to reread your config"}, {"bind", "transport", "has been moved to as of 2.0a1"}, {"link", "transport", "has been moved to as of 2.0a1"}, - + {"link", "autoconnect", "2.0+ does not use the autoconnect value. Please define tags instead."}, }; void ServerConfig::Fill() @@ -553,7 +563,8 @@ void ServerConfig::Fill() WelcomeNotice = options->getBool("welcomenotice", true); range(SoftLimit, 10, ServerInstance->SE->GetMaxFds(), ServerInstance->SE->GetMaxFds(), ""); - range(MaxConn, 0, SOMAXCONN, SOMAXCONN, ""); + if (ConfValue("performance")->getBool("limitsomaxconn", true)) + range(MaxConn, 0, SOMAXCONN, SOMAXCONN, ""); range(MaxTargets, 1, 31, 20, ""); range(NetBufferSize, 1024, 65534, 10240, ""); range(WhoWasGroupSize, 0, 10000, 10, ""); @@ -609,7 +620,9 @@ void ServerConfig::Fill() std::string modes = ConfValue("disabled")->getString("usermodes"); for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) { - if (*p < 'A' || *p > ('A' + 64)) throw CoreException("Invalid usermode " + std::string(1, *p) + " was found."); + // Complain when the character is not a-z or A-Z + if ((*p < 'A') || (*p > 'z') || ((*p < 'a') && (*p > 'Z'))) + throw CoreException("Invalid usermode " + std::string(1, *p) + " was found."); DisabledUModes[*p - 'A'] = 1; } @@ -617,7 +630,8 @@ void ServerConfig::Fill() modes = ConfValue("disabled")->getString("chanmodes"); for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) { - if (*p < 'A' || *p > ('A' + 64)) throw CoreException("Invalid chanmode " + std::string(1, *p) + " was found."); + if ((*p < 'A') || (*p > 'z') || ((*p < 'a') && (*p > 'Z'))) + throw CoreException("Invalid chanmode " + std::string(1, *p) + " was found."); DisabledCModes[*p - 'A'] = 1; } @@ -644,8 +658,6 @@ void ServerConfig::Fill() OperSpyWhois = SPYWHOIS_SINGLEMSG; else OperSpyWhois = SPYWHOIS_NONE; - - Limits.Finalise(); } // WARNING: it is not safe to use most of the codebase in this function, as it @@ -718,7 +730,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) if (valid) ServerInstance->WritePID(this->PID); - if (old) + if (old && valid) { // On first run, ports are bound later on FailedPortList pl; @@ -740,7 +752,10 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) User* user = useruid.empty() ? NULL : ServerInstance->FindNick(useruid); if (!valid) + { ServerInstance->Logs->Log("CONFIG",DEFAULT, "There were errors in your configuration file:"); + Classes.clear(); + } while (errstr.good()) { @@ -750,7 +765,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) continue; // On startup, print out to console (still attached at this point) if (!old) - printf("%s\n", line.c_str()); + std::cout << line << std::endl; // If a user is rehashing, tell them directly if (user) user->SendText(":%s NOTICE %s :*** %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), line.c_str()); @@ -769,14 +784,13 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) if(!tag->getBool("allowmotdcolors")) continue; - ConfigFileCache::iterator motdfile = this->Files.find(tag->getString("motd", "motd")); - ConfigFileCache::iterator rulesfile = this->Files.find(tag->getString("rules", "rules")); - - if(motdfile != this->Files.end()) - this->ProcessColors(motdfile); + ConfigFileCache::iterator file = this->Files.find(tag->getString("motd", "motd")); + if (file != this->Files.end()) + InspIRCd::ProcessColors(file->second); - if(rulesfile != this->Files.end()) - this->ProcessColors(rulesfile); + file = this->Files.find(tag->getString("rules", "rules")); + if (file != this->Files.end()) + InspIRCd::ProcessColors(file->second); } /* No old configuration -> initial boot, nothing more to do here */ @@ -883,7 +897,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) @@ -897,63 +911,6 @@ ConfigTagList ServerConfig::ConfTags(const std::string& tag) return config_data.equal_range(tag); } -/* - * Replace all color codes from the special[] array to actual - * color code chars using C++ style escape sequences. You - * can append other chars to replace if you like -- Justasic - */ -void ServerConfig::ProcessColors(ConfigFileCache::iterator &file) -{ - static struct special_chars - { - std::string character; - std::string replace; - special_chars(const std::string &c, const std::string &r) : character(c), replace(r) { } - } - - special[] = { - special_chars("\\002", "\002"), // Bold - special_chars("\\037", "\037"), // underline - special_chars("\\003", "\003"), // Color - special_chars("\\017", "\017"), // Stop colors - special_chars("\\u", "\037"), // Alias for underline - special_chars("\\b", "\002"), // Alias for Bold - special_chars("\\x", "\017"), // Alias for stop - special_chars("\\c", "\003"), // Alias for color - special_chars("", "") - }; - - for(file_cache::iterator it = file->second.begin(), it_end = file->second.end(); it != it_end; it++) - { - std::string ret = *it; - for(int i = 0; special[i].character.empty() == false; ++i) - { - std::string::size_type pos = ret.find(special[i].character); - if(pos == std::string::npos) // Couldn't find the character, skip this line - continue; - - if((pos > 0) && (ret[pos-1] == '\\') && (ret[pos] == '\\')) - continue; // Skip double slashes. - - // Replace all our characters in the array - while(pos != std::string::npos) - { - ret = ret.substr(0, pos) + special[i].replace + ret.substr(pos + special[i].character.size()); - pos = ret.find(special[i].character, pos + special[i].replace.size()); - } - } - - // Replace double slashes with a single slash before we return - std::string::size_type pos = ret.find("\\\\"); - while(pos != std::string::npos) - { - ret = ret.substr(0, pos) + "\\" + ret.substr(pos + 2); - pos = ret.find("\\\\", pos + 1); - } - *it = ret; - } -} - bool ServerConfig::FileExists(const char* file) { struct stat sb; @@ -1006,6 +963,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(); ServerInstance->Res->Rehash();