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)
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;
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;
}