aboutsummaryrefslogtreecommitdiff
path: root/src/util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.cpp')
-rw-r--r--src/util.cpp102
1 files changed, 101 insertions, 1 deletions
diff --git a/src/util.cpp b/src/util.cpp
index b4d0a61ab..963a7f531 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -445,6 +445,17 @@ void ArgsManager::ParseParameters(int argc, const char* const argv[])
m_override_args[key].push_back(val);
}
}
+
+ // we do not allow -includeconf from command line, so we clear it here
+ auto it = m_override_args.find("-includeconf");
+ if (it != m_override_args.end()) {
+ if (it->second.size() > 0) {
+ for (const auto& ic : it->second) {
+ fprintf(stderr, "warning: -includeconf cannot be used from commandline; ignoring -includeconf=%s\n", ic.c_str());
+ }
+ m_override_args.erase(it);
+ }
+ }
}
std::vector<std::string> ArgsManager::GetArgs(const std::string& strArg) const
@@ -536,6 +547,55 @@ void ArgsManager::ForceSetArg(const std::string& strArg, const std::string& strV
m_override_args[strArg] = {strValue};
}
+void ArgsManager::AddArg(const std::string& name, const std::string& help, const bool debug_only, const OptionsCategory& cat)
+{
+ std::pair<OptionsCategory, std::string> key(cat, name);
+ assert(m_available_args.count(key) == 0);
+ m_available_args.emplace(key, std::pair<std::string, bool>(help, debug_only));
+}
+
+std::string ArgsManager::GetHelpMessage()
+{
+ const bool show_debug = gArgs.GetBoolArg("-help-debug", false);
+
+ std::string usage = HelpMessageGroup("Options:");
+
+ OptionsCategory last_cat = OptionsCategory::OPTIONS;
+ for (auto& arg : m_available_args) {
+ if (arg.first.first != last_cat) {
+ last_cat = arg.first.first;
+ if (last_cat == OptionsCategory::CONNECTION)
+ usage += HelpMessageGroup("Connection options:");
+ else if (last_cat == OptionsCategory::ZMQ)
+ usage += HelpMessageGroup("ZeroMQ notification options:");
+ else if (last_cat == OptionsCategory::DEBUG_TEST)
+ usage += HelpMessageGroup("Debugging/Testing options:");
+ else if (last_cat == OptionsCategory::NODE_RELAY)
+ usage += HelpMessageGroup("Node relay options:");
+ else if (last_cat == OptionsCategory::BLOCK_CREATION)
+ usage += HelpMessageGroup("Block creation options:");
+ else if (last_cat == OptionsCategory::RPC)
+ usage += HelpMessageGroup("RPC server options:");
+ else if (last_cat == OptionsCategory::WALLET)
+ usage += HelpMessageGroup("Wallet options:");
+ else if (last_cat == OptionsCategory::WALLET_DEBUG_TEST && show_debug)
+ usage += HelpMessageGroup("Wallet debugging/testing options:");
+ else if (last_cat == OptionsCategory::CHAINPARAMS)
+ usage += HelpMessageGroup("Chain selection options:");
+ else if (last_cat == OptionsCategory::GUI)
+ usage += HelpMessageGroup("UI Options:");
+ else if (last_cat == OptionsCategory::COMMANDS)
+ usage += HelpMessageGroup("Commands:");
+ else if (last_cat == OptionsCategory::REGISTER_COMMANDS)
+ usage += HelpMessageGroup("Register Commands:");
+ }
+ if (show_debug || !arg.second.second) {
+ usage += HelpMessageOpt(arg.first.second, arg.second.first);
+ }
+ }
+ return usage;
+}
+
bool HelpRequested(const ArgsManager& args)
{
return args.IsArgSet("-?") || args.IsArgSet("-h") || args.IsArgSet("-help");
@@ -706,18 +766,58 @@ void ArgsManager::ReadConfigStream(std::istream& stream)
}
}
-void ArgsManager::ReadConfigFile(const std::string& confPath)
+void ArgsManager::ReadConfigFiles()
{
{
LOCK(cs_args);
m_config_args.clear();
}
+ const std::string confPath = GetArg("-conf", BITCOIN_CONF_FILENAME);
fs::ifstream stream(GetConfigFile(confPath));
// ok to not have a config file
if (stream.good()) {
ReadConfigStream(stream);
+ // if there is an -includeconf in the override args, but it is empty, that means the user
+ // passed '-noincludeconf' on the command line, in which case we should not include anything
+ if (m_override_args.count("-includeconf") == 0) {
+ std::vector<std::string> includeconf(GetArgs("-includeconf"));
+ {
+ // We haven't set m_network yet (that happens in SelectParams()), so manually check
+ // for network.includeconf args.
+ std::vector<std::string> includeconf_net(GetArgs(std::string("-") + GetChainName() + ".includeconf"));
+ includeconf.insert(includeconf.end(), includeconf_net.begin(), includeconf_net.end());
+ }
+
+ // Remove -includeconf from configuration, so we can warn about recursion
+ // later
+ {
+ LOCK(cs_args);
+ m_config_args.erase("-includeconf");
+ m_config_args.erase(std::string("-") + GetChainName() + ".includeconf");
+ }
+
+ for (const std::string& to_include : includeconf) {
+ fs::ifstream include_config(GetConfigFile(to_include));
+ if (include_config.good()) {
+ ReadConfigStream(include_config);
+ LogPrintf("Included configuration file %s\n", to_include.c_str());
+ } else {
+ fprintf(stderr, "Failed to include configuration file %s\n", to_include.c_str());
+ }
+ }
+
+ // Warn about recursive -includeconf
+ includeconf = GetArgs("-includeconf");
+ {
+ std::vector<std::string> includeconf_net(GetArgs(std::string("-") + GetChainName() + ".includeconf"));
+ includeconf.insert(includeconf.end(), includeconf_net.begin(), includeconf_net.end());
+ }
+ for (const std::string& to_include : includeconf) {
+ fprintf(stderr, "warning: -includeconf cannot be used from included files; ignoring -includeconf=%s\n", to_include.c_str());
+ }
+ }
}
// If datadir is changed in .conf file: