Merge pull request #1862 from shlevy/plugin-dirs

Enable specifying directories in plugin-files.
This commit is contained in:
Eelco Dolstra 2018-02-13 17:32:32 +01:00 committed by GitHub
commit 7253113fd2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
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
be available already at load time.
</para>
<para>
If an entry in the list is a directory, all files in the
directory are loaded as plugins (non-recursively).
</para>
</listitem>
</varlistentry>

View file

@ -142,12 +142,24 @@ void MaxBuildJobsSetting::set(const std::string & str)
void initPlugins()
{
for (const auto & pluginFile : settings.pluginFiles.get()) {
/* handle is purposefully leaked as there may be state in the
DSO needed by the action of the plugin. */
void *handle =
dlopen(pluginFile.c_str(), RTLD_LAZY | RTLD_LOCAL);
if (!handle)
throw Error(format("could not dynamically open plugin file '%1%': %2%") % pluginFile % dlerror());
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
DSO needed by the action of the plugin. */
void *handle =
dlopen(file.c_str(), RTLD_LAZY | RTLD_LOCAL);
if (!handle)
throw Error("could not dynamically open plugin file '%s%': %s%", file, dlerror());
}
}
}