|
|
@ -88,14 +88,6 @@ static CZMQNotificationInterface* pzmqNotificationInterface = NULL; |
|
|
|
#define MIN_CORE_FILEDESCRIPTORS 150 |
|
|
|
#define MIN_CORE_FILEDESCRIPTORS 150 |
|
|
|
#endif |
|
|
|
#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"; |
|
|
|
static const char* FEE_ESTIMATES_FILENAME="fee_estimates.dat"; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
@ -296,17 +288,6 @@ static void registerSignalHandler(int signal, void(*handler)(int)) |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#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() |
|
|
|
void OnRPCStarted() |
|
|
|
{ |
|
|
|
{ |
|
|
|
uiInterface.NotifyBlockTip.connect(&RPCNotifyBlockChange); |
|
|
|
uiInterface.NotifyBlockTip.connect(&RPCNotifyBlockChange); |
|
|
@ -898,10 +879,16 @@ bool AppInitParameterInteraction() |
|
|
|
return InitError(_("Prune mode is incompatible with -txindex.")); |
|
|
|
return InitError(_("Prune mode is incompatible with -txindex.")); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// -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); |
|
|
|
|
|
|
|
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
|
|
|
|
// Make sure enough file descriptors are available
|
|
|
|
int nBind = std::max( |
|
|
|
int nBind = std::max(nUserBind, size_t(1)); |
|
|
|
(gArgs.IsArgSet("-bind") ? gArgs.GetArgs("-bind").size() : 0) + |
|
|
|
|
|
|
|
(gArgs.IsArgSet("-whitebind") ? gArgs.GetArgs("-whitebind").size() : 0), size_t(1)); |
|
|
|
|
|
|
|
nUserMaxConnections = GetArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS); |
|
|
|
nUserMaxConnections = GetArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS); |
|
|
|
nMaxConnections = std::max(nUserMaxConnections, 0); |
|
|
|
nMaxConnections = std::max(nUserMaxConnections, 0); |
|
|
|
|
|
|
|
|
|
|
@ -1280,16 +1267,6 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (gArgs.IsArgSet("-whitelist")) { |
|
|
|
|
|
|
|
for (const std::string& net : gArgs.GetArgs("-whitelist")) { |
|
|
|
|
|
|
|
CSubNet subnet; |
|
|
|
|
|
|
|
LookupSubNet(net.c_str(), subnet); |
|
|
|
|
|
|
|
if (!subnet.IsValid()) |
|
|
|
|
|
|
|
return InitError(strprintf(_("Invalid netmask specified in -whitelist: '%s'"), net)); |
|
|
|
|
|
|
|
connman.AddWhitelistedRange(subnet); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check for host lookup allowed before parsing any network related parameters
|
|
|
|
// Check for host lookup allowed before parsing any network related parameters
|
|
|
|
fNameLookup = GetBoolArg("-dns", DEFAULT_NAME_LOOKUP); |
|
|
|
fNameLookup = GetBoolArg("-dns", DEFAULT_NAME_LOOKUP); |
|
|
|
|
|
|
|
|
|
|
@ -1340,36 +1317,6 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) |
|
|
|
fDiscover = GetBoolArg("-discover", true); |
|
|
|
fDiscover = GetBoolArg("-discover", true); |
|
|
|
fRelayTxes = !GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY); |
|
|
|
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")) { |
|
|
|
if (gArgs.IsArgSet("-externalip")) { |
|
|
|
for (const std::string& strAddr : gArgs.GetArgs("-externalip")) { |
|
|
|
for (const std::string& strAddr : gArgs.GetArgs("-externalip")) { |
|
|
|
CService addrLocal; |
|
|
|
CService addrLocal; |
|
|
@ -1636,7 +1583,6 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) |
|
|
|
// Map ports with UPnP
|
|
|
|
// Map ports with UPnP
|
|
|
|
MapPort(GetBoolArg("-upnp", DEFAULT_UPNP)); |
|
|
|
MapPort(GetBoolArg("-upnp", DEFAULT_UPNP)); |
|
|
|
|
|
|
|
|
|
|
|
std::string strNodeError; |
|
|
|
|
|
|
|
CConnman::Options connOptions; |
|
|
|
CConnman::Options connOptions; |
|
|
|
connOptions.nLocalServices = nLocalServices; |
|
|
|
connOptions.nLocalServices = nLocalServices; |
|
|
|
connOptions.nRelevantServices = nRelevantServices; |
|
|
|
connOptions.nRelevantServices = nRelevantServices; |
|
|
@ -1652,12 +1598,45 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) |
|
|
|
connOptions.nMaxOutboundTimeframe = nMaxOutboundTimeframe; |
|
|
|
connOptions.nMaxOutboundTimeframe = nMaxOutboundTimeframe; |
|
|
|
connOptions.nMaxOutboundLimit = nMaxOutboundLimit; |
|
|
|
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; |
|
|
|
|
|
|
|
LookupSubNet(net.c_str(), subnet); |
|
|
|
|
|
|
|
if (!subnet.IsValid()) |
|
|
|
|
|
|
|
return InitError(strprintf(_("Invalid netmask specified in -whitelist: '%s'"), net)); |
|
|
|
|
|
|
|
connOptions.vWhitelistedRange.push_back(subnet); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (gArgs.IsArgSet("-seednode")) { |
|
|
|
if (gArgs.IsArgSet("-seednode")) { |
|
|
|
connOptions.vSeedNodes = gArgs.GetArgs("-seednode"); |
|
|
|
connOptions.vSeedNodes = gArgs.GetArgs("-seednode"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!connman.Start(scheduler, strNodeError, connOptions)) |
|
|
|
if (!connman.Start(scheduler, connOptions)) { |
|
|
|
return InitError(strNodeError); |
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ********************************************************* Step 12: finished
|
|
|
|
// ********************************************************* Step 12: finished
|
|
|
|
|
|
|
|
|
|
|
|