0e4b317555
The new class is accessed via the Params() method and holds most things that vary between main, test and regtest networks. The regtest mode has two purposes, one is to run the bitcoind/bitcoinj comparison tool which compares two separate implementations of the Bitcoin protocol looking for divergence. The other is that when run, you get a local node which can mine a single block instantly, which is highly convenient for testing apps during development as there's no need to wait 10 minutes for a block on the testnet.
142 lines
4.1 KiB
C++
142 lines
4.1 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2012 The Bitcoin developers
|
|
// Distributed under the MIT/X11 software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include "init.h"
|
|
#include "bitcoinrpc.h"
|
|
#include <boost/algorithm/string/predicate.hpp>
|
|
|
|
void DetectShutdownThread(boost::thread_group* threadGroup)
|
|
{
|
|
bool shutdown = ShutdownRequested();
|
|
// Tell the main threads to shutdown.
|
|
while (!shutdown)
|
|
{
|
|
MilliSleep(200);
|
|
shutdown = ShutdownRequested();
|
|
}
|
|
if (threadGroup)
|
|
threadGroup->interrupt_all();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Start
|
|
//
|
|
bool AppInit(int argc, char* argv[])
|
|
{
|
|
boost::thread_group threadGroup;
|
|
boost::thread* detectShutdownThread = NULL;
|
|
|
|
bool fRet = false;
|
|
try
|
|
{
|
|
//
|
|
// Parameters
|
|
//
|
|
// If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main()
|
|
ParseParameters(argc, argv);
|
|
if (!boost::filesystem::is_directory(GetDataDir(false)))
|
|
{
|
|
fprintf(stderr, "Error: Specified directory does not exist\n");
|
|
Shutdown();
|
|
}
|
|
ReadConfigFile(mapArgs, mapMultiArgs);
|
|
|
|
if (mapArgs.count("-?") || mapArgs.count("--help"))
|
|
{
|
|
// First part of help message is specific to bitcoind / RPC client
|
|
std::string strUsage = _("Bitcoin version") + " " + FormatFullVersion() + "\n\n" +
|
|
_("Usage:") + "\n" +
|
|
" bitcoind [options] " + "\n" +
|
|
" bitcoind [options] <command> [params] " + _("Send command to -server or bitcoind") + "\n" +
|
|
" bitcoind [options] help " + _("List commands") + "\n" +
|
|
" bitcoind [options] help <command> " + _("Get help for a command") + "\n";
|
|
|
|
strUsage += "\n" + HelpMessage();
|
|
|
|
fprintf(stdout, "%s", strUsage.c_str());
|
|
return false;
|
|
}
|
|
|
|
// Command-line RPC
|
|
for (int i = 1; i < argc; i++)
|
|
if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "bitcoin:"))
|
|
fCommandLine = true;
|
|
|
|
if (fCommandLine)
|
|
{
|
|
if (!SelectParamsFromCommandLine()) {
|
|
fprintf(stderr, "Error: invalid combination of -regtest and -testnet.\n");
|
|
return false;
|
|
}
|
|
int ret = CommandLineRPC(argc, argv);
|
|
exit(ret);
|
|
}
|
|
#if !defined(WIN32)
|
|
fDaemon = GetBoolArg("-daemon", false);
|
|
if (fDaemon)
|
|
{
|
|
// Daemonize
|
|
pid_t pid = fork();
|
|
if (pid < 0)
|
|
{
|
|
fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
|
|
return false;
|
|
}
|
|
if (pid > 0) // Parent process, pid is child process id
|
|
{
|
|
CreatePidFile(GetPidFile(), pid);
|
|
return true;
|
|
}
|
|
// Child process falls through to rest of initialization
|
|
|
|
pid_t sid = setsid();
|
|
if (sid < 0)
|
|
fprintf(stderr, "Error: setsid() returned %d errno %d\n", sid, errno);
|
|
}
|
|
#endif
|
|
|
|
detectShutdownThread = new boost::thread(boost::bind(&DetectShutdownThread, &threadGroup));
|
|
fRet = AppInit2(threadGroup);
|
|
}
|
|
catch (std::exception& e) {
|
|
PrintExceptionContinue(&e, "AppInit()");
|
|
} catch (...) {
|
|
PrintExceptionContinue(NULL, "AppInit()");
|
|
}
|
|
if (!fRet) {
|
|
if (detectShutdownThread)
|
|
detectShutdownThread->interrupt();
|
|
threadGroup.interrupt_all();
|
|
}
|
|
|
|
if (detectShutdownThread)
|
|
{
|
|
detectShutdownThread->join();
|
|
delete detectShutdownThread;
|
|
detectShutdownThread = NULL;
|
|
}
|
|
Shutdown();
|
|
|
|
return fRet;
|
|
}
|
|
|
|
extern void noui_connect();
|
|
int main(int argc, char* argv[])
|
|
{
|
|
bool fRet = false;
|
|
fHaveGUI = false;
|
|
|
|
// Connect bitcoind signal handlers
|
|
noui_connect();
|
|
|
|
fRet = AppInit(argc, argv);
|
|
|
|
if (fRet && fDaemon)
|
|
return 0;
|
|
|
|
return (fRet ? 0 : 1);
|
|
}
|