@ -88,14 +88,6 @@ static CZMQNotificationInterface* pzmqNotificationInterface = NULL;
# define MIN_CORE_FILEDESCRIPTORS 150
# endif
/** Used to pass flags to the Bind() function */
enum BindFlags {
BF_NONE = 0 ,
BF_EXPLICIT = ( 1U < < 0 ) ,
BF_REPORT_ERROR = ( 1U < < 1 ) ,
BF_WHITELIST = ( 1U < < 2 ) ,
} ;
static const char * FEE_ESTIMATES_FILENAME = " fee_estimates.dat " ;
//////////////////////////////////////////////////////////////////////////////
@ -296,17 +288,6 @@ static void registerSignalHandler(int signal, void(*handler)(int))
}
# endif
bool static Bind ( CConnman & connman , const CService & addr , unsigned int flags ) {
if ( ! ( flags & BF_EXPLICIT ) & & IsLimited ( addr ) )
return false ;
std : : string strError ;
if ( ! connman . BindListenPort ( addr , strError , ( flags & BF_WHITELIST ) ! = 0 ) ) {
if ( flags & BF_REPORT_ERROR )
return InitError ( strError ) ;
return false ;
}
return true ;
}
void OnRPCStarted ( )
{
uiInterface . NotifyBlockTip . connect ( & RPCNotifyBlockChange ) ;
@ -900,10 +881,16 @@ bool AppInitParameterInteraction()
return InitError ( _ ( " Prune mode is incompatible with -txindex. " ) ) ;
}
// Make sure enough file descriptors are available
int nBind = std : : max (
// -bind and -whitebind can't be set when not listening
size_t nUserBind =
( gArgs . IsArgSet ( " -bind " ) ? gArgs . GetArgs ( " -bind " ) . size ( ) : 0 ) +
( gArgs . IsArgSet ( " -whitebind " ) ? gArgs . GetArgs ( " -whitebind " ) . size ( ) : 0 ) , size_t ( 1 ) ) ;
( gArgs . IsArgSet ( " -whitebind " ) ? gArgs . GetArgs ( " -whitebind " ) . size ( ) : 0 ) ;
if ( nUserBind ! = 0 & & ! gArgs . GetBoolArg ( " -listen " , DEFAULT_LISTEN ) ) {
return InitError ( " Cannot set -bind or -whitebind together with -listen=0 " ) ;
}
// Make sure enough file descriptors are available
int nBind = std : : max ( nUserBind , size_t ( 1 ) ) ;
nUserMaxConnections = GetArg ( " -maxconnections " , DEFAULT_MAX_PEER_CONNECTIONS ) ;
nMaxConnections = std : : max ( nUserMaxConnections , 0 ) ;
@ -1339,36 +1326,6 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
fDiscover = GetBoolArg ( " -discover " , true ) ;
fRelayTxes = ! GetBoolArg ( " -blocksonly " , DEFAULT_BLOCKSONLY ) ;
if ( fListen ) {
bool fBound = false ;
if ( gArgs . IsArgSet ( " -bind " ) ) {
for ( const std : : string & strBind : gArgs . GetArgs ( " -bind " ) ) {
CService addrBind ;
if ( ! Lookup ( strBind . c_str ( ) , addrBind , GetListenPort ( ) , false ) )
return InitError ( ResolveErrMsg ( " bind " , strBind ) ) ;
fBound | = Bind ( connman , addrBind , ( BF_EXPLICIT | BF_REPORT_ERROR ) ) ;
}
}
if ( gArgs . IsArgSet ( " -whitebind " ) ) {
for ( const std : : string & strBind : gArgs . GetArgs ( " -whitebind " ) ) {
CService addrBind ;
if ( ! Lookup ( strBind . c_str ( ) , addrBind , 0 , false ) )
return InitError ( ResolveErrMsg ( " whitebind " , strBind ) ) ;
if ( addrBind . GetPort ( ) = = 0 )
return InitError ( strprintf ( _ ( " Need to specify a port with -whitebind: '%s' " ) , strBind ) ) ;
fBound | = Bind ( connman , addrBind , ( BF_EXPLICIT | BF_REPORT_ERROR | BF_WHITELIST ) ) ;
}
}
if ( ! gArgs . IsArgSet ( " -bind " ) & & ! gArgs . IsArgSet ( " -whitebind " ) ) {
struct in_addr inaddr_any ;
inaddr_any . s_addr = INADDR_ANY ;
fBound | = Bind ( connman , CService ( in6addr_any , GetListenPort ( ) ) , BF_NONE ) ;
fBound | = Bind ( connman , CService ( inaddr_any , GetListenPort ( ) ) , ! fBound ? BF_REPORT_ERROR : BF_NONE ) ;
}
if ( ! fBound )
return InitError ( _ ( " Failed to listen on any port. Use -listen=0 if you want this. " ) ) ;
}
if ( gArgs . IsArgSet ( " -externalip " ) ) {
for ( const std : : string & strAddr : gArgs . GetArgs ( " -externalip " ) ) {
CService addrLocal ;
@ -1635,7 +1592,6 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
// Map ports with UPnP
MapPort ( GetBoolArg ( " -upnp " , DEFAULT_UPNP ) ) ;
std : : string strNodeError ;
CConnman : : Options connOptions ;
connOptions . nLocalServices = nLocalServices ;
connOptions . nRelevantServices = nRelevantServices ;
@ -1651,6 +1607,28 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
connOptions . nMaxOutboundTimeframe = nMaxOutboundTimeframe ;
connOptions . nMaxOutboundLimit = nMaxOutboundLimit ;
if ( gArgs . IsArgSet ( " -bind " ) ) {
for ( const std : : string & strBind : gArgs . GetArgs ( " -bind " ) ) {
CService addrBind ;
if ( ! Lookup ( strBind . c_str ( ) , addrBind , GetListenPort ( ) , false ) ) {
return InitError ( ResolveErrMsg ( " bind " , strBind ) ) ;
}
connOptions . vBinds . push_back ( addrBind ) ;
}
}
if ( gArgs . IsArgSet ( " -whitebind " ) ) {
for ( const std : : string & strBind : gArgs . GetArgs ( " -whitebind " ) ) {
CService addrBind ;
if ( ! Lookup ( strBind . c_str ( ) , addrBind , 0 , false ) ) {
return InitError ( ResolveErrMsg ( " whitebind " , strBind ) ) ;
}
if ( addrBind . GetPort ( ) = = 0 ) {
return InitError ( strprintf ( _ ( " Need to specify a port with -whitebind: '%s' " ) , strBind ) ) ;
}
connOptions . vWhiteBinds . push_back ( addrBind ) ;
}
}
if ( gArgs . IsArgSet ( " -whitelist " ) ) {
for ( const auto & net : gArgs . GetArgs ( " -whitelist " ) ) {
CSubNet subnet ;
@ -1665,8 +1643,9 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
connOptions . vSeedNodes = gArgs . GetArgs ( " -seednode " ) ;
}
if ( ! connman . Start ( scheduler , strNodeError , connOptions ) )
return InitError ( strNodeError ) ;
if ( ! connman . Start ( scheduler , connOptions ) ) {
return false ;
}
// ********************************************************* Step 12: finished