diff options
author | Levigneron Vincent <levigner@nostromo.nic.fr> | 2018-12-18 01:18:41 +0100 |
---|---|---|
committer | Levigneron Vincent <levigner@nostromo.nic.fr> | 2018-12-18 01:18:41 +0100 |
commit | 91a8e58132af381fff5bd906c0bf1ee15daaed87 (patch) | |
tree | 0925a6ee20266bce1ea7dc024ee3ea8b9d3f4338 /src | |
parent | 5514ba9aea284bc87b77156981ddd508f4159f9a (diff) |
- Add new EDNS accessors to deal with DNS Flag Day test cases.
Diffstat (limited to 'src')
-rw-r--r-- | src/LDNS.xs | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/src/LDNS.xs b/src/LDNS.xs index 9237f0a..278259c 100644 --- a/src/LDNS.xs +++ b/src/LDNS.xs @@ -232,6 +232,43 @@ query(obj, dname, rrtype="A", rrclass="IN") OUTPUT: RETVAL +SV * +query_with_pkt(obj, query_pkt) + Zonemaster::LDNS obj; + Zonemaster::LDNS::Packet query_pkt; + CODE: + { + ldns_status status; + ldns_pkt *pkt; + + ldns_pkt_set_edns_data(query_pkt, NULL); + status = ldns_resolver_send_pkt(&pkt, obj, query_pkt); + if ( status != LDNS_STATUS_OK) { + /* Remove and reinsert nameserver to make ldns forget it failed */ + ldns_status s; + ldns_rdf *ns = ldns_resolver_pop_nameserver(obj); + if (ns != NULL) { + s = ldns_resolver_push_nameserver(obj, ns); + if ( s != LDNS_STATUS_OK) { + croak("Failed to reinsert nameserver after failure (ouch): %s", ldns_get_errorstr_by_id(s)); + } + ldns_rdf_deep_free(ns); + } + croak("%s", ldns_get_errorstr_by_id(status)); + RETVAL = NULL; + } + ldns_pkt *clone = ldns_pkt_clone(pkt); + ldns_pkt_set_timestamp(clone, ldns_pkt_timestamp(pkt)); + RETVAL = sv_setref_pv(newSV(0), "Zonemaster::LDNS::Packet", clone); + ldns_pkt_free(pkt); +#ifdef USE_ITHREADS + net_ldns_remember_packet(RETVAL); +#endif + } + OUTPUT: + RETVAL + + bool recurse(obj,...) Zonemaster::LDNS obj; @@ -941,10 +978,10 @@ U32 packet_querytime(obj,...) Zonemaster::LDNS::Packet obj; CODE: - if ( items > 1 ) { + if ( items > 1 ) { SvGETMAGIC(ST(1)); - ldns_pkt_set_querytime(obj, (U32)SvIV(ST(1))); - } + ldns_pkt_set_querytime(obj, (U32)SvIV(ST(1))); + } RETVAL = ldns_pkt_querytime(obj); OUTPUT: RETVAL @@ -1223,6 +1260,24 @@ packet_new_from_wireformat(class,buf) OUTPUT: RETVAL +bool +packet_set_edns_present(obj) + Zonemaster::LDNS::Packet obj; + CODE: + obj->_edns_present = true; + RETVAL = ldns_pkt_edns(obj); + OUTPUT: + RETVAL + +bool +packet_unset_edns_present(obj) + Zonemaster::LDNS::Packet obj; + CODE: + obj->_edns_present = false; + RETVAL = ldns_pkt_edns(obj); + OUTPUT: + RETVAL + U16 packet_edns_size(obj,...) Zonemaster::LDNS::Packet obj; @@ -1249,6 +1304,19 @@ packet_edns_rcode(obj,...) OUTPUT: RETVAL +U16 +packet_edns_z(obj,...) + Zonemaster::LDNS::Packet obj; + CODE: + if(items>=2) + { + SvGETMAGIC(ST(1)); + ldns_pkt_set_edns_z(obj, (U16)SvIV(ST(1))); + } + RETVAL = ldns_pkt_edns_z(obj); + OUTPUT: + RETVAL + U8 packet_edns_version(obj,...) Zonemaster::LDNS::Packet obj; |