]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
add SOA rr in AUTH section when QTYPE=IXFR
authorMatthijs Mekking <matje@NLnetLabs.nl>
Mon, 24 Sep 2012 11:06:40 +0000 (11:06 +0000)
committerMatthijs Mekking <matje@NLnetLabs.nl>
Mon, 24 Sep 2012 11:06:40 +0000 (11:06 +0000)
packet.c

index b902c5ebc1eca7dc94694533571c6bd2fd10eb25..b44c0add6450293a2d89c91ad487a2c18a0a69eb 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -826,6 +826,86 @@ ldns_pkt_set_flags(ldns_pkt *packet, uint16_t flags)
        return true;
 }
 
+
+static ldns_status
+ldns_pkt_add_authsoa(ldns_pkt* packet, ldns_rdf* rr_name, ldns_rr_class rr_class)
+{
+       ldns_rr* soa_rr = ldns_rr_new();
+       ldns_rdf *owner_rdf;
+       ldns_rdf *mname_rdf;
+       ldns_rdf *rname_rdf;
+       ldns_rdf *serial_rdf;
+       ldns_rdf *refresh_rdf;
+       ldns_rdf *retry_rdf;
+       ldns_rdf *expire_rdf;
+       ldns_rdf *minimum_rdf;
+
+       if (!soa_rr) {
+               return LDNS_STATUS_MEM_ERR;
+       }
+       owner_rdf = ldns_rdf_clone(rr_name);
+       if (!owner_rdf) {
+               ldns_rr_free(soa_rr);
+               return LDNS_STATUS_MEM_ERR;
+       }
+
+       ldns_rr_set_owner(soa_rr, owner_rdf);
+       ldns_rr_set_type(soa_rr, LDNS_RR_TYPE_SOA);
+       ldns_rr_set_class(soa_rr, rr_class);
+       ldns_rr_set_question(soa_rr, false);
+
+       if (ldns_str2rdf_dname(&mname_rdf, ".") != LDNS_STATUS_OK) {
+               ldns_rr_free(soa_rr);
+               return LDNS_STATUS_MEM_ERR;
+       } 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;
+       } 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;
+       } 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;
+       } 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;
+       } 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;
+       } 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;
+       } else {
+               ldns_rr_push_rdf(soa_rr, minimum_rdf);
+       }
+       ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, soa_rr);
+       return LDNS_STATUS_OK;
+}
+
+
 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)
@@ -860,16 +940,23 @@ ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name, ldns_rr_type rr_type,
                ldns_rr_set_type(question_rr, rr_type);
                ldns_rr_set_class(question_rr, rr_class);
                 ldns_rr_set_question(question_rr, true);
-               
+
                ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr);
        } else {
                ldns_rr_free(question_rr);
                ldns_pkt_free(packet);
                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;
+               }
+       }
+
        packet->_tsig_rr = NULL;
-       
        ldns_pkt_set_answerfrom(packet, NULL);
        if (p) {
                *p = packet;
@@ -913,11 +1000,17 @@ ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_cla
        ldns_rr_set_type(question_rr, rr_type);
        ldns_rr_set_class(question_rr, rr_class);
         ldns_rr_set_question(question_rr, true);
-       
-       packet->_tsig_rr = NULL;
-       
        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;
+               }
+       }
+
+       packet->_tsig_rr = NULL;
        return packet;
 }