diff options
author | Sadie Powell <sadie@witchery.services> | 2021-03-19 00:51:09 +0000 |
---|---|---|
committer | Sadie Powell <sadie@witchery.services> | 2021-03-19 00:51:09 +0000 |
commit | 99bb7ac8bd5844d8ebb4795bb72a02024a28e688 (patch) | |
tree | 4df02b102ea1227a69f08a2cae46fa86410eb393 | |
parent | 37f068576e844da8b6d75853214ce7553adb3a15 (diff) |
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.
-rw-r--r-- | docs/conf/modules.conf.example | 2 | ||||
-rw-r--r-- | src/configparser.cpp | 17 |
2 files changed, 17 insertions, 2 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example index 4be14c960..6eb61cc38 100644 --- a/docs/conf/modules.conf.example +++ b/docs/conf/modules.conf.example @@ -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."> diff --git a/src/configparser.cpp b/src/configparser.cpp index 556442627..9f5a49f1d 100644 --- a/src/configparser.cpp +++ b/src/configparser.cpp @@ -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); |