diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 9bab3a202..5b42bf521 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -1,197 +1,202 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2016 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 "rpc/server.h" +#include "httprpc.h" +#include "httpserver.h" #include "init.h" #include "noui.h" +#include "rpc/server.h" #include "scheduler.h" #include "util.h" -#include "httpserver.h" -#include "httprpc.h" #include "utilstrencodings.h" #include <boost/algorithm/string/predicate.hpp> #include <boost/filesystem.hpp> #include <boost/thread.hpp> #include <stdio.h> /* Introduction text for doxygen: */ /*! \mainpage Developer documentation * * \section intro_sec Introduction * - * This is the developer documentation of the reference client for an experimental new digital currency called Bitcoin (https://www.bitcoin.org/), - * which enables instant payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer technology to operate - * with no central authority: managing transactions and issuing money are carried out collectively by the network. + * This is the developer documentation of the reference client for an + * experimental new digital currency called Bitcoin (https://www.bitcoin.org/), + * which enables instant payments to anyone, anywhere in the world. Bitcoin uses + * peer-to-peer technology to operate with no central authority: managing + * transactions and issuing money are carried out collectively by the network. * - * The software is a community-driven open source project, released under the MIT license. + * The software is a community-driven open source project, released under the + * MIT license. * * \section Navigation - * Use the buttons <code>Namespaces</code>, <code>Classes</code> or <code>Files</code> at the top of the page to start navigating the code. + * Use the buttons <code>Namespaces</code>, <code>Classes</code> or + * <code>Files</code> at the top of the page to start navigating the code. */ -void WaitForShutdown(boost::thread_group* threadGroup) -{ +void WaitForShutdown(boost::thread_group *threadGroup) { bool fShutdown = ShutdownRequested(); // Tell the main threads to shutdown. - while (!fShutdown) - { + while (!fShutdown) { MilliSleep(200); fShutdown = ShutdownRequested(); } - if (threadGroup) - { + if (threadGroup) { Interrupt(*threadGroup); threadGroup->join_all(); } } ////////////////////////////////////////////////////////////////////////////// // // Start // -bool AppInit(int argc, char* argv[]) -{ +bool AppInit(int argc, char *argv[]) { boost::thread_group threadGroup; CScheduler scheduler; bool fRet = false; // // Parameters // - // If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main() + // If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's + // main() ParseParameters(argc, argv); // Process help and version before taking care about datadir - if (IsArgSet("-?") || IsArgSet("-h") || IsArgSet("-help") || IsArgSet("-version")) - { - std::string strUsage = strprintf(_("%s Daemon"), _(PACKAGE_NAME)) + " " + _("version") + " " + FormatFullVersion() + "\n"; + if (IsArgSet("-?") || IsArgSet("-h") || IsArgSet("-help") || + IsArgSet("-version")) { + std::string strUsage = strprintf(_("%s Daemon"), _(PACKAGE_NAME)) + + " " + _("version") + " " + FormatFullVersion() + + "\n"; - if (IsArgSet("-version")) - { + if (IsArgSet("-version")) { strUsage += FormatParagraph(LicenseInfo()); - } - else - { + } else { strUsage += "\n" + _("Usage:") + "\n" + - " bitcoind [options] " + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n"; + " bitcoind [options] " + + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n"; strUsage += "\n" + HelpMessage(HMM_BITCOIND); } fprintf(stdout, "%s", strUsage.c_str()); return true; } - try - { - if (!boost::filesystem::is_directory(GetDataDir(false))) - { - fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", GetArg("-datadir", "").c_str()); + try { + if (!boost::filesystem::is_directory(GetDataDir(false))) { + fprintf(stderr, + "Error: Specified data directory \"%s\" does not exist.\n", + GetArg("-datadir", "").c_str()); return false; } - try - { + try { ReadConfigFile(GetArg("-conf", BITCOIN_CONF_FILENAME)); - } catch (const std::exception& e) { - fprintf(stderr,"Error reading configuration file: %s\n", e.what()); + } catch (const std::exception &e) { + fprintf(stderr, "Error reading configuration file: %s\n", e.what()); return false; } - // Check for -testnet or -regtest parameter (Params() calls are only valid after this clause) + // Check for -testnet or -regtest parameter (Params() calls are only + // valid after this clause) try { SelectParams(ChainNameFromCommandLine()); - } catch (const std::exception& e) { + } catch (const std::exception &e) { fprintf(stderr, "Error: %s\n", e.what()); return false; } // Command-line RPC bool fCommandLine = false; for (int i = 1; i < argc; i++) - if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "bitcoin:")) + if (!IsSwitchChar(argv[i][0]) && + !boost::algorithm::istarts_with(argv[i], "bitcoin:")) fCommandLine = true; - if (fCommandLine) - { - fprintf(stderr, "Error: There is no RPC client functionality in bitcoind anymore. Use the bitcoin-cli utility instead.\n"); + if (fCommandLine) { + fprintf(stderr, "Error: There is no RPC client functionality in " + "bitcoind anymore. Use the bitcoin-cli utility " + "instead.\n"); exit(EXIT_FAILURE); } - // -server defaults to true for bitcoind but not for the GUI so do this here + // -server defaults to true for bitcoind but not for the GUI so do this + // here 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 + if (!AppInitBasicSetup()) { + // InitError will have been called with detailed error, which ends + // up on console exit(1); } - if (!AppInitParameterInteraction()) - { - // InitError will have been called with detailed error, which ends up on console + if (!AppInitParameterInteraction()) { + // InitError will have been called with detailed error, which ends + // up on console exit(1); } - if (!AppInitSanityChecks()) - { - // InitError will have been called with detailed error, which ends up on console + if (!AppInitSanityChecks()) { + // InitError will have been called with detailed error, which ends + // up on console exit(1); } - if (GetBoolArg("-daemon", false)) - { + if (GetBoolArg("-daemon", false)) { #if HAVE_DECL_DAEMON fprintf(stdout, "Bitcoin server starting\n"); // Daemonize - if (daemon(1, 0)) { // don't chdir (1), do close FDs (0) - fprintf(stderr, "Error: daemon() failed: %s\n", strerror(errno)); + if (daemon(1, 0)) { + // don't chdir (1), do close FDs (0) + fprintf(stderr, "Error: daemon() failed: %s\n", + strerror(errno)); return false; } #else - fprintf(stderr, "Error: -daemon is not supported on this operating system\n"); + fprintf( + stderr, + "Error: -daemon is not supported on this operating system\n"); return false; #endif // HAVE_DECL_DAEMON } fRet = AppInitMain(threadGroup, scheduler); - } - catch (const std::exception& e) { + } catch (const std::exception &e) { PrintExceptionContinue(&e, "AppInit()"); } catch (...) { PrintExceptionContinue(NULL, "AppInit()"); } - if (!fRet) - { + if (!fRet) { Interrupt(threadGroup); - // threadGroup.join_all(); was left out intentionally here, because we didn't re-test all of - // the startup-failure cases to make sure they don't result in a hang due to some - // thread-blocking-waiting-for-another-thread-during-startup case + // threadGroup.join_all(); was left out intentionally here, because we + // didn't re-test all of the startup-failure cases to make sure they + // don't result in a hang due to some + // thread-blocking-waiting-for-another-thread-during-startup case. } else { WaitForShutdown(&threadGroup); } Shutdown(); return fRet; } -int main(int argc, char* argv[]) -{ +int main(int argc, char *argv[]) { SetupEnvironment(); // Connect bitcoind signal handlers noui_connect(); return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE); }