]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configreader.cpp
Ignore clients on ulined servers when reporting stats in LUSERS.
[user/henk/code/inspircd.git] / src / configreader.cpp
index 00880cfff80d88babd47c69d635f644a7d179704..31bbfa9542441c7be1170fb39fc1b9cd8e8753b4 100644 (file)
@@ -74,19 +74,29 @@ ServerConfig::~ServerConfig()
 
 static void ReadXLine(ServerConfig* conf, const std::string& tag, const std::string& key, XLineFactory* make)
 {
+       insp::flat_set<std::string> configlines;
+
        ConfigTagList tags = conf->ConfTags(tag);
        for(ConfigIter i = tags.first; i != tags.second; ++i)
        {
                ConfigTag* ctag = i->second;
-               std::string mask;
-               if (!ctag->readString(key, mask))
-                       throw CoreException("<"+tag+":"+key+"> missing at " + ctag->getTagLocation());
-               std::string reason = ctag->getString("reason", "<Config>");
-               XLine* xl = make->Generate(ServerInstance->Time(), 0, "<Config>", reason, mask);
+
+               const std::string mask = ctag->getString(key);
+               if (mask.empty())
+                       throw CoreException("<" + tag + ":" + key + "> missing at " + ctag->getTagLocation());
+
+               const std::string reason = ctag->getString("reason");
+               if (reason.empty())
+                       throw CoreException("<" + tag + ":reason> missing at " + ctag->getTagLocation());
+
+               XLine* xl = make->Generate(ServerInstance->Time(), 0, ServerInstance->Config->ServerName, reason, mask);
                xl->from_config = true;
+               configlines.insert(xl->Displayable());
                if (!ServerInstance->XLines->AddLine(xl, NULL))
                        delete xl;
        }
+
+       ServerInstance->XLines->ExpireRemovedConfigLines(make->GetType(), configlines);
 }
 
 typedef std::map<std::string, ConfigTag*> LocalIndex;
@@ -358,7 +368,8 @@ void ServerConfig::Fill()
                        throw CoreException("You must restart to change the server id");
 
                std::string casemapping = options->getString("casemapping");
-               if (!casemapping.empty() && casemapping != CaseMapping)
+               // Ignore this value if CaseMapping is set to something the core doesn't provide (i.e., m_nationalchars).
+               if (!casemapping.empty() && casemapping != CaseMapping && (CaseMapping == "ascii" || CaseMapping == "rfc1459"))
                        throw CoreException("You must restart to change the server casemapping");
 
        }
@@ -405,7 +416,6 @@ void ServerConfig::Fill()
                        SocketEngine::Close(socktest);
        }
 
-       ServerInstance->XLines->ClearConfigLines();
        ReadXLine(this, "badip", "ipmask", ServerInstance->XLines->GetFactory("Z"));
        ReadXLine(this, "badnick", "nick", ServerInstance->XLines->GetFactory("Q"));
        ReadXLine(this, "badhost", "host", ServerInstance->XLines->GetFactory("K"));
@@ -500,18 +510,17 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
                ServerInstance->BindPorts(pl);
                if (pl.size())
                {
-                       errstr << "Not all your client ports could be bound." << std::endl
-                               << "The following port(s) failed to bind:" << std::endl;
-
-                       int j = 1;
-                       for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
+                       std::cout << "Warning! Some of your listener" << (pl.size() == 1 ? "s" : "") << " failed to bind:" << std::endl;
+                       for (FailedPortList::const_iterator iter = pl.begin(); iter != pl.end(); ++iter)
                        {
-                               errstr << j << ".\tAddress: " << i->first.str() << "\tReason: " << strerror(i->second) << std::endl;
+                               const FailedPort& fp = *iter;
+                               errstr << "  " << fp.sa.str() << ": " << strerror(fp.error) << std::endl
+                                       << "  " << "Created from <bind> tag at " << fp.tag->getTagLocation() << std::endl;
                        }
                }
        }
 
-       User* user = useruid.empty() ? NULL : ServerInstance->FindNick(useruid);
+       User* user = useruid.empty() ? NULL : ServerInstance->FindUUID(useruid);
 
        if (!valid)
        {
@@ -695,7 +704,7 @@ void ConfigReaderThread::Finish()
                ServerInstance->Users.RehashCloneCounts();
                ServerInstance->XLines->CheckELines();
                ServerInstance->XLines->ApplyLines();
-               User* user = ServerInstance->FindNick(TheUserUID);
+               User* user = ServerInstance->FindUUID(TheUserUID);
 
                ConfigStatus status(user);
                const ModuleManager::ModuleMap& mods = ServerInstance->Modules->GetModules();