/** * @file modules.hpp * @brief Module handle, cursor, and loader declarations * * @copyright Copyright (c) 2026 SILO GROUP LLC * @author Chris Punches * * Part of the Dark Horse Linux Package Manager (DPM) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #pragma once #include #include #include #include /** @brief A loaded, fully validated module */ struct dpm_module { std::string name; void* handle = nullptr; std::string version; std::string description; std::string core_min; const dpm_manifest* manifest = nullptr; int (*execute)(dpm_ctx*, const char*, int, char**) = nullptr; }; /** @brief Enumeration cursor over validated modules */ struct dpm_cursor { std::vector infos; size_t idx = 0; }; /** * @brief Closes a dlopen handle * * Keeps handle release beside the loader in one translation unit. * * @param handle The handle to close; NULL is a no-op */ void dpm_internal_unload(void* handle); namespace dpmcore { /** * @brief Runs the full load-time validation sequence against a module * * Loads the named module's .so from the context's module path and * verifies the complete contract. * * @param ctx The libdpm-core context * @param name The module name * @param reason Receives the refusal reason on failure * @return The validated module (caller owns), or nullptr on failure */ std::unique_ptr validate_and_load(dpm_ctx* ctx, const std::string& name, std::string& reason); } // namespace dpmcore