]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configparser.cpp
Clean up wildcard code.
[user/henk/code/inspircd.git] / src / configparser.cpp
index 7d9eab651a88f81719e9f4b216cc8db090652301..1783e901e8f8a23f725a537479fab617a36b2c8e 100644 (file)
@@ -119,7 +119,7 @@ struct Parser
                while (1)
                {
                        ch = next();
-                       if (ch == '&' && (flags & FLAG_USE_XML))
+                       if (ch == '&' && !(flags & FLAG_USE_COMPAT))
                        {
                                std::string varname;
                                while (1)
@@ -141,7 +141,7 @@ struct Parser
                                        throw CoreException("Undefined XML entity reference '&" + varname + ";'");
                                value.append(var->second);
                        }
-                       else if (ch == '\\' && !(flags & FLAG_USE_XML))
+                       else if (ch == '\\' && (flags & FLAG_USE_COMPAT))
                        {
                                int esc = next();
                                if (esc == 'n')
@@ -183,7 +183,10 @@ struct Parser
                std::set<std::string> seen;
                tag = ConfigTag::create(name, current.filename, current.line, items);
 
-               while (kv(items, seen));
+               while (kv(items, seen))
+               {
+                       // Do nothing here (silences a GCC warning).
+               }
 
                if (name == mandatory_tag)
                {
@@ -211,7 +214,7 @@ struct Parser
                }
                else if (name == "define")
                {
-                       if (!(flags & FLAG_USE_XML))
+                       if (flags & FLAG_USE_COMPAT)
                                throw CoreException("<define> tags may only be used in XML-style config (add <config format=\"xml\">)");
                        std::string varname = tag->getString("name");
                        std::string value = tag->getString("value");
@@ -223,9 +226,9 @@ struct Parser
                {
                        std::string format = tag->getString("format");
                        if (format == "xml")
-                               flags |= FLAG_USE_XML;
+                               flags &= ~FLAG_USE_COMPAT;
                        else if (format == "compat")
-                               flags &= ~FLAG_USE_XML;
+                               flags |= FLAG_USE_COMPAT;
                        else if (!format.empty())
                                throw CoreException("Unknown configuration format " + format);
                }
@@ -320,14 +323,15 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int
        if (exec && (flags & FLAG_NO_EXEC))
                throw CoreException("Invalid <execfiles> tag in file included with noexec=\"yes\"");
 
-       FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(name.c_str(), "r"), exec);
+       std::string path = ServerInstance->Config->Paths.PrependConfig(name);
+       FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(path.c_str(), "r"), exec);
        if (!file)
-               throw CoreException("Could not read \"" + name + "\" for \"" + key + "\" file");
+               throw CoreException("Could not read \"" + path + "\" for \"" + key + "\" file");
 
        file_cache& cache = FilesOutput[key];
        cache.clear();
 
-       char linebuf[MAXBUF*10];
+       char linebuf[5120];
        while (fgets(linebuf, sizeof(linebuf), file))
        {
                size_t len = strlen(linebuf);
@@ -342,23 +346,24 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int
 
 bool ParseStack::ParseFile(const std::string& name, int flags, const std::string& mandatory_tag)
 {
-       ServerInstance->Logs->Log("CONFIG", DEBUG, "Reading file %s", name.c_str());
+       std::string path = ServerInstance->Config->Paths.PrependConfig(name);
+       ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading file %s", path.c_str());
        for (unsigned int t = 0; t < reading.size(); t++)
        {
                if (std::string(name) == reading[t])
                {
-                       throw CoreException("File " + name + " is included recursively (looped inclusion)");
+                       throw CoreException("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(name.c_str(), "r"));
+       FileWrapper file(fopen(path.c_str(), "r"));
        if (!file)
-               throw CoreException("Could not read \"" + name + "\" for include");
+               throw CoreException("Could not read \"" + path + "\" for include");
 
-       reading.push_back(name);
-       Parser p(*this, flags, file, name, mandatory_tag);
+       reading.push_back(path);
+       Parser p(*this, flags, file, path, mandatory_tag);
        bool ok = p.outer_parse();
        reading.pop_back();
        return ok;
@@ -366,7 +371,7 @@ bool ParseStack::ParseFile(const std::string& name, int flags, const std::string
 
 bool ParseStack::ParseExec(const std::string& name, int flags, const std::string& mandatory_tag)
 {
-       ServerInstance->Logs->Log("CONFIG", DEBUG, "Reading executable %s", name.c_str());
+       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])
@@ -399,7 +404,7 @@ bool ConfigTag::readString(const std::string& key, std::string& value, bool allo
                value = j->second;
                if (!allow_lf && (value.find('\n') != std::string::npos))
                {
-                       ServerInstance->Logs->Log("CONFIG",DEFAULT, "Value of <" + tag + ":" + key + "> at " + getTagLocation() +
+                       ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "Value of <" + tag + ":" + key + "> at " + getTagLocation() +
                                " contains a linefeed, and linefeeds in this value are not permitted -- stripped to spaces.");
                        for (std::string::iterator n = value.begin(); n != value.end(); n++)
                                if (*n == '\n')
@@ -417,7 +422,7 @@ std::string ConfigTag::getString(const std::string& key, const std::string& def)
        return res;
 }
 
-long ConfigTag::getInt(const std::string &key, long def)
+long ConfigTag::getInt(const std::string &key, long def, long min, long max)
 {
        std::string result;
        if(!readString(key, result))
@@ -431,15 +436,21 @@ long ConfigTag::getInt(const std::string &key, long def)
        switch (toupper(*res_tail))
        {
                case 'K':
-                       res= res* 1024;
+                       res = res * 1024;
                        break;
                case 'M':
-                       res= res* 1024 * 1024;
+                       res = res * 1024 * 1024;
                        break;
                case 'G':
-                       res= res* 1024 * 1024 * 1024;
+                       res = res * 1024 * 1024 * 1024;
                        break;
        }
+       if (res < min || res > max)
+       {
+               ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "WARNING: <%s:%s> value of %ld is not between %ld and %ld; set to %ld.",
+                       tag.c_str(), key.c_str(), res, min, max, def);
+               res = def;
+       }
        return res;
 }
 
@@ -462,7 +473,7 @@ bool ConfigTag::getBool(const std::string &key, bool def)
        if (result == "no" || result == "false" || result == "0" || result == "off")
                return false;
 
-       ServerInstance->Logs->Log("CONFIG",DEFAULT, "Value of <" + tag + ":" + key + "> at " + getTagLocation() +
+       ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "Value of <" + tag + ":" + key + "> at " + getTagLocation() +
                " is not valid, ignoring");
        return def;
 }