Skip to content

Add nix::setPlugins function to libmain #15621

@cry128

Description

@cry128

Is your feature request related to a problem?

libmain never exposes a method of directly setting/modifying the plugin files that Nix loads on nix::initPlugins. I need this functionality for a project I'm developing currently.

I understand that this would conflict with the current nix.conf plugin-files setting, but manual control would be extremely useful. Perhaps it would be best to provide both a setPluginFiles (complete override) and addPluginFiles (avoid completely ignoring nix.conf)?

Proposed solution

Define a setPluginFiles function in libmain/plugin.cc:

void setPluginFiles(const std::list<std::filesystem::path> & pluginFiles)
{
    assert(!pluginSettings.pluginFiles.pluginsLoaded);
    assert(pluginSettings.pluginFiles.isAppendable());
    pluginSettings.pluginFiles.assign(pluginFiles);
}

Expose setPluginFiles in libmain/include/nix/main/plugin.hh:

/**
 * Set the plugin-files that will be loaded when `initPlugins` is called.
 *
 * This should be called after settings are initialized, but before
 * anything else.
 */
void setPluginFiles(const std::list<std::filesystem::path> & pluginFiles);

Then we can define a C compatible nix_set_plugin_files function in libmain-c/nix_api_main.cc:

nix_err nix_set_plugin_files(nix_c_context * context, const char ** pluginFiles, const size_t count)
{
    if (context)
        context->last_err_code = NIX_OK;
    if (pluginFiles == nullptr) {
        return nix_set_err_msg(context, NIX_ERR_UNKNOWN, "List of plugin-files is null");
    }
    try {
        std::list<std::filesystem::path> plugins{};
        for (size_t i = 0; i < count; ++i) {
            const char * path = pluginFiles[i];
            if (path == nullptr) {
                return nix_set_err_msg(context, NIX_ERR_UNKNOWN, "List of plugin-files contains null");
            }
            plugins.push_back(path);
        }
        nix::setPluginFiles(plugins);
    }
    NIXC_CATCH_ERRS
}

And similarly expose it in libmain-c/nix_api_main.h:

/**
 * @brief Sets Nix's plugin-files setting.
 *
 * Call this once, after calling your desired init functions,
 * but before calling nix_init_plugins.
 *
 * @param[out] context Optional, stores error information
 * @param[in] pluginPaths Array of plugin-files
 * @return NIX_OK if the assignment was successful, an error code otherwise.
 */
nix_err nix_set_plugin_files(nix_c_context * context, const char ** pluginFiles, const size_t count);

Checklist


Add 👍 to issues you find important.

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureFeature request or proposal
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions