summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2011-08-19 12:34:31 +0200
committerMartin Sustrik <sustrik@250bpm.com>2011-08-19 12:34:31 +0200
commit80a5f60e3397c9376026da48e6415c7011e2a647 (patch)
tree17f7007a96c6d539593bb781e7e2888a7e8c7598
parentf0c7edbc9c39ec3a6d06a9605a376212c2228fc7 (diff)
NIC name resolution moved to tcp_address_t
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r--src/tcp_address.cpp32
-rw-r--r--src/tcp_address.hpp4
2 files changed, 16 insertions, 20 deletions
diff --git a/src/tcp_address.cpp b/src/tcp_address.cpp
index 7be8b75..999c015 100644
--- a/src/tcp_address.cpp
+++ b/src/tcp_address.cpp
@@ -47,10 +47,10 @@
#include <sys/sockio.h>
#include <net/if.h>
#include <unistd.h>
+#include <stdlib.h>
// On Solaris platform, network interface name can be queried by ioctl.
-static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
- bool ipv4only_)
+int zmq::tcp_address_t::resolve_nic_name (const char *nic_, bool ipv4only_)
{
// TODO: Unused parameter, IPv6 support not implemented for Solaris.
(void) ipv4only_;
@@ -85,11 +85,11 @@ static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
lifreq *ifrp = ifc.lifc_req;
for (int n = 0; n < (int) (ifc.lifc_len / sizeof (lifreq));
n ++, ifrp ++) {
- if (!strcmp (interface_, ifrp->lifr_name)) {
+ if (!strcmp (nic_, ifrp->lifr_name)) {
rc = ioctl (fd, SIOCGLIFADDR, (char*) ifrp);
zmq_assert (rc != -1);
if (ifrp->lifr_addr.ss_family == AF_INET) {
- *(sockaddr_in*) addr_ = *(sockaddr_in*) &ifrp->lifr_addr;
+ address.ipv4 = *(sockaddr_in*) &ifrp->lifr_addr;
found = true;
break;
}
@@ -115,8 +115,7 @@ static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
#include <sys/ioctl.h>
#include <net/if.h>
-static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
- bool ipv4only_)
+int zmq::tcp_address_t::resolve_nic_name (const char *nic_, bool ipv4only_)
{
// TODO: Unused parameter, IPv6 support not implemented for AIX or HP/UX.
(void) ipv4only_;
@@ -128,7 +127,7 @@ static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
struct ifreq ifr;
// Copy interface name for ioctl get.
- strncpy (ifr.ifr_name, interface_, sizeof (ifr.ifr_name));
+ strncpy (ifr.ifr_name, nic_, sizeof (ifr.ifr_name));
// Fetch interface address.
int rc = ioctl (sd, SIOCGIFADDR, (caddr_t) &ifr, sizeof (struct ifreq));
@@ -141,8 +140,8 @@ static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
return -1;
}
- memcpy (&((sockaddr_in*) addr_)->sin_addr,
- &((sockaddr_in*) &ifr.ifr_addr)->sin_addr, sizeof (in_addr));
+ memcpy (&address.ipv4.sin_addr, &((sockaddr_in*) &ifr.ifr_addr)->sin_addr,
+ sizeof (in_addr));
return 0;
}
@@ -156,8 +155,7 @@ static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
// On these platforms, network interface name can be queried
// using getifaddrs function.
-static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
- bool ipv4only_)
+int zmq::tcp_address_t::resolve_nic_name (const char *nic_, bool ipv4only_)
{
// Get the addresses.
ifaddrs* ifa = NULL;
@@ -176,9 +174,9 @@ static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
if ((family == AF_INET
|| (!ipv4only_ && family == AF_INET6))
- && !strcmp (interface_, ifp->ifa_name))
+ && !strcmp (nic_, ifp->ifa_name))
{
- memcpy (addr_, ifp->ifa_addr,
+ memcpy (&address, ifp->ifa_addr,
(family == AF_INET) ? sizeof (struct sockaddr_in)
: sizeof (struct sockaddr_in6));
found = true;
@@ -201,12 +199,10 @@ static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
// On other platforms we assume there are no sane interface names.
// This is true especially of Windows.
-static int resolve_nic_name (struct sockaddr* addr_, char const *interface_,
- bool ipv4only_)
+int zmq::tcp_address_t::resolve_nic_name (const char *nic_, bool ipv4only_)
{
// All unused parameters.
- (void) addr_;
- (void) interface_;
+ (void) nic_;
(void) ipv4only_;
errno = ENODEV;
@@ -249,7 +245,7 @@ int zmq::tcp_address_t::resolve_interface (char const *interface_,
}
// Try to resolve the string as a NIC name.
- int rc = resolve_nic_name (out_addr, interface_, ipv4only_);
+ int rc = resolve_nic_name (interface_, ipv4only_);
if (rc != 0 && errno != ENODEV)
return rc;
if (rc == 0) {
diff --git a/src/tcp_address.hpp b/src/tcp_address.hpp
index a6075de..58ac540 100644
--- a/src/tcp_address.hpp
+++ b/src/tcp_address.hpp
@@ -56,14 +56,14 @@ namespace zmq
private:
- int resolve_interface (char const *interface_, bool ipv4only_);
+ int resolve_nic_name (const char *nic_, bool ipv4only_);
+ int resolve_interface (const char *interface_, bool ipv4only_);
int resolve_hostname (const char *hostname_, bool ipv4only_);
union {
sockaddr generic;
sockaddr_in ipv4;
sockaddr_in6 ipv6;
- char padding [1024];
} address;
tcp_address_t (const tcp_address_t&);