Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F12428711
bitcoind.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Subscribers
None
bitcoind.cpp
View Options
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2018 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
<config.h>
#include
<httprpc.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
;
/* Introduction text for doxygen: */
/*! \mainpage Developer documentation
*
* \section intro_sec Introduction
*
* This is the developer documentation of Bitcoin ABC
* (https://www.bitcoinabc.org/). Bitcoin ABC is a client for the digital
* currency called Bitcoin Cash (https://www.bitcoincash.org/), which enables
* instant payments to anyone, anywhere in the world. Bitcoin Cash 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.
*
* \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.
*/
static
void
WaitForShutdown
(
NodeContext
&
node
)
{
while
(
!
ShutdownRequested
())
{
UninterruptibleSleep
(
std
::
chrono
::
milliseconds
{
200
});
}
Interrupt
(
node
);
}
//////////////////////////////////////////////////////////////////////////////
//
// Start
//
static
bool
AppInit
(
int
argc
,
char
*
argv
[])
{
// FIXME: Ideally, we'd like to build the config here, but that's currently
// not possible as the whole application has too many global state. However,
// this is a first step.
auto
&
config
=
const_cast
<
Config
&>
(
GetConfig
());
RPCServer
rpcServer
;
HTTPRPCRequestProcessor
httpRPCRequestProcessor
(
config
,
rpcServer
);
NodeContext
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
" Daemon version "
+
FormatFullVersion
()
+
"
\n
"
;
if
(
gArgs
.
IsArgSet
(
"-version"
))
{
strUsage
+=
FormatParagraph
(
LicenseInfo
());
}
else
{
strUsage
+=
"
\n
Usage: bitcoind [options] "
"Start "
PACKAGE_NAME
" Daemon
\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
());
node
.
chain
=
interfaces
::
MakeChain
(
node
,
config
.
GetChainParams
());
}
catch
(
const
std
::
exception
&
e
)
{
return
InitError
(
strprintf
(
"%s
\n
"
,
e
.
what
()));
}
// Make sure we create the net-specific data directory early on: if it
// is new, this has a side effect of also creating
// <datadir>/<net>/wallets/.
//
// TODO: this should be removed once GetDataDir() no longer creates the
// wallets/ subdirectory.
// See more info at:
// https://reviews.bitcoinabc.org/D3312
GetDataDir
(
true
);
// 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
(
config
))
{
// 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
" daemon 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
(
config
,
rpcServer
,
httpRPCRequestProcessor
,
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
);
}
File Metadata
Details
Attached
Mime Type
text/x-tex
Expires
Sun, Dec 29, 19:21 (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4842204
Default Alt Text
bitcoind.cpp (7 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment