Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F10615355
bitcoind.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
5 KB
Subscribers
None
bitcoind.cpp
View Options
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2015 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include
"chainparams.h"
#include
"clientversion.h"
#include
"rpc/server.h"
#include
"init.h"
#include
"noui.h"
#include
"scheduler.h"
#include
"util.h"
#include
"httpserver.h"
#include
"httprpc.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.
*
* 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
bool
fDaemon
;
void
WaitForShutdown
(
boost
::
thread_group
*
threadGroup
)
{
bool
fShutdown
=
ShutdownRequested
();
// Tell the main threads to shutdown.
while
(
!
fShutdown
)
{
MilliSleep
(
200
);
fShutdown
=
ShutdownRequested
();
}
if
(
threadGroup
)
{
Interrupt
(
*
threadGroup
);
threadGroup
->
join_all
();
}
}
//////////////////////////////////////////////////////////////////////////////
//
// Start
//
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()
ParseParameters
(
argc
,
argv
);
// Process help and version before taking care about datadir
if
(
mapArgs
.
count
(
"-?"
)
||
mapArgs
.
count
(
"-h"
)
||
mapArgs
.
count
(
"-help"
)
||
mapArgs
.
count
(
"-version"
))
{
std
::
string
strUsage
=
_
(
"Bitcoin Core Daemon"
)
+
" "
+
_
(
"version"
)
+
" "
+
FormatFullVersion
()
+
"
\n
"
;
if
(
mapArgs
.
count
(
"-version"
))
{
strUsage
+=
LicenseInfo
();
}
else
{
strUsage
+=
"
\n
"
+
_
(
"Usage:"
)
+
"
\n
"
+
" bitcoind [options] "
+
_
(
"Start Bitcoin Core Daemon"
)
+
"
\n
"
;
strUsage
+=
"
\n
"
+
HelpMessage
(
HMM_BITCOIND
);
}
fprintf
(
stdout
,
"%s"
,
strUsage
.
c_str
());
return
false
;
}
try
{
if
(
!
boost
::
filesystem
::
is_directory
(
GetDataDir
(
false
)))
{
fprintf
(
stderr
,
"Error: Specified data directory
\"
%s
\"
does not exist.
\n
"
,
mapArgs
[
"-datadir"
].
c_str
());
return
false
;
}
try
{
ReadConfigFile
(
mapArgs
,
mapMultiArgs
);
}
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)
try
{
SelectParams
(
ChainNameFromCommandLine
());
}
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:"
))
fCommandLine
=
true
;
if
(
fCommandLine
)
{
fprintf
(
stderr
,
"Error: There is no RPC client functionality in bitcoind anymore. Use the bitcoin-cli utility instead.
\n
"
);
exit
(
1
);
}
#ifndef WIN32
fDaemon
=
GetBoolArg
(
"-daemon"
,
false
);
if
(
fDaemon
)
{
fprintf
(
stdout
,
"Bitcoin server starting
\n
"
);
// 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
{
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
SoftSetBoolArg
(
"-server"
,
true
);
// Set this early so that parameter interactions go to console
InitLogging
();
InitParameterInteraction
();
fRet
=
AppInit2
(
threadGroup
,
scheduler
);
}
catch
(
const
std
::
exception
&
e
)
{
PrintExceptionContinue
(
&
e
,
"AppInit()"
);
}
catch
(...)
{
PrintExceptionContinue
(
NULL
,
"AppInit()"
);
}
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
}
else
{
WaitForShutdown
(
&
threadGroup
);
}
Shutdown
();
return
fRet
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
SetupEnvironment
();
// Connect bitcoind signal handlers
noui_connect
();
return
(
AppInit
(
argc
,
argv
)
?
0
:
1
);
}
File Metadata
Details
Attached
Mime Type
text/x-tex
Expires
Sat, Nov 23, 10:05 (1 d, 4 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4559241
Default Alt Text
bitcoind.cpp (5 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment