lib/addns: don't depend on the order in resp->answers[]
[sfrench/samba-autobuild/.git] / lib / addns / dnsrecord.c
index 559c2644d44a1ef3d5fb37b4797184d80e446cd0..724d0dfd8fae75563da91d80ebd1532fb37b0277 100644 (file)
 #include "dns.h"
 
 DNS_ERROR dns_create_query( TALLOC_CTX *mem_ctx, const char *name,
-                           uint16 q_type, uint16 q_class,
+                           uint16_t q_type, uint16_t q_class,
                            struct dns_request **preq )
 {
-       struct dns_request *req;
-       struct dns_question *q;
+       struct dns_request *req = NULL;
+       struct dns_question *q = NULL;
        DNS_ERROR err;
 
-       if (!(req = TALLOC_ZERO_P(mem_ctx, struct dns_request)) ||
-           !(req->questions = TALLOC_ARRAY(req, struct dns_question *, 1)) ||
+       if (!(req = talloc_zero(mem_ctx, struct dns_request)) ||
+           !(req->questions = talloc_array(req, struct dns_question *, 1)) ||
            !(req->questions[0] = talloc(req->questions,
                                         struct dns_question))) {
                TALLOC_FREE(req);
@@ -60,12 +60,12 @@ DNS_ERROR dns_create_query( TALLOC_CTX *mem_ctx, const char *name,
 DNS_ERROR dns_create_update( TALLOC_CTX *mem_ctx, const char *name,
                             struct dns_update_request **preq )
 {
-       struct dns_update_request *req;
-       struct dns_zone *z;
+       struct dns_update_request *req = NULL;
+       struct dns_zone *z = NULL;
        DNS_ERROR err;
 
-       if (!(req = TALLOC_ZERO_P(mem_ctx, struct dns_update_request)) ||
-           !(req->zones = TALLOC_ARRAY(req, struct dns_zone *, 1)) ||
+       if (!(req = talloc_zero(mem_ctx, struct dns_update_request)) ||
+           !(req->zones = talloc_array(req, struct dns_zone *, 1)) ||
            !(req->zones[0] = talloc(req->zones, struct dns_zone))) {
                TALLOC_FREE(req);
                return ERROR_DNS_NO_MEMORY;
@@ -91,11 +91,11 @@ DNS_ERROR dns_create_update( TALLOC_CTX *mem_ctx, const char *name,
 }
 
 DNS_ERROR dns_create_rrec(TALLOC_CTX *mem_ctx, const char *name,
-                         uint16 type, uint16 r_class, uint32 ttl,
-                         uint16 data_length, uint8 *data,
+                         uint16_t type, uint16_t r_class, uint32_t ttl,
+                         uint16_t data_length, uint8_t *data,
                          struct dns_rrec **prec)
 {
-       struct dns_rrec *rec;
+       struct dns_rrec *rec = NULL;
        DNS_ERROR err;
 
        if (!(rec = talloc(mem_ctx, struct dns_rrec))) {
@@ -119,20 +119,19 @@ DNS_ERROR dns_create_rrec(TALLOC_CTX *mem_ctx, const char *name,
 }
 
 DNS_ERROR dns_create_a_record(TALLOC_CTX *mem_ctx, const char *host,
-                             uint32 ttl, const struct sockaddr_storage *pss,
+                             uint32_t ttl, const struct sockaddr_storage *pss,
                              struct dns_rrec **prec)
 {
-       uint8 *data;
+       uint8_t *data;
        DNS_ERROR err;
        struct in_addr ip;
 
        if (pss->ss_family != AF_INET) {
-               /* Silently ignore this. */
-               return ERROR_DNS_SUCCESS;
+               return ERROR_DNS_INVALID_PARAMETER;
        }
 
-       ip = ((struct sockaddr_in *)pss)->sin_addr;
-       if (!(data = (uint8 *)TALLOC_MEMDUP(mem_ctx, (const void *)&ip.s_addr,
+       ip = ((const struct sockaddr_in *)pss)->sin_addr;
+       if (!(data = (uint8_t *)talloc_memdup(mem_ctx, (const void *)&ip.s_addr,
                                            sizeof(ip.s_addr)))) {
                return ERROR_DNS_NO_MEMORY;
        }
@@ -147,13 +146,54 @@ DNS_ERROR dns_create_a_record(TALLOC_CTX *mem_ctx, const char *host,
        return err;
 }
 
+DNS_ERROR dns_create_aaaa_record(TALLOC_CTX *mem_ctx, const char *host,
+                                uint32_t ttl, const struct sockaddr_storage *pss,
+                                struct dns_rrec **prec)
+{
+#ifdef HAVE_IPV6
+       uint8_t *data;
+       DNS_ERROR err;
+       struct in6_addr ip6;
+
+       if (pss->ss_family != AF_INET6) {
+               return ERROR_DNS_INVALID_PARAMETER;
+       }
+
+       ip6 = ((const struct sockaddr_in6 *)pss)->sin6_addr;
+       if (!(data = (uint8_t *)talloc_memdup(mem_ctx, (const void *)&ip6.s6_addr,
+                                           sizeof(ip6.s6_addr)))) {
+               return ERROR_DNS_NO_MEMORY;
+       }
+
+       err = dns_create_rrec(mem_ctx, host, QTYPE_AAAA, DNS_CLASS_IN, ttl,
+                             sizeof(ip6.s6_addr), data, prec);
+
+       if (!ERR_DNS_IS_OK(err)) {
+               TALLOC_FREE(data);
+       }
+
+       return err;
+#else
+       return ERROR_DNS_INVALID_PARAMETER;
+#endif
+}
+
 DNS_ERROR dns_create_name_in_use_record(TALLOC_CTX *mem_ctx,
                                        const char *name,
                                        const struct sockaddr_storage *ss,
                                        struct dns_rrec **prec)
 {
        if (ss != NULL) {
-               return dns_create_a_record(mem_ctx, name, 0, ss, prec);
+               switch (ss->ss_family) {
+               case AF_INET:
+                       return dns_create_a_record(mem_ctx, name, 0, ss, prec);
+#ifdef HAVE_IPV6
+               case AF_INET6:
+                       return dns_create_aaaa_record(mem_ctx, name, 0, ss, prec);
+#endif
+               default:
+                       return ERROR_DNS_INVALID_PARAMETER;
+               }
        }
 
        return dns_create_rrec(mem_ctx, name, QTYPE_ANY, DNS_CLASS_IN, 0, 0,
@@ -161,7 +201,7 @@ DNS_ERROR dns_create_name_in_use_record(TALLOC_CTX *mem_ctx,
 }
 
 DNS_ERROR dns_create_name_not_in_use_record(TALLOC_CTX *mem_ctx,
-                                           const char *name, uint32 type,
+                                           const char *name, uint32_t type,
                                            struct dns_rrec **prec)
 {
        return dns_create_rrec(mem_ctx, name, type, DNS_CLASS_NONE, 0,
@@ -169,7 +209,7 @@ DNS_ERROR dns_create_name_not_in_use_record(TALLOC_CTX *mem_ctx,
 }
 
 DNS_ERROR dns_create_delete_record(TALLOC_CTX *mem_ctx, const char *name,
-                                  uint16 type, uint16 r_class,
+                                  uint16_t type, uint16_t r_class,
                                   struct dns_rrec **prec)
 {
        return dns_create_rrec(mem_ctx, name, type, r_class, 0, 0, NULL, prec);
@@ -177,12 +217,12 @@ DNS_ERROR dns_create_delete_record(TALLOC_CTX *mem_ctx, const char *name,
 
 DNS_ERROR dns_create_tkey_record(TALLOC_CTX *mem_ctx, const char *keyname,
                                 const char *algorithm_name, time_t inception,
-                                time_t expiration, uint16 mode, uint16 error,
-                                uint16 key_length, const uint8 *key,
+                                time_t expiration, uint16_t mode, uint16_t error,
+                                uint16_t key_length, const uint8_t *key,
                                 struct dns_rrec **prec)
 {
-       struct dns_buffer *buf;
-       struct dns_domain_name *algorithm;
+       struct dns_buffer *buf = NULL;
+       struct dns_domain_name *algorithm = NULL;
        DNS_ERROR err;
 
        if (!(buf = dns_create_buffer(mem_ctx))) {
@@ -219,7 +259,7 @@ DNS_ERROR dns_unmarshall_tkey_record(TALLOC_CTX *mem_ctx, struct dns_rrec *rec,
 {
        struct dns_tkey_record *tkey;
        struct dns_buffer buf;
-       uint32 tmp_inception, tmp_expiration;
+       uint32_t tmp_inception, tmp_expiration;
        
        if (!(tkey = talloc(mem_ctx, struct dns_tkey_record))) {
                return ERROR_DNS_NO_MEMORY;
@@ -240,7 +280,7 @@ DNS_ERROR dns_unmarshall_tkey_record(TALLOC_CTX *mem_ctx, struct dns_rrec *rec,
        if (!ERR_DNS_IS_OK(buf.error)) goto error;
 
        if (tkey->key_length) {
-               if (!(tkey->key = TALLOC_ARRAY(tkey, uint8, tkey->key_length))) {
+               if (!(tkey->key = talloc_array(tkey, uint8_t, tkey->key_length))) {
                        buf.error = ERROR_DNS_NO_MEMORY;
                        goto error;
                }
@@ -264,13 +304,13 @@ DNS_ERROR dns_unmarshall_tkey_record(TALLOC_CTX *mem_ctx, struct dns_rrec *rec,
 
 DNS_ERROR dns_create_tsig_record(TALLOC_CTX *mem_ctx, const char *keyname,
                                 const char *algorithm_name,
-                                time_t time_signed, uint16 fudge,
-                                uint16 mac_length, const uint8 *mac,
-                                uint16 original_id, uint16 error,
+                                time_t time_signed, uint16_t fudge,
+                                uint16_t mac_length, const uint8_t *mac,
+                                uint16_t original_id, uint16_t error,
                                 struct dns_rrec **prec)
 {
-       struct dns_buffer *buf;
-       struct dns_domain_name *algorithm;
+       struct dns_buffer *buf = NULL;
+       struct dns_domain_name *algorithm = NULL;
        DNS_ERROR err;
 
        if (!(buf = dns_create_buffer(mem_ctx))) {
@@ -304,11 +344,11 @@ DNS_ERROR dns_create_tsig_record(TALLOC_CTX *mem_ctx, const char *keyname,
 }
 
 DNS_ERROR dns_add_rrec(TALLOC_CTX *mem_ctx, struct dns_rrec *rec,
-                      uint16 *num_records, struct dns_rrec ***records)
+                      uint16_t *num_records, struct dns_rrec ***records)
 {
        struct dns_rrec **new_records;
 
-       if (!(new_records = TALLOC_REALLOC_ARRAY(mem_ctx, *records,
+       if (!(new_records = talloc_realloc(mem_ctx, *records,
                                                 struct dns_rrec *,
                                                 (*num_records)+1))) {
                return ERROR_DNS_NO_MEMORY;
@@ -331,13 +371,13 @@ DNS_ERROR dns_create_probe(TALLOC_CTX *mem_ctx, const char *zone,
                           const struct sockaddr_storage *sslist,
                           struct dns_update_request **preq)
 {
-       struct dns_update_request *req;
-       struct dns_rrec *rec;
+       struct dns_update_request *req = NULL;
+       struct dns_rrec *rec = NULL;
        DNS_ERROR err;
-       uint16 i;
+       uint16_t i;
 
        err = dns_create_update(mem_ctx, zone, &req);
-       if (!ERR_DNS_IS_OK(err)) goto error;
+       if (!ERR_DNS_IS_OK(err)) return err;
 
        err = dns_create_name_not_in_use_record(req, host, QTYPE_CNAME, &rec);
        if (!ERR_DNS_IS_OK(err)) goto error;
@@ -369,8 +409,8 @@ DNS_ERROR dns_create_update_request(TALLOC_CTX *mem_ctx,
                                    size_t num_addrs,
                                    struct dns_update_request **preq)
 {
-       struct dns_update_request *req;
-       struct dns_rrec *rec;
+       struct dns_update_request *req = NULL;
+       struct dns_rrec *rec = NULL;
        DNS_ERROR err;
        size_t i;
 
@@ -404,7 +444,19 @@ DNS_ERROR dns_create_update_request(TALLOC_CTX *mem_ctx,
         */
 
        for ( i=0; i<num_addrs; i++ ) {
-               err = dns_create_a_record(req, hostname, 3600, &ss_addrs[i], &rec);
+
+               switch(ss_addrs[i].ss_family) {
+               case AF_INET:
+                       err = dns_create_a_record(req, hostname, 3600, &ss_addrs[i], &rec);
+                       break;
+#ifdef HAVE_IPV6
+               case AF_INET6:
+                       err = dns_create_aaaa_record(req, hostname, 3600, &ss_addrs[i], &rec);
+                       break;
+#endif
+               default:
+                       continue;
+               }
                if (!ERR_DNS_IS_OK(err))
                        goto error;