diff options
author | Max Kellermann <max@musicpd.org> | 2018-07-17 20:12:42 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2018-07-18 11:27:41 +0200 |
commit | d06ef76e58e1fed9d7ec037ee75fad4cba934ccd (patch) | |
tree | cdb45f59804e498fdef86c330a2f220a1f5726df /src | |
parent | 57729683b69033b2a611f6d2fcd3ae812d3d6f0a (diff) |
config/File: implement the "include" directive
This is an experimental draft. More needs to be done.
Diffstat (limited to 'src')
-rw-r--r-- | src/config/File.cxx | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/config/File.cxx b/src/config/File.cxx index 29c073f3b..7b6838bf2 100644 --- a/src/config/File.cxx +++ b/src/config/File.cxx @@ -25,6 +25,7 @@ #include "Templates.hxx" #include "util/Tokenizer.hxx" #include "util/StringStrip.hxx" +#include "util/StringAPI.hxx" #include "util/Domain.hxx" #include "util/RuntimeError.hxx" #include "fs/Path.hxx" @@ -152,8 +153,11 @@ ReadConfigParam(ConfigData &config_data, BufferedReader &reader, reader.GetLineNumber())); } +/** + * @param directory the directory used to resolve relative paths + */ static void -ReadConfigFile(ConfigData &config_data, BufferedReader &reader) +ReadConfigFile(ConfigData &config_data, BufferedReader &reader, Path directory) { while (true) { char *line = reader.ReadLine(); @@ -171,6 +175,16 @@ ReadConfigFile(ConfigData &config_data, BufferedReader &reader) const char *name = tokenizer.NextWord(); assert(name != nullptr); + if (StringIsEqual(name, "include")) { + // TODO: allow absolute path specifications + // TODO: detect recusion + // TODO: Config{Block,Param} have only line number but no file name + // TODO: support wildcards (include "conf.d/*.conf") + // TODO: add "include_optional" + ReadConfigFile(config_data, directory / AllocatedPath::FromUTF8Throw(ExpectValueAndEnd(tokenizer))); + continue; + } + /* get the definition of that option, and check the "repeatable" flag */ @@ -202,7 +216,7 @@ ReadConfigFile(ConfigData &config_data, Path path) BufferedReader reader(file); try { - ReadConfigFile(config_data, reader); + ReadConfigFile(config_data, reader, path.GetDirectoryName()); } catch (...) { std::throw_with_nested(FormatRuntimeError("Error in %s line %u", path_utf8.c_str(), |