summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHaavard <havardpe@yahoo-inc.com>2017-04-07 13:42:01 +0000
committerHaavard <havardpe@yahoo-inc.com>2017-04-07 13:44:37 +0000
commite4d73b77d98cb1a8461ce765b5cf9d39612648fb (patch)
tree6e3635f4f1e2bc396fd7992ca229673c76299449 /vespalib
parent9074fb3e8509d803dfcc4484c3dc1e9d6d39c909 (diff)
do not include wildcard ip in address spec
also use 'localhost' as fallback for client addresses
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/net/socket/socket_test.cpp48
-rw-r--r--vespalib/src/vespa/vespalib/net/socket_address.cpp23
-rw-r--r--vespalib/src/vespa/vespalib/net/socket_address.h1
-rw-r--r--vespalib/src/vespa/vespalib/net/socket_spec.cpp3
4 files changed, 69 insertions, 6 deletions
diff --git a/vespalib/src/tests/net/socket/socket_test.cpp b/vespalib/src/tests/net/socket/socket_test.cpp
index a5a97e7d1ae..44380f7d31e 100644
--- a/vespalib/src/tests/net/socket/socket_test.cpp
+++ b/vespalib/src/tests/net/socket/socket_test.cpp
@@ -10,6 +10,23 @@
using namespace vespalib;
+vespalib::string get_meta(const SocketAddress &addr) {
+ vespalib::string meta;
+ if (addr.is_ipv4()) {
+ meta = "ipv4";
+ } else if (addr.is_ipv6()) {
+ meta = "ipv6";
+ } else if (addr.is_ipc()) {
+ meta = "ipc";
+ } else {
+ meta = "???";
+ }
+ if (addr.is_wildcard()) {
+ meta += " wildcard";
+ }
+ return meta;
+}
+
vespalib::string read_bytes(Socket &socket, size_t wanted_bytes) {
char tmp[64];
vespalib::string result;
@@ -44,8 +61,11 @@ Socket::UP connect_sockets(bool is_server, ServerSocket &server_socket) {
if (is_server) {
return server_socket.accept();
} else {
- vespalib::string spec = server_socket.address().spec();
- fprintf(stderr, "connecting to: %s\n", spec.c_str());
+ auto server = server_socket.address();
+ auto spec = server.spec();
+ auto client = SocketSpec(spec).client_address();
+ fprintf(stderr, "connecting to '%s' (server: %s) (client: %s)\n",
+ spec.c_str(), get_meta(server).c_str(), get_meta(client).c_str());
return Socket::connect(SocketSpec(spec));
}
}
@@ -56,7 +76,9 @@ TEST("my local address") {
auto list = SocketAddress::resolve(4080);
fprintf(stderr, "resolve(4080):\n");
for (const auto &addr: list) {
- fprintf(stderr, " %s\n", addr.spec().c_str());
+ EXPECT_TRUE(addr.is_wildcard());
+ EXPECT_EQUAL(addr.port(), 4080);
+ fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str());
}
}
@@ -64,16 +86,32 @@ TEST("yahoo.com address") {
auto list = SocketAddress::resolve(80, "yahoo.com");
fprintf(stderr, "resolve(80, 'yahoo.com'):\n");
for (const auto &addr: list) {
- fprintf(stderr, " %s\n", addr.spec().c_str());
+ EXPECT_TRUE(!addr.is_wildcard());
+ EXPECT_EQUAL(addr.port(), 80);
+ fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str());
}
}
TEST("ipc address") {
auto addr = SocketAddress::from_path("my_socket");
EXPECT_TRUE(addr.is_ipc());
+ EXPECT_TRUE(!addr.is_wildcard());
+ EXPECT_EQUAL(addr.port(), -1);
EXPECT_EQUAL(vespalib::string("my_socket"), addr.path());
fprintf(stderr, "from_path(my_socket)\n");
- fprintf(stderr, " %s\n", addr.spec().c_str());
+ fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str());
+}
+
+TEST("local client/server addresses") {
+ auto spec = SocketSpec("tcp/123");
+ auto client = spec.client_address();
+ auto server = spec.server_address();
+ EXPECT_TRUE(!client.is_wildcard());
+ EXPECT_EQUAL(client.port(), 123);
+ EXPECT_TRUE(server.is_wildcard());
+ EXPECT_EQUAL(server.port(), 123);
+ fprintf(stderr, "client(tcp/123): %s (%s)\n", client.spec().c_str(), get_meta(client).c_str());
+ fprintf(stderr, "server(tcp/123): %s (%s)\n", server.spec().c_str(), get_meta(server).c_str());
}
struct ServerWrapper {
diff --git a/vespalib/src/vespa/vespalib/net/socket_address.cpp b/vespalib/src/vespa/vespalib/net/socket_address.cpp
index d6cb5a3582b..1484c650156 100644
--- a/vespalib/src/vespa/vespalib/net/socket_address.cpp
+++ b/vespalib/src/vespa/vespalib/net/socket_address.cpp
@@ -11,6 +11,26 @@
namespace vespalib {
+namespace {
+
+const in6_addr ipv6_wildcard = IN6ADDR_ANY_INIT;
+
+} // namespace vespalib::<unnamed>
+
+bool
+SocketAddress::is_wildcard() const
+{
+ if (is_ipv4()) {
+ const sockaddr_in *addr = reinterpret_cast<const sockaddr_in *>(&_addr);
+ return (addr->sin_addr.s_addr == htonl(INADDR_ANY));
+ }
+ if (is_ipv6()) {
+ const sockaddr_in6 *addr = reinterpret_cast<const sockaddr_in6 *>(&_addr);
+ return (memcmp(&addr->sin6_addr, &ipv6_wildcard, sizeof(in6_addr)) == 0);
+ }
+ return false;
+}
+
vespalib::string
SocketAddress::ip_address() const
{
@@ -69,6 +89,9 @@ SocketAddress::port() const
vespalib::string
SocketAddress::spec() const
{
+ if (is_wildcard()) {
+ return make_string("tcp/%d", port());
+ }
if (is_ipv4()) {
return make_string("tcp/%s:%d", ip_address().c_str(), port());
}
diff --git a/vespalib/src/vespa/vespalib/net/socket_address.h b/vespalib/src/vespa/vespalib/net/socket_address.h
index a71b676f274..e614aca5365 100644
--- a/vespalib/src/vespa/vespalib/net/socket_address.h
+++ b/vespalib/src/vespa/vespalib/net/socket_address.h
@@ -32,6 +32,7 @@ public:
bool is_ipv4() const { return (valid() && (_addr.ss_family == AF_INET)); }
bool is_ipv6() const { return (valid() && (_addr.ss_family == AF_INET6)); }
bool is_ipc() const { return (valid() && (_addr.ss_family == AF_UNIX)); }
+ bool is_wildcard() const;
int port() const;
vespalib::string ip_address() const;
vespalib::string path() const;
diff --git a/vespalib/src/vespa/vespalib/net/socket_spec.cpp b/vespalib/src/vespa/vespalib/net/socket_spec.cpp
index 6427225dbae..061ba5879f5 100644
--- a/vespalib/src/vespa/vespalib/net/socket_spec.cpp
+++ b/vespalib/src/vespa/vespalib/net/socket_spec.cpp
@@ -20,7 +20,8 @@ SocketSpec::address(bool server) const
if (!_path.empty()) {
return SocketAddress::from_path(_path);
}
- const char *node = _host.empty() ? nullptr : _host.c_str();
+ const char *fallback = server ? nullptr : "localhost";
+ const char *node = _host.empty() ? fallback : _host.c_str();
if (server) {
return SocketAddress::select_local(_port, node);
} else {