diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index ed20942ba9..0d1d92390e 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -161,7 +161,7 @@ static int AppInitRPC(int argc, char* argv[]) } return EXIT_SUCCESS; } - if (!CheckDataDirOption()) { + if (!CheckDataDirOption(gArgs)) { tfm::format(std::cerr, "Error: Specified data directory \"%s\" does not exist.\n", gArgs.GetArg("-datadir", "")); return EXIT_FAILURE; } @@ -817,7 +817,7 @@ static UniValue CallRPC(BaseRequestHandler* rh, const std::string& strMethod, co if (failedToGetAuthCookie) { throw std::runtime_error(strprintf( "Could not locate RPC credentials. No authentication cookie could be found, and RPC password is not set. See -rpcpassword and -stdinrpcpass. Configuration file: (%s)", - fs::PathToString(GetConfigFile(gArgs.GetPathArg("-conf", BITCOIN_CONF_FILENAME))))); + fs::PathToString(gArgs.GetConfigFilePath()))); } else { throw std::runtime_error("Authorization failed: Incorrect rpcuser or rpcpassword"); } diff --git a/src/bitcoin-wallet.cpp b/src/bitcoin-wallet.cpp index b515f88b3d..596ac3c130 100644 --- a/src/bitcoin-wallet.cpp +++ b/src/bitcoin-wallet.cpp @@ -84,7 +84,7 @@ static std::optional WalletAppInit(ArgsManager& args, int argc, char* argv[ // check for printtoconsole, allow -debug LogInstance().m_print_to_console = args.GetBoolArg("-printtoconsole", args.GetBoolArg("-debug", false)); - if (!CheckDataDirOption()) { + if (!CheckDataDirOption(args)) { tfm::format(std::cerr, "Error: Specified data directory \"%s\" does not exist.\n", args.GetArg("-datadir", "")); return EXIT_FAILURE; } diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index e17fda8b9c..6b7f64b9b3 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -150,7 +150,7 @@ static bool AppInit(NodeContext& node, int argc, char* argv[]) std::any context{&node}; try { - if (!CheckDataDirOption()) { + if (!CheckDataDirOption(args)) { return InitError(Untranslated(strprintf("Specified data directory \"%s\" does not exist.\n", args.GetArg("-datadir", "")))); } if (!args.ReadConfigFiles(error, true)) { diff --git a/src/init.cpp b/src/init.cpp index 505a9c2773..7c2ca708b7 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -156,7 +156,7 @@ const char * const BITCOIN_PID_FILENAME = "elementsd.pid"; static fs::path GetPidFile(const ArgsManager& args) { - return AbsPathForConfigVal(args.GetPathArg("-pid", BITCOIN_PID_FILENAME)); + return AbsPathForConfigVal(args, args.GetPathArg("-pid", BITCOIN_PID_FILENAME)); } [[nodiscard]] static bool CreatePidFile(const ArgsManager& args) diff --git a/src/init/common.cpp b/src/init/common.cpp index e1a37d7db9..791424f5f6 100644 --- a/src/init/common.cpp +++ b/src/init/common.cpp @@ -45,7 +45,7 @@ void AddLoggingArgs(ArgsManager& argsman) void SetLoggingOptions(const ArgsManager& args) { LogInstance().m_print_to_file = !args.IsArgNegated("-debuglogfile"); - LogInstance().m_file_path = AbsPathForConfigVal(args.GetPathArg("-debuglogfile", DEFAULT_DEBUGLOGFILE)); + LogInstance().m_file_path = AbsPathForConfigVal(args, args.GetPathArg("-debuglogfile", DEFAULT_DEBUGLOGFILE)); LogInstance().m_print_to_console = args.GetBoolArg("-printtoconsole", !args.GetBoolArg("-daemon", false)); LogInstance().m_log_timestamps = args.GetBoolArg("-logtimestamps", DEFAULT_LOGTIMESTAMPS); LogInstance().m_log_time_micros = args.GetBoolArg("-logtimemicros", DEFAULT_LOGTIMEMICROS); @@ -121,7 +121,7 @@ bool StartLogging(const ArgsManager& args) LogPrintf("Using data directory %s\n", fs::PathToString(gArgs.GetDataDirNet())); // Only log conf file usage message if conf file actually exists. - fs::path config_file_path = GetConfigFile(args.GetPathArg("-conf", BITCOIN_CONF_FILENAME)); + fs::path config_file_path = args.GetConfigFilePath(); if (fs::exists(config_file_path)) { LogPrintf("Config file: %s\n", fs::PathToString(config_file_path)); } else if (args.IsArgSet("-conf")) { diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 726ff78c71..a5378e84b8 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -565,7 +565,7 @@ int GuiMain(int argc, char* argv[]) if (!Intro::showIfNeeded(did_show_intro, prune_MiB)) return EXIT_SUCCESS; /// 6a. Determine availability of data directory - if (!CheckDataDirOption()) { + if (!CheckDataDirOption(gArgs)) { InitError(strprintf(Untranslated("Specified data directory \"%s\" does not exist.\n"), gArgs.GetArg("-datadir", ""))); QMessageBox::critical(nullptr, PACKAGE_NAME, QObject::tr("Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(gArgs.GetArg("-datadir", "")))); diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index c9106bda92..f7206b1cb6 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -436,7 +436,7 @@ void openDebugLogfile() bool openBitcoinConf() { - fs::path pathConfig = GetConfigFile(gArgs.GetPathArg("-conf", BITCOIN_CONF_FILENAME)); + fs::path pathConfig = gArgs.GetConfigFilePath(); /* Create the file */ std::ofstream configFile{pathConfig, std::ios_base::app}; diff --git a/src/rpc/request.cpp b/src/rpc/request.cpp index 96b56ce8d1..8ac7eff94c 100644 --- a/src/rpc/request.cpp +++ b/src/rpc/request.cpp @@ -75,7 +75,7 @@ static fs::path GetAuthCookieFile(bool temp=false) if (temp) { arg += ".tmp"; } - return AbsPathForConfigVal(arg); + return AbsPathForConfigVal(gArgs, arg); } bool GenerateAuthCookie(std::string *cookie_out) diff --git a/src/util/system.cpp b/src/util/system.cpp index 4c7bb47c0e..0cc31fde3e 100644 --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -937,15 +937,15 @@ fs::path GetMainchainDefaultDataDir() #endif } -bool CheckDataDirOption() +bool CheckDataDirOption(const ArgsManager& args) { - const fs::path datadir{gArgs.GetPathArg("-datadir")}; + const fs::path datadir{args.GetPathArg("-datadir")}; return datadir.empty() || fs::is_directory(fs::absolute(datadir)); } -fs::path GetConfigFile(const fs::path& configuration_file_path) +fs::path GetConfigFile(const ArgsManager& args, const fs::path& configuration_file_path) { - return AbsPathForConfigVal(configuration_file_path, /*net_specific=*/false); + return AbsPathForConfigVal(args, configuration_file_path, /*net_specific=*/false); } static bool GetConfigOptions(std::istream& stream, const std::string& filepath, std::string& error, std::vector>& options, std::list& sections) @@ -1038,7 +1038,7 @@ bool ArgsManager::ReadConfigStream(std::istream& stream, const std::string& file fs::path ArgsManager::GetConfigFilePath() const { - return GetConfigFile(GetPathArg("-conf", BITCOIN_CONF_FILENAME)); + return GetConfigFile(*this, GetPathArg("-conf", BITCOIN_CONF_FILENAME)); } bool ArgsManager::ReadConfigFiles(std::string& error, bool ignore_invalid_keys) @@ -1097,7 +1097,7 @@ bool ArgsManager::ReadConfigFiles(std::string& error, bool ignore_invalid_keys) const size_t default_includes = add_includes({}); for (const std::string& conf_file_name : conf_file_names) { - std::ifstream conf_file_stream{GetConfigFile(fs::PathFromString(conf_file_name))}; + std::ifstream conf_file_stream{GetConfigFile(*this, fs::PathFromString(conf_file_name))}; if (conf_file_stream.good()) { if (!ReadConfigStream(conf_file_stream, conf_file_name, error, ignore_invalid_keys)) { return false; @@ -1125,8 +1125,8 @@ bool ArgsManager::ReadConfigFiles(std::string& error, bool ignore_invalid_keys) } // If datadir is changed in .conf file: - gArgs.ClearPathCache(); - if (!CheckDataDirOption()) { + ClearPathCache(); + if (!CheckDataDirOption(*this)) { error = strprintf("specified data directory \"%s\" does not exist.", GetArg("-datadir", "")); return false; } @@ -1467,12 +1467,12 @@ int64_t GetStartupTime() return nStartupTime; } -fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific) +fs::path AbsPathForConfigVal(const ArgsManager& args, const fs::path& path, bool net_specific) { if (path.is_absolute()) { return path; } - return fsbridge::AbsPathJoin(net_specific ? gArgs.GetDataDirNet() : gArgs.GetDataDirBase(), path); + return fsbridge::AbsPathJoin(net_specific ? args.GetDataDirNet() : args.GetDataDirBase(), path); } void ScheduleBatchPriority() diff --git a/src/util/system.h b/src/util/system.h index 6c9648e9ea..b3f6a23e12 100644 --- a/src/util/system.h +++ b/src/util/system.h @@ -33,6 +33,7 @@ #include #include +class ArgsManager; class UniValue; // Application startup time (used for uptime calculation) @@ -97,8 +98,8 @@ bool TryCreateDirectories(const fs::path& p); fs::path GetDefaultDataDir(); fs::path GetMainchainDefaultDataDir(); // Return true if -datadir option points to a valid directory or is not specified. -bool CheckDataDirOption(); -fs::path GetConfigFile(const fs::path& configuration_file_path); +bool CheckDataDirOption(const ArgsManager& args); +fs::path GetConfigFile(const ArgsManager& args, const fs::path& configuration_file_path); #ifdef WIN32 fs::path GetSpecialFolderPath(int nFolder, bool fCreate = true); #endif @@ -113,11 +114,12 @@ void runCommand(const std::string& strCommand); * Most paths passed as configuration arguments are treated as relative to * the datadir if they are not absolute. * + * @param args Parsed arguments and settings. * @param path The path to be conditionally prefixed with datadir. * @param net_specific Use network specific datadir variant * @return The normalized path. */ -fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific = true); +fs::path AbsPathForConfigVal(const ArgsManager& args, const fs::path& path, bool net_specific = true); inline bool IsSwitchChar(char c) {