* \return a new rdf with leftside/rightside
*/
ldns_rdf *
-ldns_dname_concat(ldns_rdf *rd1, ldns_rdf *rd2)
+ldns_dname_cat(ldns_rdf *rd1, ldns_rdf *rd2)
{
ldns_rdf *new;
uint16_t new_size;
/* prototypes */
uint8_t ldns_rdf_dname_label_count(ldns_rdf *);
ldns_rdf *ldns_dname_new_frm_str(const char *);
-ldns_rdf *ldns_dname_concat(ldns_rdf *, ldns_rdf *);
+ldns_rdf *ldns_dname_cat(ldns_rdf *, ldns_rdf *);
#endif /* !_LDNS_DNAME_H */
ldns_rr *ldns_rr_new_frm_str(const char *);
ldns_rr *ldns_rr_list_pop_rr(ldns_rr_list *);
ldns_rr *ldns_rr_set_pop_rr(ldns_rr_list *);
+ldns_rr_list *ldns_rr_list_cat(ldns_rr_list *, ldns_rr_list *);
#endif /* _LDNS_RR_H */
/* return ALL section concatenated */
ldns_rr_list *
-ldns_pkt_all(const ldns_pkt *packet)
-{
- ldns_pkt_print(stdout, packet);
- return NULL;
- /* TODO Miek */
+ldns_pkt_all(ldns_pkt *packet)
+{
+ /* mem leaks?? :( */
+ ldns_rr_list *all;
+
+ all = ldns_rr_list_cat(
+ ldns_pkt_xxsection(packet, LDNS_SECTION_QUESTION),
+ ldns_pkt_xxsection(packet, LDNS_SECTION_ANSWER));
+ all = ldns_rr_list_cat(all,
+ ldns_pkt_xxsection(packet, LDNS_SECTION_AUTHORITY));
+ all = ldns_rr_list_cat(all,
+ ldns_pkt_xxsection(packet, LDNS_SECTION_ADDITIONAL));
+ return all;
}
size_t
return ldns_resolver_send(r, name, type, class, flags);
}
- newname = ldns_dname_concat(name, ldns_resolver_domain(r));
+ newname = ldns_dname_cat(name, ldns_resolver_domain(r));
if (!newname) {
return NULL;
FREE(rr_list);
}
-/* need a pop here too */
+
+/**
+ * concatenate two ldns_rr_lists together
+ * \param[in] left the leftside
+ * \param[in] right the rightside
+ * \return a new rr_list with leftside/rightside concatenated
+ */
+ldns_rr_list *
+ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right)
+{
+ uint16_t l_rr_count;
+ uint16_t r_rr_count;
+ uint16_t i;
+ ldns_rr_list *cat;
+
+ l_rr_count = ldns_rr_list_rr_count(left);
+ r_rr_count = ldns_rr_list_rr_count(right);
+
+ /* check it not exceeding uint16_t size XXX XXX MIEK TODO */
+ cat = ldns_rr_list_new();
+
+ if (!cat) {
+ return NULL;
+ }
+
+ /* left */
+ for(i = 0; i < l_rr_count; i++) {
+ ldns_rr_list_push_rr(cat,
+ ldns_rr_list_rr(left, i));
+ }
+ /* right */
+ for(i = 0; i < r_rr_count; i++) {
+ ldns_rr_list_push_rr(cat,
+ ldns_rr_list_rr(right, i));
+ }
+ return cat;
+}
+
+/**
+ * push an rr to a rrlist
+ * \param[in] rr_list the rr_list to push to
+ * \param[in] rr the rr to push
+ * \return NULL on error, otherwise true
+ */
bool
ldns_rr_list_push_rr(ldns_rr_list *rr_list, ldns_rr *rr)
{
ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr)
{
uint16_t rr_count;
+ uint16_t i;
ldns_rr *last;
rr_count = ldns_rr_list_rr_count(rr_list);
ldns_rr_owner(rr)) != 0) {
return false;
}
- /* ok, still alive */
+ /* ok, still alive - check if the rr already
+ * exists - if so, dont' add it */
+ for(i = 0; i < rr_count; i++) {
+ if(ldns_rr_compare(
+ ldns_rr_list_rr(rr_list, i), rr) == 0) {
+ return false;
+ }
+ }
+ /* it's safe, push it */
return ldns_rr_list_push_rr(rr_list, rr);
}
}
/* concat tests */
cat_test1 = ldns_dname_new_frm_str("www");
cat_test2 = ldns_dname_new_frm_str("miek.nl.");
- concat = ldns_dname_concat(cat_test1, cat_test2);
+ concat = ldns_dname_cat(cat_test1, cat_test2);
ldns_rdf_print(stdout, concat);