aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Maxwell <gmaxwell@gmail.com>2012-05-14 09:22:03 -0700
committerGregory Maxwell <gmaxwell@gmail.com>2012-05-14 09:22:03 -0700
commita6f18e4686d764a62905b8d8cd316dcbd40bb17d (patch)
treebff12d156a2fbe1c8b06e72a0394015469df3b4c
parent0071a540d40f8e7cf75eb555f007ab61473a3a81 (diff)
parent91dace35a1c7821675c369d60d1e88b2ed638842 (diff)
downloadbitcoin-a6f18e4686d764a62905b8d8cd316dcbd40bb17d.tar.xz
Merge pull request #1299 from sipa/ipv6fixes
A few more IPv6-related improvements
-rw-r--r--src/init.cpp28
-rw-r--r--src/net.cpp11
-rw-r--r--src/net.h1
3 files changed, 28 insertions, 12 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 0d3679657b..9b12ab0aa4 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -204,7 +204,7 @@ std::string HelpMessage()
" -connect=<ip> " + _("Connect only to the specified node") + "\n" +
" -seednode=<ip> " + _("Connect to a node to retrieve peer addresses, and disconnect") + "\n" +
" -externalip=<ip> " + _("Specify your own public address") + "\n" +
- " -blocknet=<net> " + _("Do not connect to addresses in network <net> (IPv4 or IPv6)") + "\n" +
+ " -onlynet=<net> " + _("Only connect to nodes in network <net> (IPv4 or IPv6)") + "\n" +
" -discover " + _("Try to discover public IP address (default: 1)") + "\n" +
" -irc " + _("Find peers using internet relay chat (default: 0)") + "\n" +
" -listen " + _("Accept connections from outside (default: 1)") + "\n" +
@@ -572,12 +572,18 @@ bool AppInit2()
SoftSetBoolArg("-discover", false);
}
- if (mapArgs.count("-blocknet")) {
- BOOST_FOREACH(std::string snet, mapMultiArgs["-blocknet"]) {
+ if (mapArgs.count("-onlynet")) {
+ std::set<enum Network> nets;
+ BOOST_FOREACH(std::string snet, mapMultiArgs["-onlynet"]) {
enum Network net = ParseNetwork(snet);
if (net == NET_UNROUTABLE)
- return InitError(strprintf(_("Unknown network specified in -blocknet: '%s'"), snet.c_str()));
- SetLimited(net);
+ return InitError(strprintf(_("Unknown network specified in -onlynet: '%s'"), snet.c_str()));
+ nets.insert(net);
+ }
+ for (int n = 0; n < NET_MAX; n++) {
+ enum Network net = (enum Network)n;
+ if (!nets.count(net))
+ SetLimited(net);
}
}
@@ -605,21 +611,23 @@ bool AppInit2()
std::string strError;
if (mapArgs.count("-bind")) {
BOOST_FOREACH(std::string strBind, mapMultiArgs["-bind"]) {
- CService addrBind(strBind, GetListenPort(), false);
- if (!addrBind.IsValid())
+ CService addrBind;
+ if (!Lookup(strBind.c_str(), addrBind, GetListenPort(), false))
return InitError(strprintf(_("Cannot resolve -bind address: '%s'"), strBind.c_str()));
fBound |= Bind(addrBind);
}
} else {
struct in_addr inaddr_any;
inaddr_any.s_addr = INADDR_ANY;
- fBound |= Bind(CService(inaddr_any, GetListenPort()));
+ if (!IsLimited(NET_IPV4))
+ fBound |= Bind(CService(inaddr_any, GetListenPort()));
#ifdef USE_IPV6
- fBound |= Bind(CService(in6addr_any, GetListenPort()));
+ if (!IsLimited(NET_IPV6))
+ fBound |= Bind(CService(in6addr_any, GetListenPort()));
#endif
}
if (!fBound)
- return false;
+ return InitError(_("Not listening on any port"));
}
if (mapArgs.count("-externalip"))
diff --git a/src/net.cpp b/src/net.cpp
index 88578cdcb3..e48b300953 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -245,14 +245,21 @@ bool AddLocal(const CNetAddr &addr, int nScore)
/** Make a particular network entirely off-limits (no automatic connects to it) */
void SetLimited(enum Network net, bool fLimited)
{
+ if (net == NET_UNROUTABLE)
+ return;
LOCK(cs_mapLocalHost);
vfLimited[net] = fLimited;
}
-bool IsLimited(const CNetAddr& addr)
+bool IsLimited(enum Network net)
{
LOCK(cs_mapLocalHost);
- return vfLimited[addr.GetNetwork()];
+ return vfLimited[net];
+}
+
+bool IsLimited(const CNetAddr &addr)
+{
+ return IsLimited(addr.GetNetwork());
}
/** vote for a local address */
diff --git a/src/net.h b/src/net.h
index 3755c765d3..cb90ef6e72 100644
--- a/src/net.h
+++ b/src/net.h
@@ -57,6 +57,7 @@ enum
};
void SetLimited(enum Network net, bool fLimited = true);
+bool IsLimited(enum Network net);
bool IsLimited(const CNetAddr& addr);
bool AddLocal(const CService& addr, int nScore = LOCAL_NONE);
bool AddLocal(const CNetAddr& addr, int nScore = LOCAL_NONE);