libcli/dns: Add dns_res_rec_get_sockaddr
authorVolker Lendecke <vl@samba.org>
Thu, 10 Jan 2019 15:54:41 +0000 (16:54 +0100)
committerVolker Lendecke <vl@samba.org>
Tue, 15 Jan 2019 06:53:22 +0000 (07:53 +0100)
Pull the address from a res_rec if it's there

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
libcli/dns/dns_lookup.c
libcli/dns/dns_lookup.h

index b99ab426e1018fa9aa567f218185b68532dd3fc3..7402d443fba948cb16dd8c3fd7941f0e209b6c77 100644 (file)
@@ -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;
+}
index 157a3d252c15c42bbc410ac59530951d11e88602..0c05e0490c04724e6e7132a74af50dcefd453067 100644 (file)
@@ -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