]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
ldns_pkt_ixfr_request_new and ldns_pkt_ixfr_request_new_frm_str
authorMatthijs Mekking <matje@NLnetLabs.nl>
Fri, 24 May 2013 10:24:07 +0000 (10:24 +0000)
committerMatthijs Mekking <matje@NLnetLabs.nl>
Fri, 24 May 2013 10:24:07 +0000 (10:24 +0000)
Changelog
ldns/packet.h
packet.c
resolver.c

index 3e1eec7cb3761a14c4288201750e50eff70b759f..8f29df59142e8b4f6f2c00cfb44bbf3ff13980ff 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -18,6 +18,8 @@
          for dane needed X509_check_ca function in openssl.
        * Fix ldns_dnssec_zone_new_frm_fp_l to allow the last parsed line of a
          zone to be an NSEC3 (or its RRSIG) covering an empty non terminal.
+       * New functions: ldns_pkt_ixfr_request_new and
+         ldns_pkt_ixfr_request_new_frm_str.
 
 1.6.16 2012-11-13
        * Fix Makefile to build pyldns with BSD make
index ed7c32746363b725e4a26ca73563c368db237c05..eb25040355bc9c243c915182aee342f2631825c1 100644 (file)
@@ -759,6 +759,18 @@ void ldns_pkt_free(ldns_pkt *packet);
  */
 ldns_status ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class , uint16_t flags);
 
+/**
+ * creates an IXFR request packet for the given name, class.
+ * adds the SOA record to the authority section.
+ * \param[out] p the packet to be returned
+ * \param[in] rr_name the name to query for (as string)
+ * \param[in] rr_class the class to query for
+ * \param[in] flags packet flags
+ * \param[in] soa soa record to be added to the authority section
+ * \return LDNS_STATUS_OK or a ldns_status mesg with the error
+ */
+ldns_status ldns_pkt_ixfr_request_new_frm_str(ldns_pkt **p, const char *rr_name, ldns_rr_class rr_class, uint16_t flags, ldns_rr* soa);
+
 /**
  * creates a packet with a query in it for the given name, type and class.
  * \param[in] rr_name the name to query for
@@ -769,6 +781,17 @@ ldns_status ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *rr_name, ldns_r
  */
 ldns_pkt *ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags);
 
+/**
+ * creates an IXFR request packet for the given name, type and class.
+ * adds the SOA record to the authority section.
+ * \param[in] rr_name the name to query for
+ * \param[in] rr_class the class to query for
+ * \param[in] flags packet flags
+ * \param[in] soa soa record to be added to the authority section
+ * \return ldns_pkt* a pointer to the new pkt
+ */
+ldns_pkt *ldns_pkt_ixfr_request_new(ldns_rdf *rr_name, ldns_rr_class rr_class, uint16_t flags, ldns_rr* soa);
+
 /**
  * clones the given packet, creating a fully allocated copy
  *
index d57e9e275ed22f68e96b7901b7cdb21e2057110f..f51fbb837d2f0bd9eb53c6e3b1d3fff53db72bdb 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -827,8 +827,8 @@ ldns_pkt_set_flags(ldns_pkt *packet, uint16_t flags)
 }
 
 
-static ldns_status
-ldns_pkt_add_authsoa(ldns_pkt* packet, ldns_rdf* rr_name, ldns_rr_class rr_class)
+static ldns_rr*
+ldns_pkt_authsoa(ldns_rdf* rr_name, ldns_rr_class rr_class)
 {
        ldns_rr* soa_rr = ldns_rr_new();
        ldns_rdf *owner_rdf;
@@ -841,12 +841,12 @@ ldns_pkt_add_authsoa(ldns_pkt* packet, ldns_rdf* rr_name, ldns_rr_class rr_class
        ldns_rdf *minimum_rdf;
 
        if (!soa_rr) {
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        }
        owner_rdf = ldns_rdf_clone(rr_name);
        if (!owner_rdf) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        }
 
        ldns_rr_set_owner(soa_rr, owner_rdf);
@@ -856,59 +856,59 @@ ldns_pkt_add_authsoa(ldns_pkt* packet, ldns_rdf* rr_name, ldns_rr_class rr_class
 
        if (ldns_str2rdf_dname(&mname_rdf, ".") != LDNS_STATUS_OK) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        } else {
                ldns_rr_push_rdf(soa_rr, mname_rdf);
        }
        if (ldns_str2rdf_dname(&rname_rdf, ".") != LDNS_STATUS_OK) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        } else {
                ldns_rr_push_rdf(soa_rr, rname_rdf);
        }
        serial_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
        if (!serial_rdf) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        } else {
                ldns_rr_push_rdf(soa_rr, serial_rdf);
        }
        refresh_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
        if (!refresh_rdf) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        } else {
                ldns_rr_push_rdf(soa_rr, refresh_rdf);
        }
        retry_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
        if (!retry_rdf) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        } else {
                ldns_rr_push_rdf(soa_rr, retry_rdf);
        }
        expire_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
        if (!expire_rdf) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        } else {
                ldns_rr_push_rdf(soa_rr, expire_rdf);
        }
        minimum_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
        if (!minimum_rdf) {
                ldns_rr_free(soa_rr);
-               return LDNS_STATUS_MEM_ERR;
+               return NULL;
        } else {
                ldns_rr_push_rdf(soa_rr, minimum_rdf);
        }
-       ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, soa_rr);
-       return LDNS_STATUS_OK;
+       return soa_rr;
 }
 
 
-ldns_status
-ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name, ldns_rr_type rr_type, 
-               ldns_rr_class rr_class, uint16_t flags)
+static ldns_status
+ldns_pkt_query_new_frm_str_internal(ldns_pkt **p, const char *name,
+       ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags,
+       ldns_rr* authsoa_rr)
 {
        ldns_pkt *packet;
        ldns_rr *question_rr;
@@ -918,11 +918,11 @@ ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name, ldns_rr_type rr_type,
        if (!packet) {
                return LDNS_STATUS_MEM_ERR;
        }
-       
+
        if (!ldns_pkt_set_flags(packet, flags)) {
                return LDNS_STATUS_ERR;
        }
-       
+
        question_rr = ldns_rr_new();
        if (!question_rr) {
                return LDNS_STATUS_MEM_ERR;
@@ -948,12 +948,8 @@ ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name, ldns_rr_type rr_type,
                return LDNS_STATUS_ERR;
        }
 
-       /** IXFR? */
-       if (rr_type == LDNS_RR_TYPE_IXFR) {
-               if (ldns_pkt_add_authsoa(packet, name_rdf, rr_class) != LDNS_STATUS_OK) {
-                       ldns_pkt_free(packet);
-                       return LDNS_STATUS_ERR;
-               }
+       if (authsoa_rr) {
+               ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, authsoa_rr);
        }
 
        packet->_tsig_rr = NULL;
@@ -967,9 +963,33 @@ ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name, ldns_rr_type rr_type,
        }
 }
 
-ldns_pkt *
-ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class,
-               uint16_t flags)
+ldns_status
+ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name,
+       ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags)
+{
+       return ldns_pkt_query_new_frm_str_internal(p, name, rr_type,
+               rr_class, flags, NULL);
+}
+
+ldns_status
+ldns_pkt_ixfr_request_new_frm_str(ldns_pkt **p, const char *name,
+       ldns_rr_class rr_class, uint16_t flags, ldns_rr *soa)
+{
+       ldns_rr* authsoa_rr = soa;
+       if (!authsoa_rr) {
+               ldns_rdf *name_rdf;
+               if (ldns_str2rdf_dname(&name_rdf, name) == LDNS_STATUS_OK) {
+                       authsoa_rr = ldns_pkt_authsoa(name_rdf, rr_class);
+               }
+               ldns_rdf_free(name_rdf);
+       }
+       return ldns_pkt_query_new_frm_str_internal(p, name, LDNS_RR_TYPE_IXFR,
+               rr_class, flags, authsoa_rr);
+}
+
+static ldns_pkt *
+ldns_pkt_query_new_internal(ldns_rdf *rr_name, ldns_rr_type rr_type,
+       ldns_rr_class rr_class, uint16_t flags, ldns_rr* authsoa_rr)
 {
        ldns_pkt *packet;
        ldns_rr *question_rr;
@@ -982,7 +1002,7 @@ ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_cla
        if (!ldns_pkt_set_flags(packet, flags)) {
                return NULL;
        }
-       
+
        question_rr = ldns_rr_new();
        if (!question_rr) {
                ldns_pkt_free(packet);
@@ -1002,18 +1022,34 @@ ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_cla
         ldns_rr_set_question(question_rr, true);
        ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr);
 
-       /** IXFR? */
-       if (rr_type == LDNS_RR_TYPE_IXFR) {
-               if (ldns_pkt_add_authsoa(packet, rr_name, rr_class) != LDNS_STATUS_OK) {
-                       ldns_pkt_free(packet);
-                       return NULL;
-               }
+       if (authsoa_rr) {
+               ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, authsoa_rr);
        }
 
        packet->_tsig_rr = NULL;
        return packet;
 }
 
+ldns_pkt *
+ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type,
+       ldns_rr_class rr_class, uint16_t flags)
+{
+       return ldns_pkt_query_new_internal(rr_name, rr_type,
+               rr_class, flags, NULL);
+}
+
+ldns_pkt *
+ldns_pkt_ixfr_request_new(ldns_rdf *rr_name, ldns_rr_class rr_class,
+       uint16_t flags, ldns_rr* soa)
+{
+       ldns_rr* authsoa_rr = soa;
+       if (!authsoa_rr) {
+               authsoa_rr = ldns_pkt_authsoa(rr_name, rr_class);
+       }
+       return ldns_pkt_query_new_internal(rr_name, LDNS_RR_TYPE_IXFR,
+               rr_class, flags, authsoa_rr);
+}
+
 ldns_pkt_type
 ldns_pkt_reply_type(ldns_pkt *p)
 {
index a57157a3fe216290e69b624b9db5a077763485c0..90643edb579e8de2952c6fc1ca92039a3173d478 100644 (file)
@@ -1138,7 +1138,12 @@ ldns_resolver_prepare_query_pkt(ldns_pkt **query_pkt, ldns_resolver *r,
 
        /* prepare a question pkt from the parameters
         * and then send this */
-       *query_pkt = ldns_pkt_query_new(ldns_rdf_clone(name), t, c, flags);
+       if (t == LDNS_RR_TYPE_IXFR) {
+               *query_pkt = ldns_pkt_ixfr_request_new(ldns_rdf_clone(name),
+                       c, flags, NULL);
+       } else {
+               *query_pkt = ldns_pkt_query_new(ldns_rdf_clone(name), t, c, flags);
+       }
        if (!*query_pkt) {
                return LDNS_STATUS_ERR;
        }