in gloo/transport/tcp/device.cc [26:86]
static void lookupAddrForIface(struct attr& attr) {
struct ifaddrs* ifap;
auto rv = getifaddrs(&ifap);
GLOO_ENFORCE_NE(rv, -1, strerror(errno));
struct ifaddrs *ifa;
for (ifa = ifap; ifa != nullptr; ifa = ifa->ifa_next) {
// Skip entry if ifa_addr is NULL (see getifaddrs(3))
if (ifa->ifa_addr == nullptr) {
continue;
}
// Skip entry if the name doesn't match
if (strcmp(attr.iface.c_str(), ifa->ifa_name) != 0) {
continue;
}
// Match on address family
switch (attr.ai_family) {
case AF_INET:
if (ifa->ifa_addr->sa_family != AF_INET) {
continue;
}
attr.ai_addrlen = sizeof(struct sockaddr_in);
memcpy(&attr.ai_addr, ifa->ifa_addr, attr.ai_addrlen);
break;
case AF_INET6:
if (ifa->ifa_addr->sa_family != AF_INET6) {
continue;
}
attr.ai_addrlen = sizeof(struct sockaddr_in6);
memcpy(&attr.ai_addr, ifa->ifa_addr, attr.ai_addrlen);
break;
case AF_UNSPEC:
switch (ifa->ifa_addr->sa_family) {
case AF_INET:
attr.ai_family = AF_INET;
attr.ai_addrlen = sizeof(struct sockaddr_in);
break;
case AF_INET6:
attr.ai_family = AF_INET6;
attr.ai_addrlen = sizeof(struct sockaddr_in6);
break;
default:
continue;
}
memcpy(&attr.ai_addr, ifa->ifa_addr, attr.ai_addrlen);
break;
default:
GLOO_ENFORCE(false, "Unknown ai_family: ", attr.ai_family);
break;
}
attr.ai_socktype = SOCK_STREAM;
attr.ai_protocol = 0;
break;
}
GLOO_ENFORCE(
ifa != nullptr,
"Unable to find address for: ",
attr.iface);
freeifaddrs(ifap);
return;
}