The branch, master has been updated
       via  9d4dbed tests: Query A record via CNAME
       via  05e3046 rwrap: Support asking for A via CNAME
       via  c12b456 tests: test that CNAME and SRV records can recurse
       via  c3f3bfb rwrap: Recursively add additional data
       via  9578af3 rwrap: Make the rwrap_fake_* functions only fake RRs
       via  00274ff rwrap: CNAME record can recurse into A, AAAA or CNAME
       via  94c3456 rwrap: SRV record can recurse into A or AAAA
       via  dfb2f02 rwrap: Use the rwrap_fake_rr structure instead of raw 
uint8_t pointers
       via  1935ee8 Add data structures and functions to represent and 
manipulate RRs
       via  80151f6 tests: Add a test which talks to real nameservers.
       via  ba10259 rwrap: Correctly calculate the response size and return it.
       via  e88e4a5 rwrap: Handle trailing dot in dns names.
       via  2388096 rwrap: Compare dns names case insensitive.
       via  049962a torture: Increase time to wait for pid file.
      from  7f4d7eb cmake: Do not remove libresolv from required libraries.

https://git.samba.org/?p=resolv_wrapper.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 9d4dbed5eafdd4624a787c4e33ce3cd2610aed90
Author: Jakub Hrozek <[email protected]>
Date:   Tue Nov 25 18:34:45 2014 +0100

    tests: Query A record via CNAME
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 05e3046112e84f71ea4ca56261de17c57123931d
Author: Jakub Hrozek <[email protected]>
Date:   Tue Nov 25 18:34:28 2014 +0100

    rwrap: Support asking for A via CNAME
    
    Adds support for querying for an A record using a name that only expands
    into a CNAME.
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit c12b4566a4ddcba8dd5f3f1369f1800130577f15
Author: Jakub Hrozek <[email protected]>
Date:   Tue Nov 25 18:33:29 2014 +0100

    tests: test that CNAME and SRV records can recurse
    
    Add tests for recursing into a CNAME record.
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit c3f3bfb7c91949f3ea5b41393d9afa9f168b82f4
Author: Jakub Hrozek <[email protected]>
Date:   Tue Nov 25 18:33:21 2014 +0100

    rwrap: Recursively add additional data
    
    Change how we construct the fake answer such that the header and
    question are added first, then the answers and finally additional data.
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 9578af3406df2f03f637fb55b47b4cbd8f7fb577
Author: Jakub Hrozek <[email protected]>
Date:   Tue Nov 18 11:33:42 2014 +0100

    rwrap: Make the rwrap_fake_* functions only fake RRs
    
    The rwrap_fake_common() function did too much. Remove it and use
    separate functions to add fake header and question sections. The
    rwrap_fake_$RR functions will receive packet including the header and
    question and only add its RR data.
    
    This will allow recursive processing later.
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 00274ffd8e29b42f202ebf7c1e1bce6cd34d9b0f
Author: Jakub Hrozek <[email protected]>
Date:   Sun Nov 23 17:40:57 2014 +0100

    rwrap: CNAME record can recurse into A, AAAA or CNAME
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 94c3456970a0f0b851d1c5a99183697a2072790a
Author: Jakub Hrozek <[email protected]>
Date:   Sun Nov 23 17:40:32 2014 +0100

    rwrap: SRV record can recurse into A or AAAA
    
    When querying for a SRV record, we'll need to include A or AAAA records
    in additional section. Therefore, keep querying the host file until we
    can either recurse the A/AAAA records or reach the recursion limit
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit dfb2f02f4134560292ee02dd0f0b3471a5876263
Author: Jakub Hrozek <[email protected]>
Date:   Sun Nov 23 16:57:32 2014 +0100

    rwrap: Use the rwrap_fake_rr structure instead of raw uint8_t pointers
    
    Currently only one instance of the rwrap_fake_rr structure is used. 
Recursion
    will be implemented in a future patch.
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 1935ee8184adb0c04bc11374d057421ae2c6b574
Author: Jakub Hrozek <[email protected]>
Date:   Sun Nov 23 16:47:55 2014 +0100

    Add data structures and functions to represent and manipulate RRs
    
    Adds a structure that, using unions represents all supported RRs. Add a
    bunch of utility functions that can be used to create these structures.
    
    Currently the functions are unused.
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 80151f6faa9c5caac8f23c9826e90eaac7003037
Author: Andreas Schneider <[email protected]>
Date:   Wed Nov 5 13:48:49 2014 +0100

    tests: Add a test which talks to real nameservers.
    
    This is to inspect the answer buffer and be able to compare it.
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit ba10259bba5f248cd4906b1b775eb42bce75c7ea
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 4 17:14:22 2014 +0100

    rwrap: Correctly calculate the response size and return it.
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit e88e4a55b2723aee7bd07f4182486eb4abee024d
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 4 15:20:11 2014 +0100

    rwrap: Handle trailing dot in dns names.
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 2388096ae7c0c7924a44cca94290ed7da06498d0
Author: Jakub Hrozek <[email protected]>
Date:   Tue Nov 4 15:00:17 2014 +0100

    rwrap: Compare dns names case insensitive.
    
    Signed-off-by: Jakub Hrozek <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

commit 049962a9a4e735a46b555842a4cf6b3e721d05cb
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 4 16:25:02 2014 +0100

    torture: Increase time to wait for pid file.
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Guenther Deschner <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 src/resolv_wrapper.c        | 760 ++++++++++++++++++++++++++++++++------------
 tests/CMakeLists.txt        |   3 +
 tests/fake_hosts.in         |   5 +-
 tests/test_dns_fake.c       | 197 +++++++++++-
 tests/test_real_res_query.c | 196 ++++++++++++
 tests/torture.c             |   4 +-
 6 files changed, 940 insertions(+), 225 deletions(-)
 create mode 100644 tests/test_real_res_query.c


Changeset truncated at 500 lines:

diff --git a/src/resolv_wrapper.c b/src/resolv_wrapper.c
index 35f426d..a0b2821 100644
--- a/src/resolv_wrapper.c
+++ b/src/resolv_wrapper.c
@@ -141,17 +141,188 @@ static void rwrap_log(enum rwrap_dbglvl_e dbglvl,
        }                                                       \
 } while(0);
 
+#define RWRAP_MAX_RECURSION 5
+
+/* Priority and weight can be omitted from the hosts file, but need to be part
+ * of the output
+ */
+#define DFL_SRV_PRIO   1
+#define DFL_SRV_WEIGHT 100
+
+struct rwrap_srv_rrdata {
+       uint16_t port;
+       uint16_t prio;
+       uint16_t weight;
+       char hostname[MAXDNAME];
+};
+
+struct rwrap_soa_rrdata {
+       uint32_t serial;
+       uint32_t refresh;
+       uint32_t retry;
+       uint32_t expire;
+       uint32_t minimum;
+       char nameserver[MAXDNAME];
+       char mailbox[MAXDNAME];
+};
+
+struct rwrap_fake_rr {
+       union fake_rrdata {
+               struct in_addr a_rec;
+               struct in6_addr aaaa_rec;
+               struct rwrap_srv_rrdata srv_rec;
+               struct rwrap_soa_rrdata soa_rec;
+               char cname_rec[MAXDNAME];
+       } rrdata;
+
+       char key[MAXDNAME];
+       int type; /* ns_t_* */
+};
+
+static void rwrap_fake_rr_init(struct rwrap_fake_rr *rr, size_t len)
+{
+       size_t i;
+
+       for (i = 0; i < len; i++) {
+               rr[i].type = ns_t_invalid;
+       }
+}
+
+static int rwrap_create_fake_a_rr(const char *key,
+                                 const char *value,
+                                 struct rwrap_fake_rr *rr)
+{
+       int ok;
+
+       ok = inet_pton(AF_INET, value, &rr->rrdata.a_rec);
+       if (!ok) {
+               RWRAP_LOG(RWRAP_LOG_ERROR,
+                         "Failed to convert [%s] to binary\n", value);
+               return -1;
+       }
+
+       memcpy(rr->key, key, strlen(key) + 1);
+       rr->type = ns_t_a;
+       return 0;
+}
+
+static int rwrap_create_fake_aaaa_rr(const char *key,
+                                    const char *value,
+                                    struct rwrap_fake_rr *rr)
+{
+       int ok;
+
+       ok = inet_pton(AF_INET6, value, &rr->rrdata.aaaa_rec);
+       if (!ok) {
+               RWRAP_LOG(RWRAP_LOG_ERROR,
+                         "Failed to convert [%s] to binary\n", value);
+               return -1;
+       }
+
+       memcpy(rr->key, key, strlen(key) + 1);
+       rr->type = ns_t_aaaa;
+       return 0;
+}
+
+static int rwrap_create_fake_srv_rr(const char *key,
+                                   const char *value,
+                                   struct rwrap_fake_rr *rr)
+{
+       char *str_prio;
+       char *str_weight;
+       char *str_port;
+       const char *hostname;
+
+       /* parse the value into priority, weight, port and hostname
+        * and check the validity */
+       hostname = value;
+       NEXT_KEY(hostname, str_port);
+       NEXT_KEY(str_port, str_prio);
+       NEXT_KEY(str_prio, str_weight);
+       if (str_port == NULL || hostname == NULL) {
+               RWRAP_LOG(RWRAP_LOG_ERROR,
+                         "Malformed SRV entry [%s]\n", value);
+               return -1;
+       }
+
+       if (str_prio) {
+               rr->rrdata.srv_rec.prio = atoi(str_prio);
+       } else {
+               rr->rrdata.srv_rec.prio = DFL_SRV_PRIO;
+       }
+       if (str_weight) {
+               rr->rrdata.srv_rec.weight = atoi(str_weight);
+       } else {
+               rr->rrdata.srv_rec.weight = DFL_SRV_WEIGHT;
+       }
+       rr->rrdata.srv_rec.port = atoi(str_port);
+       memcpy(rr->rrdata.srv_rec.hostname , hostname, strlen(hostname) + 1);
+
+       memcpy(rr->key, key, strlen(key) + 1);
+       rr->type = ns_t_srv;
+       return 0;
+}
+
+static int rwrap_create_fake_soa_rr(const char *key,
+                                   const char *value,
+                                   struct rwrap_fake_rr *rr)
+{
+       const char *nameserver;
+       char *mailbox;
+       char *str_serial;
+       char *str_refresh;
+       char *str_retry;
+       char *str_expire;
+       char *str_minimum;
+
+       /* parse the value into nameserver, mailbox, serial, refresh,
+        * retry, expire, minimum and check the validity
+        */
+       nameserver = value;
+       NEXT_KEY(nameserver, mailbox);
+       NEXT_KEY(mailbox, str_serial);
+       NEXT_KEY(str_serial, str_refresh);
+       NEXT_KEY(str_refresh, str_retry);
+       NEXT_KEY(str_retry, str_expire);
+       NEXT_KEY(str_expire, str_minimum);
+       if (nameserver == NULL || mailbox == NULL || str_serial == NULL ||
+           str_refresh == NULL || str_retry == NULL || str_expire == NULL ||
+           str_minimum == NULL) {
+               RWRAP_LOG(RWRAP_LOG_ERROR,
+                         "Malformed SOA entry [%s]\n", value);
+               return -1;
+       }
+
+       memcpy(rr->rrdata.soa_rec.nameserver, nameserver, strlen(nameserver)+1);
+       memcpy(rr->rrdata.soa_rec.mailbox, mailbox, strlen(mailbox)+1);
+
+       rr->rrdata.soa_rec.serial = atoi(str_serial);
+       rr->rrdata.soa_rec.refresh = atoi(str_refresh);
+       rr->rrdata.soa_rec.retry = atoi(str_retry);
+       rr->rrdata.soa_rec.expire = atoi(str_expire);
+       rr->rrdata.soa_rec.minimum = atoi(str_minimum);
+
+       memcpy(rr->key, key, strlen(key) + 1);
+       rr->type = ns_t_soa;
+       return 0;
+}
+
+static int rwrap_create_fake_cname_rr(const char *key,
+                                     const char *value,
+                                     struct rwrap_fake_rr *rr)
+{
+       memcpy(rr->rrdata.cname_rec , value, strlen(value) + 1);
+       memcpy(rr->key, key, strlen(key) + 1);
+       rr->type = ns_t_cname;
+       return 0;
+}
 
 /* Prepares a fake header with a single response. Advances header_blob */
 static ssize_t rwrap_fake_header(uint8_t **header_blob, size_t remaining,
-                                size_t rdata_size)
+                                size_t ancount, size_t arcount)
 {
        uint8_t *hb;
        HEADER *h;
-       int answers;
-
-       /* If rdata_size is zero, the answer is empty */
-       answers = rdata_size > 0 ? 1 : 0;
 
        if (remaining < NS_HFIXEDSZ) {
                RWRAP_LOG(RWRAP_LOG_ERROR, "Buffer too small!\n");
@@ -168,7 +339,8 @@ static ssize_t rwrap_fake_header(uint8_t **header_blob, 
size_t remaining,
        h->ra = 1;                      /* resursion available */
 
        h->qdcount = htons(1);          /* no. of questions */
-       h->ancount = htons(answers);    /* no. of answers */
+       h->ancount = htons(ancount);    /* no. of answers */
+       h->arcount = htons(arcount);    /* no. of add'tl records */
 
        hb += NS_HFIXEDSZ;              /* move past the header */
        *header_blob = hb;
@@ -240,147 +412,79 @@ static ssize_t rwrap_fake_rdata_common(uint16_t type,
        }
 
        *rdata_ptr = rd;
-       return written + 3 * sizeof(uint16_t) + sizeof(uint32_t);
-}
-
-static ssize_t rwrap_fake_common(uint16_t type,
-                                const char *question,
-                                size_t rdata_size,
-                                uint8_t **answer_ptr,
-                                size_t anslen)
-{
-       uint8_t *a = *answer_ptr;
-       ssize_t written;
-       size_t remaining;
-
-       remaining = anslen;
-
-       written = rwrap_fake_header(&a, remaining, rdata_size);
-       if (written < 0) {
-               return -1;
-       }
-       remaining -= written;
-
-       written = rwrap_fake_question(question, type, &a, remaining);
-       if (written < 0) {
-               return -1;
-       }
-       remaining -= written;
-
-       /* rdata_size = 0 denotes an empty answer */
-       if (rdata_size > 0) {
-               written = rwrap_fake_rdata_common(type, rdata_size, question,
-                                               remaining, &a);
-               if (written < 0) {
-                       return -1;
-               }
-       }
-
-       *answer_ptr = a;
-       return written;
+       return written + 3 * sizeof(uint16_t) + sizeof(uint32_t) + rdata_size;
 }
 
-static int rwrap_fake_a(const char *key,
-                       const char *value,
-                       uint8_t *answer_ptr,
-                       size_t anslen)
+static ssize_t rwrap_fake_a(struct rwrap_fake_rr *rr,
+                           uint8_t *answer_ptr,
+                           size_t anslen)
 {
        uint8_t *a = answer_ptr;
-       struct in_addr a_rec;
-       int rc;
-       int ok;
+       ssize_t resp_size;
 
-       if (value == NULL) {
-               RWRAP_LOG(RWRAP_LOG_ERROR, "Malformed record, no value!\n");
+       if (rr == NULL || rr->type != ns_t_a) {
+               RWRAP_LOG(RWRAP_LOG_ERROR,
+                         "Malformed record, no or wrong value!\n");
                return -1;
        }
+       RWRAP_LOG(RWRAP_LOG_TRACE, "Adding A RR");
 
-       rc = rwrap_fake_common(ns_t_a, key, sizeof(a_rec), &a, anslen);
-       if (rc < 0) {
+       resp_size = rwrap_fake_rdata_common(ns_t_a, sizeof(struct in_addr), 
rr->key,
+                                           anslen, &a);
+       if (resp_size < 0) {
                return -1;
        }
 
-       ok = inet_pton(AF_INET, value, &a_rec);
-       if (!ok) {
-               RWRAP_LOG(RWRAP_LOG_ERROR,
-                         "Failed to convert [%s] to binary\n", value);
-               return -1;
-       }
-       memcpy(a, &a_rec, sizeof(struct in_addr));
+       memcpy(a, &rr->rrdata.a_rec, sizeof(struct in_addr));
 
-       return 0;
+       return resp_size;
 }
 
-static int rwrap_fake_aaaa(const char *key,
-                          const char *value,
-                          uint8_t *answer,
-                          size_t anslen)
+static ssize_t rwrap_fake_aaaa(struct rwrap_fake_rr *rr,
+                              uint8_t *answer,
+                              size_t anslen)
 {
        uint8_t *a = answer;
-       struct in6_addr aaaa_rec;
-       int rc;
-       int ok;
+       ssize_t resp_size;
 
-       if (value == NULL) {
-               RWRAP_LOG(RWRAP_LOG_ERROR, "Malformed record, no value!\n");
+       if (rr == NULL || rr->type != ns_t_aaaa) {
+               RWRAP_LOG(RWRAP_LOG_ERROR,
+                         "Malformed record, no or wrong value!\n");
                return -1;
        }
+       RWRAP_LOG(RWRAP_LOG_TRACE, "Adding AAAA RR");
 
-       rc = rwrap_fake_common(ns_t_aaaa, key, sizeof(aaaa_rec), &a, anslen);
-       if (rc < 0) {
+       resp_size = rwrap_fake_rdata_common(ns_t_aaaa, sizeof(struct in6_addr),
+                                           rr->key, anslen, &a);
+       if (resp_size < 0) {
                return -1;
        }
 
-       ok = inet_pton(AF_INET6, value, &aaaa_rec);
-       if (!ok) {
-               RWRAP_LOG(RWRAP_LOG_ERROR,
-                         "Failed to convert [%s] to binary\n", value);
-               return -1;
-       }
-       memcpy(a, &aaaa_rec, sizeof(struct in6_addr));
+       memcpy(a, &rr->rrdata.aaaa_rec, sizeof(struct in6_addr));
 
-       return 0;
+       return resp_size;
 }
 
-/*
- * Priority and weight can be omitted from the hosts file, but need to be part
- * of the output
- */
-#define DFL_SRV_PRIO   1
-#define DFL_SRV_WEIGHT 100
-
-static int rwrap_fake_srv(const char *key,
-                         const char *value,
-                         uint8_t *answer,
-                         size_t anslen)
+static ssize_t rwrap_fake_srv(struct rwrap_fake_rr *rr,
+                             uint8_t *answer,
+                             size_t anslen)
 {
        uint8_t *a = answer;
-       int rv;
+       ssize_t resp_size;
        size_t rdata_size;
-       char *str_prio;
-       char *str_weight;
-       char *str_port;
-       const char *hostname;
        unsigned char hostname_compressed[MAXDNAME];
        ssize_t compressed_len;
 
-       /*
-        * Parse the value into priority, weight, port and hostname
-        * and check the validity.
-        */
-       hostname = value;
-       NEXT_KEY(hostname, str_port);
-       NEXT_KEY(str_port, str_prio);
-       NEXT_KEY(str_prio, str_weight);
-       if (str_port == NULL || hostname == NULL) {
+       if (rr == NULL || rr->type != ns_t_srv) {
                RWRAP_LOG(RWRAP_LOG_ERROR,
-                         "Malformed SRV entry [%s]\n", value);
+                         "Malformed record, no or wrong value!\n");
                return -1;
        }
+       RWRAP_LOG(RWRAP_LOG_TRACE, "Adding SRV RR");
        rdata_size = 3 * sizeof(uint16_t);
 
        /* Prepare the data to write */
-       compressed_len = ns_name_compress(hostname,
+       compressed_len = ns_name_compress(rr->rrdata.srv_rec.hostname,
                                          hostname_compressed, MAXDNAME,
                                          NULL, NULL);
        if (compressed_len < 0) {
@@ -388,84 +492,59 @@ static int rwrap_fake_srv(const char *key,
        }
        rdata_size += compressed_len;
 
-       rv = rwrap_fake_common(ns_t_srv, key, rdata_size, &a, anslen);
-       if (rv < 0) {
+       resp_size = rwrap_fake_rdata_common(ns_t_srv, rdata_size,
+                                           rr->key, anslen, &a);
+       if (resp_size < 0) {
                return -1;
        }
 
-       if (str_prio) {
-               NS_PUT16(atoi(str_prio), a);
-       } else {
-               NS_PUT16(DFL_SRV_PRIO, a);
-       }
-       if (str_weight) {
-               NS_PUT16(atoi(str_weight), a);
-       } else {
-               NS_PUT16(DFL_SRV_WEIGHT, a);
-       }
-       NS_PUT16(atoi(str_port), a);
+       NS_PUT16(rr->rrdata.srv_rec.prio, a);
+       NS_PUT16(rr->rrdata.srv_rec.weight, a);
+       NS_PUT16(rr->rrdata.srv_rec.port, a);
        memcpy(a, hostname_compressed, compressed_len);
 
-       return 0;
+       return resp_size;
 }
 
-static int rwrap_fake_soa(const char *key,
-                         const char *value,
-                         uint8_t *answer,
-                         size_t anslen)
+static ssize_t rwrap_fake_soa(struct rwrap_fake_rr *rr,
+                             uint8_t *answer,
+                             size_t anslen)
 {
        uint8_t *a = answer;
-       int rv;
-       const char *nameserver;
-       char *mailbox;
-       char *str_serial;
-       char *str_refresh;
-       char *str_retry;
-       char *str_expire;
-       char *str_minimum;
+       ssize_t resp_size;
        size_t rdata_size;
        unsigned char nameser_compressed[MAXDNAME];
        ssize_t compressed_ns_len;
        unsigned char mailbox_compressed[MAXDNAME];
        ssize_t compressed_mb_len;
 
-       /*
-        * parse the value into nameserver, mailbox, serial, refresh,
-        * retry, expire, minimum and check the validity
-        */
-       nameserver = value;
-       NEXT_KEY(nameserver, mailbox);
-       NEXT_KEY(mailbox, str_serial);
-       NEXT_KEY(str_serial, str_refresh);
-       NEXT_KEY(str_refresh, str_retry);
-       NEXT_KEY(str_retry, str_expire);
-       NEXT_KEY(str_expire, str_minimum);
-       if (nameserver == NULL || mailbox == NULL || str_serial == NULL ||
-           str_refresh == NULL || str_retry == NULL || str_expire == NULL ||
-           str_minimum == NULL)
-       {
+       if (rr == NULL || rr->type != ns_t_soa) {
                RWRAP_LOG(RWRAP_LOG_ERROR,
-                         "Malformed SOA entry [%s]\n", value);
+                         "Malformed record, no or wrong value!\n");
                return -1;
        }
+       RWRAP_LOG(RWRAP_LOG_TRACE, "Adding SOA RR");
        rdata_size = 5 * sizeof(uint16_t);
 
-       compressed_ns_len = ns_name_compress(nameserver, nameser_compressed,
+       compressed_ns_len = ns_name_compress(rr->rrdata.soa_rec.nameserver,
+                                            nameser_compressed,
                                             MAXDNAME, NULL, NULL);
        if (compressed_ns_len < 0) {
                return -1;
        }
        rdata_size += compressed_ns_len;
 
-       compressed_mb_len = ns_name_compress(mailbox, mailbox_compressed,
+       compressed_mb_len = ns_name_compress(rr->rrdata.soa_rec.mailbox,
+                                            mailbox_compressed,
                                             MAXDNAME, NULL, NULL);
        if (compressed_mb_len < 0) {
                return -1;
        }
        rdata_size += compressed_mb_len;
 
-       rv = rwrap_fake_common(ns_t_soa, key, rdata_size, &a, anslen);
-       if (rv < 0) {
+       resp_size = rwrap_fake_rdata_common(ns_t_soa, rdata_size,
+                                           rr->key, anslen, &a);
+       if (resp_size < 0) {
                return -1;
        }
 
@@ -473,61 +552,48 @@ static int rwrap_fake_soa(const char *key,
        a += compressed_ns_len;
        memcpy(a, mailbox_compressed, compressed_mb_len);


-- 
Resolv Wrapper Repository

Reply via email to