Add an <include> option to allow certain config files to not exist.

This is useful when using modules that generate a config file such
as the filter and permchannels modules.
This commit is contained in:
Sadie Powell 2021-03-19 00:51:09 +00:00
parent 37f068576e
commit 99bb7ac8bd
2 changed files with 17 additions and 2 deletions

View File

@ -1766,7 +1766,7 @@
#<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.">

View 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);