Enable specifying directories in plugin-files.

This commit is contained in:
Shea Levy 2018-02-13 07:51:52 -05:00
parent f471aacff2
commit b8739f2fb3
No known key found for this signature in database
GPG key ID: 5C0BD6957D86FE27
2 changed files with 22 additions and 6 deletions

View file

@ -764,6 +764,10 @@ builtins.fetchurl {
should not be linked to any Nix libs directly, as those will should not be linked to any Nix libs directly, as those will
be available already at load time. be available already at load time.
</para> </para>
<para>
If an entry in the list is a directory, all files in the
directory are loaded as plugins (non-recursively).
</para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View file

@ -142,12 +142,24 @@ void MaxBuildJobsSetting::set(const std::string & str)
void initPlugins() void initPlugins()
{ {
for (const auto & pluginFile : settings.pluginFiles.get()) { for (const auto & pluginFile : settings.pluginFiles.get()) {
Paths pluginFiles;
try {
auto ents = readDirectory(pluginFile);
for (const auto & ent : ents)
pluginFiles.emplace_back(pluginFile + "/" + ent.name);
} catch (SysError & e) {
if (e.errNo != ENOTDIR)
throw;
pluginFiles.emplace_back(pluginFile);
}
for (const auto & file : pluginFiles) {
/* handle is purposefully leaked as there may be state in the /* handle is purposefully leaked as there may be state in the
DSO needed by the action of the plugin. */ DSO needed by the action of the plugin. */
void *handle = void *handle =
dlopen(pluginFile.c_str(), RTLD_LAZY | RTLD_LOCAL); dlopen(file.c_str(), RTLD_LAZY | RTLD_LOCAL);
if (!handle) if (!handle)
throw Error(format("could not dynamically open plugin file '%1%': %2%") % pluginFile % dlerror()); throw Error("could not dynamically open plugin file '%s%': %s%", file, dlerror());
}
} }
} }