]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
added pkt_clone()
authorJelte Jansen <jeltejan@NLnetLabs.nl>
Mon, 23 May 2005 10:36:19 +0000 (10:36 +0000)
committerJelte Jansen <jeltejan@NLnetLabs.nl>
Mon, 23 May 2005 10:36:19 +0000 (10:36 +0000)
ldns/packet.h
packet.c

index 48413ae9ad5780c7d046af68914110d36ce75b8f..49799feb8bb72cf3369a21d87df1b04c752c99e7 100644 (file)
@@ -245,6 +245,14 @@ ldns_pkt *ldns_pkt_query_new_frm_str(const char *rr_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);
 
+/**
+ * clones the given packet, creating a fully allocated copy
+ *
+ * \param[in] pkt the packet to clone
+ * \return ldns_pkt* pointer to the new packet
+ */
+ldns_pkt *ldns_pkt_deep_clone(ldns_pkt *pkt);
+
 #define LDNS_MAX_PACKETLEN         65535
 
 /* allow flags to be given to mk_query */
index 1c87448e1642bab8fafe29e7a74493083eb8c9c9..23fecf38af2ec396d1042f9f461786fa225a76b8 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -839,3 +839,47 @@ ldns_pkt_reply_type(ldns_pkt *p)
         */
        return LDNS_PACKET_ANSWER;
 }
+
+ldns_pkt *
+ldns_pkt_deep_clone(ldns_pkt *pkt)
+{
+       ldns_pkt *new_pkt;
+       
+       if (!pkt) {
+               return NULL;
+       }
+       
+       new_pkt = ldns_pkt_new();
+
+       ldns_pkt_set_id(new_pkt, ldns_pkt_id(pkt));
+       ldns_pkt_set_qr(new_pkt, ldns_pkt_qr(pkt));
+       ldns_pkt_set_aa(new_pkt, ldns_pkt_aa(pkt));
+       ldns_pkt_set_tc(new_pkt, ldns_pkt_tc(pkt));
+       ldns_pkt_set_rd(new_pkt, ldns_pkt_rd(pkt));
+       ldns_pkt_set_cd(new_pkt, ldns_pkt_cd(pkt));
+       ldns_pkt_set_ra(new_pkt, ldns_pkt_ra(pkt));
+       ldns_pkt_set_ad(new_pkt, ldns_pkt_ad(pkt));
+       ldns_pkt_set_opcode(new_pkt, ldns_pkt_opcode(pkt));
+       ldns_pkt_set_rcode(new_pkt, ldns_pkt_rcode(pkt));
+       ldns_pkt_set_qdcount(new_pkt, ldns_pkt_qdcount(pkt));
+       ldns_pkt_set_ancount(new_pkt, ldns_pkt_ancount(pkt));
+       ldns_pkt_set_nscount(new_pkt, ldns_pkt_nscount(pkt));
+       ldns_pkt_set_arcount(new_pkt, ldns_pkt_arcount(pkt));
+       ldns_pkt_set_answerfrom(new_pkt, ldns_pkt_answerfrom(pkt));
+       ldns_pkt_set_querytime(new_pkt, ldns_pkt_querytime(pkt));
+       ldns_pkt_set_size(new_pkt, ldns_pkt_size(pkt));
+       ldns_pkt_set_when(new_pkt, ldns_pkt_when(pkt));
+       ldns_pkt_set_tsig(new_pkt, ldns_pkt_tsig(pkt));
+       
+       /* todo: edns? */
+       
+       new_pkt->_question = ldns_rr_list_deep_clone(ldns_pkt_question(pkt));
+       new_pkt->_answer = ldns_rr_list_deep_clone(ldns_pkt_answer(pkt));
+       new_pkt->_authority = ldns_rr_list_deep_clone(ldns_pkt_authority(pkt));
+       new_pkt->_additional = ldns_rr_list_deep_clone(ldns_pkt_additional(pkt));
+       
+       return new_pkt;
+}
+
+
+