TT#86850 support DNS name resolution for interfaces

Change-Id: Id48ca4c25fee57cafe1270e2ded22fc610b510d1
changes/27/41927/3
Richard Fuchs 5 years ago
parent 29da888ad9
commit 9bcd50e9c2

@ -6,6 +6,7 @@
#include <sys/resource.h>
#include <glib.h>
#include <glib/gstdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@ -14,6 +15,7 @@
#include <time.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <netdb.h>
#include "poller.h"
#include "control_tcp.h"
@ -186,6 +188,47 @@ static void __find_if_name(char *s, struct ifaddrs *ifas, GQueue *addrs) {
}
}
static void __resolve_ifname(char *s, GQueue *addrs) {
struct addrinfo hints = {
.ai_family = AF_UNSPEC,
.ai_socktype = SOCK_DGRAM,
};
struct addrinfo *res = NULL;
int status = getaddrinfo(s, NULL, &hints, &res);
if (status) {
ilog(LOG_ERR, "Failed to resolve '%s' as a DNS host name: %s", s, gai_strerror(status));
return;
}
for (struct addrinfo *r = res; r; r = r->ai_next) {
sockaddr_t *addr = g_slice_alloc0(sizeof(*addr));
if (r->ai_family == AF_INET) {
struct sockaddr_in *sin = (void *) r->ai_addr;
assert(r->ai_addrlen >= sizeof(*sin));
addr->family = __get_socket_family_enum(SF_IP4);
addr->u.ipv4 = sin->sin_addr;
}
else if (r->ai_family == AF_INET6) {
struct sockaddr_in6 *sin = (void *) r->ai_addr;
assert(r->ai_addrlen >= sizeof(*sin));
addr->family = __get_socket_family_enum(SF_IP6);
addr->u.ipv6 = sin->sin6_addr;
}
else {
g_slice_free1(sizeof(*addr), addr);
continue;
}
ilog(LOG_DEBUG, "Determined address %s for host name '%s'",
sockaddr_print_buf(addr), s);
g_queue_push_tail(addrs, addr);
}
freeaddrinfo(res);
}
static int if_addr_parse(GQueue *q, char *s, struct ifaddrs *ifas) {
str name;
char *c;
@ -221,6 +264,11 @@ static int if_addr_parse(GQueue *q, char *s, struct ifaddrs *ifas) {
ilog(LOG_DEBUG, "Could not parse '%s' as network address, checking to see if "
"it's an interface", s);
__find_if_name(s, ifas, &addrs);
if (!addrs.length) {
ilog(LOG_DEBUG, "'%s' is not an interface, attempting to resolve it as DNS host name", s);
__resolve_ifname(s, &addrs);
}
}
if (!addrs.length) // nothing found

Loading…
Cancel
Save