/** * @file context.hpp * @brief The libdpm-core.so context: configuration, logging, module registry * * @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 #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>> config; /** Validated modules keyed by name; each is loaded at most once. */ std::map> 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