diff options
author | Mathias Stearn <mathias@10gen.com> | 2010-04-08 15:14:38 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2010-04-08 15:15:35 -0400 |
commit | 0efadc48e9da3259765126e035aa33e2cdf0afdd (patch) | |
tree | fd6fd3b640ba13692ef16e309cbb668f9d387cf5 | |
parent | 19da03b95eae7cfc4cadcd8dcb2ad7d46a94c389 (diff) | |
download | mongo-0efadc48e9da3259765126e035aa33e2cdf0afdd.tar.gz |
Disable IPv6 by default. Add function and cmdline opt to enable.
-rw-r--r-- | db/db.cpp | 4 | ||||
-rw-r--r-- | dbtests/socktests.cpp | 2 | ||||
-rw-r--r-- | shell/dbshell.cpp | 4 | ||||
-rw-r--r-- | tools/tool.cpp | 4 | ||||
-rw-r--r-- | util/message.cpp | 4 | ||||
-rw-r--r-- | util/sock.cpp | 7 | ||||
-rw-r--r-- | util/sock.h | 3 |
7 files changed, 25 insertions, 3 deletions
diff --git a/db/db.cpp b/db/db.cpp index a913c84411a..d530bd0ec8a 100644 --- a/db/db.cpp +++ b/db/db.cpp @@ -670,6 +670,7 @@ int main(int argc, char* argv[], char *envp[] ) #else ("nounixsocket", "disable listening on unix sockets") #endif + ("ipv6", "enable IPv6 support (disabled by default)") ; replication_options.add_options() @@ -916,6 +917,9 @@ int main(int argc, char* argv[], char *envp[] ) if (params.count("nounixsocket")){ noUnixSocket = true; } + if (params.count("ipv6")){ + enableIPv6(); + } #if defined(_WIN32) if (params.count("serviceName")){ diff --git a/dbtests/socktests.cpp b/dbtests/socktests.cpp index 4a7e9b8997d..5ca253b36c5 100644 --- a/dbtests/socktests.cpp +++ b/dbtests/socktests.cpp @@ -29,7 +29,7 @@ namespace SockTests { void run() { ASSERT_EQUALS( "127.0.0.1", hostbyname( "localhost" ) ); ASSERT_EQUALS( "127.0.0.1", hostbyname( "127.0.0.1" ) ); - ASSERT_EQUALS( "::1", hostbyname( "::1" ) ); + // ASSERT_EQUALS( "::1", hostbyname( "::1" ) ); // IPv6 disabled at runtime by default. } }; diff --git a/shell/dbshell.cpp b/shell/dbshell.cpp index e742a0910e8..fa7b4353f2a 100644 --- a/shell/dbshell.cpp +++ b/shell/dbshell.cpp @@ -321,6 +321,7 @@ int _main(int argc, char* argv[]) { ("password,p", po::value<string>(&password), "password for authentication") ("help,h", "show this usage information") ("version", "show version information") + ("ipv6", "enable IPv6 support (disabled by default)") ; hidden_options.add_options() @@ -399,6 +400,9 @@ int _main(int argc, char* argv[]) { } } } + if (params.count("ipv6")){ + mongo::enableIPv6(); + } if ( ! mongo::cmdLine.quiet ) cout << "MongoDB shell version: " << mongo::versionString << endl; diff --git a/tools/tool.cpp b/tools/tool.cpp index c9a297768e3..25b443a705f 100644 --- a/tools/tool.cpp +++ b/tools/tool.cpp @@ -46,6 +46,7 @@ namespace mongo { ("collection,c",po::value<string>(), "collection to use (some commands)" ) ("username,u",po::value<string>(), "username" ) ("password,p",po::value<string>(), "password" ) + ("ipv6", "enable IPv6 support (disabled by default)") ; if ( localDBAllowed ) _options->add_options() @@ -191,6 +192,9 @@ namespace mongo { if ( _params.count( "password" ) ) _password = _params["password"].as<string>(); + if (_params.count("ipv6")) + enableIPv6(); + int ret = -1; try { ret = run(); diff --git a/util/message.cpp b/util/message.cpp index 948284764eb..cc4cea90444 100644 --- a/util/message.cpp +++ b/util/message.cpp @@ -48,8 +48,10 @@ namespace mongo { vector<SockAddr> out; if (*ips == '\0'){ out.push_back(SockAddr("0.0.0.0", port)); // IPv4 all + + if (IPv6Enabled()) + out.push_back(SockAddr("::", port)); // IPv6 all #ifndef _WIN32 - out.push_back(SockAddr("::", port)); // IPv6 all if (!noUnixSocket) out.push_back(SockAddr(makeUnixSockPath(port).c_str(), port)); // Unix socket #endif diff --git a/util/sock.cpp b/util/sock.cpp index 979ae2061e7..83a1c4c7a23 100644 --- a/util/sock.cpp +++ b/util/sock.cpp @@ -22,6 +22,10 @@ namespace mongo { static mongo::mutex sock_mutex; + static bool ipv6 = false; + void enableIPv6(bool state) { ipv6 = state; } + bool IPv6Enabled() { return ipv6; } + SockAddr::SockAddr(int sourcePort) { memset(as<sockaddr_in>().sin_zero, 0, sizeof(as<sockaddr_in>().sin_zero)); as<sockaddr_in>().sin_family = AF_INET; @@ -47,7 +51,8 @@ namespace mongo { addrinfo hints; memset(&hints, 0, sizeof(addrinfo)); hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_ADDRCONFIG; + hints.ai_flags = AI_ADDRCONFIG; + hints.ai_family = (IPv6Enabled() ? AF_UNSPEC : AF_INET); stringstream ss; ss << port; diff --git a/util/sock.h b/util/sock.h index 217cf178970..ba3b2d31455 100644 --- a/util/sock.h +++ b/util/sock.h @@ -116,6 +116,9 @@ namespace mongo { // in, look up its ip and return that. Returns "" on failure. string hostbyname(const char *hostname); + void enableIPv6(bool state=true); + bool IPv6Enabled(); + struct SockAddr { SockAddr() { addressSize = sizeof(sa); |