@ -26,6 +26,13 @@ using namespace boost;
CWallet * pwalletMain ;
CWallet * pwalletMain ;
CClientUIInterface uiInterface ;
CClientUIInterface uiInterface ;
// Used to pass flags to the Bind() function
enum BindFlags {
BF_NONE = 0 ,
BF_EXPLICIT = 1 ,
BF_REPORT_ERROR = 2
} ;
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
//
// Shutdown
// Shutdown
@ -213,12 +220,12 @@ bool static InitWarning(const std::string &str)
}
}
bool static Bind ( const CService & addr , bool fError = true ) {
bool static Bind ( const CService & addr , int flags ) {
if ( IsLimited ( addr ) )
if ( ! ( flags & BF_EXPLICIT ) & & IsLimited ( addr ) )
return false ;
return false ;
std : : string strError ;
std : : string strError ;
if ( ! BindListenPort ( addr , strError ) ) {
if ( ! BindListenPort ( addr , strError ) ) {
if ( fError )
if ( flags & BF_REPORT_ERROR )
return InitError ( strError ) ;
return InitError ( strError ) ;
return false ;
return false ;
}
}
@ -251,7 +258,7 @@ std::string HelpMessage()
" -discover " + _ ( " Discover own IP address (default: 1 when listening and no -externalip) " ) + " \n " +
" -discover " + _ ( " Discover own IP address (default: 1 when listening and no -externalip) " ) + " \n " +
" -irc " + _ ( " Find peers using internet relay chat (default: 0) " ) + " \n " +
" -irc " + _ ( " Find peers using internet relay chat (default: 0) " ) + " \n " +
" -listen " + _ ( " Accept connections from outside (default: 1 if no -proxy or -connect) " ) + " \n " +
" -listen " + _ ( " Accept connections from outside (default: 1 if no -proxy or -connect) " ) + " \n " +
" -bind=<addr> " + _ ( " Bind to given address. Use [host]:port notation for IPv6 " ) + " \n " +
" -bind=<addr> " + _ ( " Bind to given address and always listen on it . Use [host]:port notation for IPv6 " ) + " \n " +
" -dnsseed " + _ ( " Find peers using DNS lookup (default: 1 unless -connect) " ) + " \n " +
" -dnsseed " + _ ( " Find peers using DNS lookup (default: 1 unless -connect) " ) + " \n " +
" -banscore=<n> " + _ ( " Threshold for disconnecting misbehaving peers (default: 100) " ) + " \n " +
" -banscore=<n> " + _ ( " Threshold for disconnecting misbehaving peers (default: 100) " ) + " \n " +
" -bantime=<n> " + _ ( " Number of seconds to keep misbehaving peers from reconnecting (default: 86400) " ) + " \n " +
" -bantime=<n> " + _ ( " Number of seconds to keep misbehaving peers from reconnecting (default: 86400) " ) + " \n " +
@ -309,7 +316,6 @@ std::string HelpMessage()
return strUsage ;
return strUsage ;
}
}
struct CImportingNow
struct CImportingNow
{
{
CImportingNow ( ) {
CImportingNow ( ) {
@ -677,32 +683,28 @@ bool AppInit2()
# endif
# endif
bool fBound = false ;
bool fBound = false ;
if ( ! fNoListen )
if ( ! fNoListen ) {
{
std : : string strError ;
if ( mapArgs . count ( " -bind " ) ) {
if ( mapArgs . count ( " -bind " ) ) {
BOOST_FOREACH ( std : : string strBind , mapMultiArgs [ " -bind " ] ) {
BOOST_FOREACH ( std : : string strBind , mapMultiArgs [ " -bind " ] ) {
CService addrBind ;
CService addrBind ;
if ( ! Lookup ( strBind . c_str ( ) , addrBind , GetListenPort ( ) , false ) )
if ( ! Lookup ( strBind . c_str ( ) , addrBind , GetListenPort ( ) , false ) )
return InitError ( strprintf ( _ ( " Cannot resolve -bind address: '%s' " ) , strBind . c_str ( ) ) ) ;
return InitError ( strprintf ( _ ( " Cannot resolve -bind address: '%s' " ) , strBind . c_str ( ) ) ) ;
fBound | = Bind ( addrBind ) ;
fBound | = Bind ( addrBind , ( BF_EXPLICIT | BF_REPORT_ERROR ) ) ;
}
}
} else {
}
else {
struct in_addr inaddr_any ;
struct in_addr inaddr_any ;
inaddr_any . s_addr = INADDR_ANY ;
inaddr_any . s_addr = INADDR_ANY ;
# ifdef USE_IPV6
# ifdef USE_IPV6
if ( ! IsLimited ( NET_IPV6 ) )
fBound | = Bind ( CService ( in6addr_any , GetListenPort ( ) ) , BF_NONE ) ;
fBound | = Bind ( CService ( in6addr_any , GetListenPort ( ) ) , false ) ;
# endif
# endif
if ( ! IsLimited ( NET_IPV4 ) )
fBound | = Bind ( CService ( inaddr_any , GetListenPort ( ) ) , ! fBound ? BF_REPORT_ERROR : BF_NONE ) ;
fBound | = Bind ( CService ( inaddr_any , GetListenPort ( ) ) , ! fBound ) ;
}
}
if ( ! fBound )
if ( ! fBound )
return InitError ( _ ( " Failed to listen on any port. Use -listen=0 if you want this. " ) ) ;
return InitError ( _ ( " Failed to listen on any port. Use -listen=0 if you want this. " ) ) ;
}
}
if ( mapArgs . count ( " -externalip " ) )
if ( mapArgs . count ( " -externalip " ) ) {
{
BOOST_FOREACH ( string strAddr , mapMultiArgs [ " -externalip " ] ) {
BOOST_FOREACH ( string strAddr , mapMultiArgs [ " -externalip " ] ) {
CService addrLocal ( strAddr , GetListenPort ( ) , fNameLookup ) ;
CService addrLocal ( strAddr , GetListenPort ( ) , fNameLookup ) ;
if ( ! addrLocal . IsValid ( ) )
if ( ! addrLocal . IsValid ( ) )