dpm_core carries a namespace block saying what it holds and why its members keep external linkage while staying off the export table. Each unnamed namespace says its contents are private to that translation unit, and the one in the info module says why it has to be unnamed there: a module is built without hidden visibility or a version script, so a helper with external linkage would reach that module's exports. The three opaque handles in the public header were undocumented. What documentation they had came from the struct definitions in include/internal, which a consumer never sees. EXTRACT_ANON_NSPACES was off, so the documentation on every file-private helper was written and discarded. Doxygen also capitalizes the first letter of a brief, which turned libdpm-core.so into Libdpm-core.so wherever a brief opened with it; those are reworded. Bare references to the library are replaced with the artifact name throughout, including three in the info module's output. The cli_info_version regex follows.
83 lines
2.6 KiB
C++
83 lines
2.6 KiB
C++
/**
|
|
* @file modules.hpp
|
|
* @brief Module handle, cursor, and loader declarations
|
|
*
|
|
* @copyright Copyright (c) 2026 SILO GROUP LLC
|
|
* @author Chris Punches <chris.punches@silogroup.org>
|
|
*
|
|
* 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 <https://www.gnu.org/licenses/>.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <dpm/core.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
/** @brief A loaded, fully validated module */
|
|
struct dpm_module {
|
|
/** Module name, its filename minus .so. */
|
|
std::string name;
|
|
|
|
/** The dlopen handle. */
|
|
void* handle = nullptr;
|
|
|
|
/** dpm_module_version() as read at load. */
|
|
std::string version;
|
|
|
|
/** dpm_module_description() as read at load. */
|
|
std::string description;
|
|
|
|
/** Resolved dpm_module_execute; the only path into module code. */
|
|
int (*execute)(dpm_ctx*, const char*, int, char**) = nullptr;
|
|
};
|
|
|
|
/** @brief Enumeration cursor over validated modules */
|
|
struct dpm_cursor {
|
|
/** One entry per valid module. */
|
|
std::vector<dpm_module_info> infos;
|
|
|
|
/** Position of the next entry. */
|
|
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 dpm_core {
|
|
/**
|
|
* @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.so 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<dpm_module> validate_and_load(dpm_ctx* ctx,
|
|
const std::string& name,
|
|
std::string& reason);
|
|
} // namespace dpm_core
|