]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add an <include> option to allow certain config files to not exist.
authorSadie Powell <sadie@witchery.services>
Fri, 19 Mar 2021 00:51:09 +0000 (00:51 +0000)
committerSadie Powell <sadie@witchery.services>
Fri, 19 Mar 2021 00:51:09 +0000 (00:51 +0000)
This is useful when using modules that generate a config file such
as the filter and permchannels modules.

docs/conf/modules.conf.example
src/configparser.cpp

index 4be14c96056278568c95317e76d88d388d3ed253..6eb61cc38fcac8a5004249de3107576bfca71632 100644 (file)
 #<permchanneldb filename="permchannels.conf"
 #               listmodes="yes"
 #               saveperiod="5s">
-#<include file="permchannels.conf">
+#<include file="permchannels.conf" missingokay="yes">
 #
 # You may also create channels on startup by using the <permchannels> block.
 #<permchannels channel="#opers" modes="isP" topic="Opers only.">
index 556442627570796b2e293ce2cd647ad714031884..9f5a49f1daffc65d401304f36803fb982d268a3d 100644 (file)
@@ -39,7 +39,10 @@ enum ParseFlags
        FLAG_NO_INC = 4,
 
        // &env.FOO; is disabled.
-       FLAG_NO_ENV = 8
+       FLAG_NO_ENV = 8,
+
+       // It's okay if an include doesn't exist.
+       FLAG_MISSING_OKAY = 16
 };
 
 // Represents the position within a config file.
@@ -420,11 +423,18 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags)
        {
                if (tag->getBool("noinclude", false))
                        flags |= FLAG_NO_INC;
+
                if (tag->getBool("noexec", false))
                        flags |= FLAG_NO_EXEC;
+
                if (tag->getBool("noenv", false))
                        flags |= FLAG_NO_ENV;
 
+               if (tag->getBool("missingokay", false))
+                       flags |= FLAG_MISSING_OKAY;
+               else
+                       flags &= ~FLAG_MISSING_OKAY;
+
                if (!ParseFile(ServerInstance->Config->Paths.PrependConfig(name), flags, mandatorytag))
                        throw CoreException("Included");
        }
@@ -504,7 +514,12 @@ bool ParseStack::ParseFile(const std::string& path, int flags, const std::string
 
        FileWrapper file((isexec ? popen(path.c_str(), "r") : fopen(path.c_str(), "r")), isexec);
        if (!file)
+       {
+               if (flags & FLAG_MISSING_OKAY)
+                       return true;
+
                throw CoreException("Could not read \"" + path + "\" for include");
+       }
 
        reading.push_back(path);
        Parser p(*this, flags, file, path, mandatory_tag);