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.
104 lines
3.4 KiB
C++
104 lines
3.4 KiB
C++
/**
|
|
* @file context.hpp
|
|
* @brief The libdpm-core.so context: configuration, logging, module registry
|
|
*
|
|
* @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 <map>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "internal/modules.hpp"
|
|
|
|
/** @brief A libdpm-core.so context: configuration, logging, module registry */
|
|
struct dpm_ctx {
|
|
/** Directory the .conf files were read from. */
|
|
std::string config_dir;
|
|
|
|
/** Directory modules are loaded from. */
|
|
std::string module_path;
|
|
|
|
/** Target root for package operations. */
|
|
std::string root;
|
|
|
|
/** Messages above this level are dropped. */
|
|
int log_level = DPM_LOG_INFO;
|
|
|
|
/** Whether to append messages to log_file. */
|
|
bool write_to_log = false;
|
|
|
|
/** Path of the log file. */
|
|
std::string log_file;
|
|
|
|
/** Configuration store, addressed as config[module][section][key]. */
|
|
std::map<std::string,
|
|
std::map<std::string,
|
|
std::map<std::string, std::string>>> config;
|
|
|
|
/** Validated modules keyed by name; each is loaded at most once. */
|
|
std::map<std::string, std::unique_ptr<dpm_module>> modules;
|
|
|
|
/** Reason for the most recent failure. */
|
|
std::string last_error;
|
|
};
|
|
|
|
/**
|
|
* @namespace dpm_core
|
|
* @brief Internal implementation of libdpm-core.so
|
|
*
|
|
* Holds what the library's translation units share with each other and
|
|
* with nothing else: the loader, the configuration reader, the error
|
|
* recorder, and the version parser. It is declared in include/internal/,
|
|
* which is never installed, so a consumer or a module cannot name any of
|
|
* it.
|
|
*
|
|
* Nothing in here reaches the export table. The library is compiled with
|
|
* hidden default symbol visibility and linked against a version script
|
|
* whose `local: *` covers everything the public declarations do not
|
|
* claim, so these keep external linkage across the library's own files
|
|
* while staying invisible outside it.
|
|
*
|
|
* Helpers used by a single translation unit belong in that file's
|
|
* unnamed namespace instead, which gives them internal linkage and keeps
|
|
* them from colliding across files.
|
|
*/
|
|
namespace dpm_core {
|
|
/**
|
|
* @brief Records a failure reason on the context
|
|
*
|
|
* @param ctx The libdpm-core.so context; NULL is a no-op
|
|
* @param msg The failure description
|
|
*/
|
|
void set_error(dpm_ctx* ctx, const std::string& msg);
|
|
|
|
/**
|
|
* @brief Loads all configuration files into the context
|
|
*
|
|
* Parses every .conf file in the context's configuration directory
|
|
* into the context's configuration store.
|
|
*
|
|
* @param ctx The libdpm-core.so context
|
|
*/
|
|
void load_config_dir(dpm_ctx* ctx);
|
|
} // namespace dpm_core
|