return LDNS_STATUS_OK;
}
+/* TODO check status returns */
+
ldns_status
ldns_pkt2buffer(ldns_buffer *output, ldns_pkt *pkt)
{
+ uint16_t i;
ldns_status status = LDNS_STATUS_OK;
status = ldns_pktheader2buffer(output, pkt);
printf("error in pkt2buf %d\n", status);
}
+ ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; ");
+ for (i = 0; i < ldns_pkt_qdcount(pkt); i++) {
+ status = ldns_rr2buffer(output,
+ ldns_rrset_rr(ldns_pkt_question(pkt), i));
+ ldns_buffer_printf(output, "\n");
+ }
+
+ ldns_buffer_printf(output, ";; ANSWER SECTION:\n");
+ for (i = 0; i < ldns_pkt_ancount(pkt); i++) {
+ status = ldns_rr2buffer(output,
+ ldns_rrset_rr(ldns_pkt_answer(pkt), i));
+ ldns_buffer_printf(output, "\n");
+ }
+
+ ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n");
+ for (i = 0; i < ldns_pkt_nscount(pkt); i++) {
+ status = ldns_rr2buffer(output,
+ ldns_rrset_rr(ldns_pkt_authority(pkt), i));
+ ldns_buffer_printf(output, "\n");
+ }
+
+ ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n");
+ for (i = 0; i < ldns_pkt_arcount(pkt); i++) {
+ status = ldns_rr2buffer(output,
+ ldns_rrset_rr(ldns_pkt_additional(pkt), i));
+ ldns_buffer_printf(output, "\n");
+ }
+
return status;
}
uint16_t ldns_pkt_nscount(ldns_pkt *);
uint16_t ldns_pkt_arcount(ldns_pkt *);
+ldns_rrset *ldns_pkt_question(ldns_pkt *packet);
+ldns_rrset *ldns_pkt_answer(ldns_pkt *packet);
+ldns_rrset *ldns_pkt_authority(ldns_pkt *packet);
+ldns_rrset *ldns_pkt_additional(ldns_pkt *packet);
+
void ldns_pkt_set_id(ldns_pkt *, uint16_t);
void ldns_pkt_set_qr(ldns_pkt *, bool);
void ldns_pkt_set_aa(ldns_pkt *, bool);
ldns_rdf_type ldns_rdf_get_type(ldns_rdf *);
ldns_rdf *ldns_rdf_new(uint16_t, ldns_rdf_type, uint8_t *);
uint8_t *ldns_rdf_data(ldns_rdf *);
-void ldns_rdf_destroy(ldns_rdf *);
+void ldns_rdf_free(ldns_rdf *);
#endif /* !_LDNS_RDATA_H */
*/
struct ldns_struct_rrset
{
- ldns_rr *rrs;
-
+ uint16_t _rr_count;
+ ldns_rr **_rrs;
};
typedef struct ldns_struct_rrset ldns_rrset;
void ldns_rr_set_type(ldns_rr *, ldns_rr_type);
void ldns_rr_set_class(ldns_rr *, ldns_rr_class);
bool ldns_rr_push_rdf(ldns_rr *, ldns_rdf *);
+ldns_rdf *ldns_rr_rdf(ldns_rr *rr, uint16_t nr);
ldns_rdf *ldns_rr_owner(ldns_rr *);
uint8_t ldns_rr_ttl(ldns_rr *);
uint16_t ldns_rr_rd_count(ldns_rr *);
ldns_rr_type ldns_rr_get_type(ldns_rr *);
ldns_rr_class ldns_rr_get_class(ldns_rr *);
+uint16_t ldns_rrset_rr_count(ldns_rrset *rrset);
+void ldns_rrset_set_rr_count(ldns_rrset *rrset, uint16_t count);
+ldns_rr *ldns_rrset_rr(ldns_rrset *rrset, uint16_t nr);
+ldns_rrset *ldns_rrset_new();
+void ldns_rrset_free(ldns_rrset *rrset);
+bool ldns_rrset_push_rr(ldns_rrset *rrset, ldns_rr *rr);
const ldns_rr_descriptor *ldns_rr_descript(uint16_t type);
size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor);
return packet->_header->_arcount;
}
+ldns_rrset *
+ldns_pkt_question(ldns_pkt *packet)
+{
+ return packet->_question;
+}
+
+ldns_rrset *
+ldns_pkt_answer(ldns_pkt *packet)
+{
+ return packet->_answer;
+}
+
+ldns_rrset *
+ldns_pkt_authority(ldns_pkt *packet)
+{
+ return packet->_authority;
+}
+
+ldns_rrset *
+ldns_pkt_additional(ldns_pkt *packet)
+{
+ return packet->_additional;
+}
+
/* write */
void
return NULL;
}
- packet->_question = NULL;
- packet->_answer = NULL;
- packet->_authority = NULL;
- packet->_additional = NULL;
+ packet->_question = ldns_rrset_new();
+ packet->_answer = ldns_rrset_new();
+ packet->_authority = ldns_rrset_new();
+ packet->_additional = ldns_rrset_new();
return packet;
}
}
void
-ldns_rdf_destroy(ldns_rdf *rd)
+ldns_rdf_free(ldns_rdf *rd)
{
- rd = NULL; /* kuch */
- /* empty */
+ FREE(rd);
}
/**
return rr;
}
+/**
+ * Frees the rr structure TODO
+ */
+void
+ldns_rr_free(ldns_rr *rr)
+{
+ uint16_t i;
+ for (i = 0; i < ldns_rr_rd_count(rr); i++) {
+ ldns_rdf_free(ldns_rr_rdf(rr, i));
+ }
+ /*
+ FREE(ldns_rr_owner(rr));
+ */
+ FREE(rr);
+}
+
/**
* set the owner in the rr structure
*/
return true;
}
+/**
+ *
+ */
+ldns_rdf *
+ldns_rr_rdf(ldns_rr *rr, uint16_t nr)
+{
+ if (nr < ldns_rr_rd_count(rr)) {
+ return rr->_rdata_fields[nr];
+ } else {
+ return NULL;
+ }
+}
+
/**
* return the owner name of an rr structure
*/
return rr->_rr_class;
}
+/* rrsets */
+
+uint16_t
+ldns_rrset_rr_count(ldns_rrset *rrset)
+{
+ return rrset->_rr_count;
+}
+
+void
+ldns_rrset_set_rr_count(ldns_rrset *rrset, uint16_t count)
+{
+ rrset->_rr_count = count;
+}
+
+ldns_rr *
+ldns_rrset_rr(ldns_rrset *rrset, uint16_t nr)
+{
+ if (nr < ldns_rrset_rr_count(rrset)) {
+ return rrset->_rrs[nr];
+ } else {
+ return NULL;
+ }
+}
+
+ldns_rrset *
+ldns_rrset_new()
+{
+ ldns_rrset *rrset = MALLOC(ldns_rrset);
+ rrset->_rr_count = 0;
+ rrset->_rrs = NULL;
+
+ return rrset;
+}
+
+void
+ldns_rrset_free(ldns_rrset *rrset)
+{
+ uint16_t i;
+
+ for (i=0; i < ldns_rrset_rr_count(rrset); i++) {
+ ldns_rr_free(ldns_rrset_rr(rrset, i));
+ }
+
+ FREE(rrset);
+}
+
+bool
+ldns_rrset_push_rr(ldns_rrset *rrset, ldns_rr *rr)
+{
+ uint16_t rr_count;
+ ldns_rr **rrs;
+
+ rr_count = ldns_rrset_rr_count(rrset);
+
+ /* grow the array */
+ rrs = XREALLOC(
+ rrset->_rrs, ldns_rr *, rr_count + 1);
+ if (!rrs) {
+ return false;
+ }
+
+ /* add the new member */
+ rrset->_rrs = rrs;
+ rrset->_rrs[rr_count] = rr;
+
+ ldns_rrset_set_rr_count(rrset, rr_count + 1);
+ return true;
+
+}
static const ldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN };
static const ldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A };
for (i = 0; i < ldns_pkt_qdcount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_QUESTION);
+ if (!ldns_rrset_push_rr(ldns_pkt_question(packet), rr)) {
+ return LDNS_STATUS_INTERNAL_ERR;
+ }
STATUS_CHECK_GOTO(status, status_error);
}
for (i = 0; i < ldns_pkt_ancount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_ANSWER);
+ if (!ldns_rrset_push_rr(ldns_pkt_answer(packet), rr)) {
+ return LDNS_STATUS_INTERNAL_ERR;
+ }
STATUS_CHECK_GOTO(status, status_error);
}
for (i = 0; i < ldns_pkt_nscount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_AUTHORITY);
+ if (!ldns_rrset_push_rr(ldns_pkt_authority(packet), rr)) {
+ return LDNS_STATUS_INTERNAL_ERR;
+ }
STATUS_CHECK_GOTO(status, status_error);
}
for (i = 0; i < ldns_pkt_arcount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_ADDITIONAL);
+ if (!ldns_rrset_push_rr(ldns_pkt_additional(packet), rr)) {
+ return LDNS_STATUS_INTERNAL_ERR;
+ }
STATUS_CHECK_GOTO(status, status_error);
}