362ded410b8cb1104b7ef31ff8488fec4824a7d5 Avoid using g_rpc_node global in wallet code (Russell Yanofsky) 8922d7f6b751a3e6b3b9f6fb7961c442877fb65a scripted-diff: Remove g_connman, g_banman globals (Russell Yanofsky) e6f4f895d5e42feaf7bfa5f41e80292aaa73cd7d Pass NodeContext, ConnMan, BanMan references more places (Russell Yanofsky) 4d5448c76b71c9d91399c31b043237091be2e5e7 MOVEONLY: Move NodeContext struct to node/context.h (Russell Yanofsky) 301bd41a2e6765b185bd55f4c541f9e27aeea29d scripted-diff: Rename InitInterfaces to NodeContext (Russell Yanofsky) Pull request description: This change is mainly a naming / organization change intended to simplify #10102. It: - Renames struct InitInterfaces to struct NodeContext and moves it from src/init.h to src/node/context.h. This is a cosmetic change intended to make the point of the struct more obvious. - Gets rid of BanMan and ConnMan globals making them NodeContext members instead. Getting rid of these globals has been talked about in past as a way to implement testing and simulations. Making them NodeContext members is a way of keeping them accessible without the globals. - Splits g_rpc_interfaces global into g_rpc_node and g_rpc_chain globals. This better separates node and wallet rpc methods. Node RPC methods should have access NodeContext, while wallet RPC methods should only have indirect access to node functionality via interfaces::Chain. - Adds NodeContext& references to interfaces::Chain class and the interfaces::MakeChain() function. This is needed to access ConnMan and BanMan instances without the globals. - Gets rid of redundant Node and Chain instances in Qt tests. This is needed due to the previous MakeChain change, and also makes test setup a little more straightforward. More cleanup could be done in the future, but it will require deduplication of bitcoind, bitcoin-qt, and TestingSetup init code. ACKs for top commit: laanwj: ACK 362ded410b8cb1104b7ef31ff8488fec4824a7d5 Tree-SHA512: 9ae6ff1e33423291d1e52056bac95e0874538390892a6e83c4c115b3c73155a8827c0191b46eb3d14e3b3f6c23ccb08095490880fbc3188026319c71739f7db2
178 lines
5.2 KiB
C++
178 lines
5.2 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2019 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
#include <config/bitcoin-config.h>
|
|
#endif
|
|
|
|
#include <chainparams.h>
|
|
#include <clientversion.h>
|
|
#include <compat.h>
|
|
#include <init.h>
|
|
#include <interfaces/chain.h>
|
|
#include <node/context.h>
|
|
#include <noui.h>
|
|
#include <shutdown.h>
|
|
#include <ui_interface.h>
|
|
#include <util/strencodings.h>
|
|
#include <util/system.h>
|
|
#include <util/threadnames.h>
|
|
#include <util/translation.h>
|
|
|
|
#include <functional>
|
|
|
|
const std::function<std::string(const char*)> G_TRANSLATION_FUN = nullptr;
|
|
|
|
static void WaitForShutdown(NodeContext& node)
|
|
{
|
|
while (!ShutdownRequested())
|
|
{
|
|
MilliSleep(200);
|
|
}
|
|
Interrupt(node);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Start
|
|
//
|
|
static bool AppInit(int argc, char* argv[])
|
|
{
|
|
NodeContext node;
|
|
node.chain = interfaces::MakeChain(node);
|
|
|
|
bool fRet = false;
|
|
|
|
util::ThreadSetInternalName("init");
|
|
|
|
//
|
|
// Parameters
|
|
//
|
|
// If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main()
|
|
SetupServerArgs();
|
|
std::string error;
|
|
if (!gArgs.ParseParameters(argc, argv, error)) {
|
|
return InitError(strprintf("Error parsing command line arguments: %s\n", error));
|
|
}
|
|
|
|
// Process help and version before taking care about datadir
|
|
if (HelpRequested(gArgs) || gArgs.IsArgSet("-version")) {
|
|
std::string strUsage = PACKAGE_NAME " version " + FormatFullVersion() + "\n";
|
|
|
|
if (gArgs.IsArgSet("-version"))
|
|
{
|
|
strUsage += FormatParagraph(LicenseInfo()) + "\n";
|
|
}
|
|
else
|
|
{
|
|
strUsage += "\nUsage: bitcoind [options] Start " PACKAGE_NAME "\n";
|
|
strUsage += "\n" + gArgs.GetHelpMessage();
|
|
}
|
|
|
|
tfm::format(std::cout, "%s", strUsage);
|
|
return true;
|
|
}
|
|
|
|
try
|
|
{
|
|
if (!CheckDataDirOption()) {
|
|
return InitError(strprintf("Specified data directory \"%s\" does not exist.\n", gArgs.GetArg("-datadir", "")));
|
|
}
|
|
if (!gArgs.ReadConfigFiles(error, true)) {
|
|
return InitError(strprintf("Error reading configuration file: %s\n", error));
|
|
}
|
|
// Check for -chain, -testnet or -regtest parameter (Params() calls are only valid after this clause)
|
|
try {
|
|
SelectParams(gArgs.GetChainName());
|
|
} catch (const std::exception& e) {
|
|
return InitError(strprintf("%s\n", e.what()));
|
|
}
|
|
|
|
// Error out when loose non-argument tokens are encountered on command line
|
|
for (int i = 1; i < argc; i++) {
|
|
if (!IsSwitchChar(argv[i][0])) {
|
|
return InitError(strprintf("Command line contains unexpected token '%s', see bitcoind -h for a list of options.\n", argv[i]));
|
|
}
|
|
}
|
|
|
|
// -server defaults to true for bitcoind but not for the GUI so do this here
|
|
gArgs.SoftSetBoolArg("-server", true);
|
|
// Set this early so that parameter interactions go to console
|
|
InitLogging();
|
|
InitParameterInteraction();
|
|
if (!AppInitBasicSetup())
|
|
{
|
|
// InitError will have been called with detailed error, which ends up on console
|
|
return false;
|
|
}
|
|
if (!AppInitParameterInteraction())
|
|
{
|
|
// InitError will have been called with detailed error, which ends up on console
|
|
return false;
|
|
}
|
|
if (!AppInitSanityChecks())
|
|
{
|
|
// InitError will have been called with detailed error, which ends up on console
|
|
return false;
|
|
}
|
|
if (gArgs.GetBoolArg("-daemon", false))
|
|
{
|
|
#if HAVE_DECL_DAEMON
|
|
#if defined(MAC_OSX)
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
#endif
|
|
tfm::format(std::cout, PACKAGE_NAME " starting\n");
|
|
|
|
// Daemonize
|
|
if (daemon(1, 0)) { // don't chdir (1), do close FDs (0)
|
|
return InitError(strprintf("daemon() failed: %s\n", strerror(errno)));
|
|
}
|
|
#if defined(MAC_OSX)
|
|
#pragma GCC diagnostic pop
|
|
#endif
|
|
#else
|
|
return InitError("-daemon is not supported on this operating system\n");
|
|
#endif // HAVE_DECL_DAEMON
|
|
}
|
|
// Lock data directory after daemonization
|
|
if (!AppInitLockDataDirectory())
|
|
{
|
|
// If locking the data directory failed, exit immediately
|
|
return false;
|
|
}
|
|
fRet = AppInitMain(node);
|
|
}
|
|
catch (const std::exception& e) {
|
|
PrintExceptionContinue(&e, "AppInit()");
|
|
} catch (...) {
|
|
PrintExceptionContinue(nullptr, "AppInit()");
|
|
}
|
|
|
|
if (!fRet)
|
|
{
|
|
Interrupt(node);
|
|
} else {
|
|
WaitForShutdown(node);
|
|
}
|
|
Shutdown(node);
|
|
|
|
return fRet;
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
#ifdef WIN32
|
|
util::WinCmdLineArgs winArgs;
|
|
std::tie(argc, argv) = winArgs.get();
|
|
#endif
|
|
SetupEnvironment();
|
|
|
|
// Connect bitcoind signal handlers
|
|
noui_connect();
|
|
|
|
return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);
|
|
}
|