]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configparser.cpp
Keep multiple IOHookProvider references in class ListenSocket
[user/henk/code/inspircd.git] / src / configparser.cpp
index 2f3fbb5b43471a03cfa14a3ffdaa76747dd04ca0..3be1ac9c53d39ce44f0a79dcd6d81defa55735f9 100644 (file)
@@ -155,7 +155,7 @@ struct Parser
                                }
                                else
                                {
-                                       std::map<std::string, std::string>::iterator var = stack.vars.find(varname);
+                                       insp::flat_map<std::string, std::string>::iterator var = stack.vars.find(varname);
                                        if (var == stack.vars.end())
                                                throw CoreException("Undefined XML entity reference '&" + varname + ";'");
                                        value.append(var->second);
@@ -331,7 +331,7 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags)
                        flags |= FLAG_NO_INC;
                if (tag->getBool("noexec", true))
                        flags |= FLAG_NO_EXEC;
-               if (!ParseExec(name, flags, mandatorytag))
+               if (!ParseFile(name, flags, mandatorytag, true))
                        throw CoreException("Included");
        }
 }
@@ -364,20 +364,15 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int
        }
 }
 
-bool ParseStack::ParseFile(const std::string& path, int flags, const std::string& mandatory_tag)
+bool ParseStack::ParseFile(const std::string& path, int flags, const std::string& mandatory_tag, bool isexec)
 {
-       ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading file %s", path.c_str());
-       for (unsigned int t = 0; t < reading.size(); t++)
-       {
-               if (path == reading[t])
-               {
-                       throw CoreException("File " + path + " is included recursively (looped inclusion)");
-               }
-       }
+       ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading (isexec=%d) %s", isexec, path.c_str());
+       if (stdalgo::isin(reading, path))
+               throw CoreException((isexec ? "Executable " : "File ") + path + " is included recursively (looped inclusion)");
 
        /* It's not already included, add it to the list of files we've loaded */
 
-       FileWrapper file(fopen(path.c_str(), "r"));
+       FileWrapper file((isexec ? popen(path.c_str(), "r") : fopen(path.c_str(), "r")), isexec);
        if (!file)
                throw CoreException("Could not read \"" + path + "\" for include");
 
@@ -388,34 +383,8 @@ bool ParseStack::ParseFile(const std::string& path, int flags, const std::string
        return ok;
 }
 
-bool ParseStack::ParseExec(const std::string& name, int flags, const std::string& mandatory_tag)
-{
-       ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading executable %s", name.c_str());
-       for (unsigned int t = 0; t < reading.size(); t++)
-       {
-               if (std::string(name) == reading[t])
-               {
-                       throw CoreException("Executable " + name + " is included recursively (looped inclusion)");
-               }
-       }
-
-       /* It's not already included, add it to the list of files we've loaded */
-
-       FileWrapper file(popen(name.c_str(), "r"), true);
-       if (!file)
-               throw CoreException("Could not open executable \"" + name + "\" for include");
-
-       reading.push_back(name);
-       Parser p(*this, flags, file, name, mandatory_tag);
-       bool ok = p.outer_parse();
-       reading.pop_back();
-       return ok;
-}
-
 bool ConfigTag::readString(const std::string& key, std::string& value, bool allow_lf)
 {
-       if (!this)
-               return false;
        for(std::vector<KeyVal>::iterator j = items.begin(); j != items.end(); ++j)
        {
                if(j->first != key)