From: Matthijs Mekking Date: Fri, 24 May 2013 10:24:07 +0000 (+0000) Subject: ldns_pkt_ixfr_request_new and ldns_pkt_ixfr_request_new_frm_str X-Git-Tag: release-1.6.17rc1~101 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=947ff8919c63712aeac06164e04213cf8a7e40f3;p=thirdparty%2Fldns.git ldns_pkt_ixfr_request_new and ldns_pkt_ixfr_request_new_frm_str --- diff --git a/Changelog b/Changelog index 3e1eec7c..8f29df59 100644 --- 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 diff --git a/ldns/packet.h b/ldns/packet.h index ed7c3274..eb250403 100644 --- a/ldns/packet.h +++ b/ldns/packet.h @@ -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 * diff --git a/packet.c b/packet.c index d57e9e27..f51fbb83 100644 --- 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) { diff --git a/resolver.c b/resolver.c index a57157a3..90643edb 100644 --- a/resolver.c +++ b/resolver.c @@ -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; }