summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2010-04-08 15:14:38 -0400
committerMathias Stearn <mathias@10gen.com>2010-04-08 15:15:35 -0400
commit0efadc48e9da3259765126e035aa33e2cdf0afdd (patch)
treefd6fd3b640ba13692ef16e309cbb668f9d387cf5
parent19da03b95eae7cfc4cadcd8dcb2ad7d46a94c389 (diff)
downloadmongo-0efadc48e9da3259765126e035aa33e2cdf0afdd.tar.gz
Disable IPv6 by default. Add function and cmdline opt to enable.
-rw-r--r--db/db.cpp4
-rw-r--r--dbtests/socktests.cpp2
-rw-r--r--shell/dbshell.cpp4
-rw-r--r--tools/tool.cpp4
-rw-r--r--util/message.cpp4
-rw-r--r--util/sock.cpp7
-rw-r--r--util/sock.h3
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);