From a8191f88ca82cc259b593d69980df76c3c30b1fa Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 10 Jan 2019 16:54:41 +0100 Subject: [PATCH] libcli/dns: Add dns_res_rec_get_sockaddr Pull the address from a res_rec if it's there Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- libcli/dns/dns_lookup.c | 37 +++++++++++++++++++++++++++++++++++++ libcli/dns/dns_lookup.h | 3 +++ 2 files changed, 40 insertions(+) diff --git a/libcli/dns/dns_lookup.c b/libcli/dns/dns_lookup.c index b99ab426e10..7402d443fba 100644 --- a/libcli/dns/dns_lookup.c +++ b/libcli/dns/dns_lookup.c @@ -335,3 +335,40 @@ fail: TALLOC_FREE(ev); return ret; } + +bool dns_res_rec_get_sockaddr(const struct dns_res_rec *rec, + struct sockaddr_storage *addr) +{ + sa_family_t family; + const char *src; + void *dst; + int ret; + + switch (rec->rr_type) { + case DNS_QTYPE_A: + family = AF_INET; + src = rec->rdata.ipv4_record; + dst = &(((struct sockaddr_in *)addr)->sin_addr); + break; +#ifdef HAVE_IPV6 + case DNS_QTYPE_AAAA: + family = AF_INET6; + src = rec->rdata.ipv6_record; + dst = &(((struct sockaddr_in6 *)addr)->sin6_addr); + break; +#endif + default: + /* We only care about IP addresses */ + return false; + } + + *addr = (struct sockaddr_storage) { .ss_family = family }; + + ret = inet_pton(family, src, dst); + if (ret != 1) { + DBG_DEBUG("inet_pton(%s) failed\n", src); + return false; + } + + return true; +} diff --git a/libcli/dns/dns_lookup.h b/libcli/dns/dns_lookup.h index 157a3d252c1..0c05e0490c0 100644 --- a/libcli/dns/dns_lookup.h +++ b/libcli/dns/dns_lookup.h @@ -42,4 +42,7 @@ int dns_lookup(FILE *resolv_conf_fp, TALLOC_CTX *mem_ctx, struct dns_name_packet **reply); +bool dns_res_rec_get_sockaddr(const struct dns_res_rec *rec, + struct sockaddr_storage *addr); + #endif -- 2.11.4.GIT