Skip to content
Snippets Groups Projects
Commit 7c4be746 authored by Lubos Slovak's avatar Lubos Slovak
Browse files

API for removing RDATA from RRSet.

parent a6e41b06
No related branches found
No related tags found
No related merge requests found
......@@ -9,6 +9,36 @@
#include "dnslib/descriptor.h"
#include "dnslib/error.h"
/*----------------------------------------------------------------------------*/
/* Non-API functions */
/*----------------------------------------------------------------------------*/
static void dnslib_rrset_disconnect_rdata(dnslib_rrset_t *rrset,
dnslib_rdata_t *prev, dnslib_rdata_t *rdata)
{
if (prev == NULL) {
// find the previous RDATA in the series, as its pointer must
// be changed
dnslib_rdata_t *prev = rdata->next;
while (prev->next != rdata) {
prev = prev->next;
}
}
assert(prev);
assert(prev->next == rdata);
prev->next = rdata->next;
if (rrset->rdata == rdata) {
if (rdata->next == rdata) {
rrset->rdata = NULL;
} else {
rrset->rdata = rdata->next;
}
}
}
/*----------------------------------------------------------------------------*/
/* API functions */
/*----------------------------------------------------------------------------*/
......@@ -60,6 +90,37 @@ int dnslib_rrset_add_rdata(dnslib_rrset_t *rrset, dnslib_rdata_t *rdata)
/*----------------------------------------------------------------------------*/
dnslib_rdata_t *dnslib_rrset_remove_rdata(dnslib_rrset_t *rrset,
const dnslib_rdata_t *rdata)
{
if (rrset == NULL || rdata == NULL) {
return NULL;
}
dnslib_rdata_t *prev = NULL;
dnslib_rdata_t *rr = rrset->rdata;
dnslib_rrtype_descriptor_t *desc =
dnslib_rrtype_descriptor_by_type(rrset->type);
if (desc == NULL) {
return NULL;
}
while (rr != NULL) {
/*! \todo maybe the dnames should be compared case-insensitive*/
if (dnslib_rdata_compare(rr, rdata, desc->wireformat) == 0) {
dnslib_rrset_disconnect_rdata(rrset, prev, rr);
return rr;
}
prev = rr;
rr = dnslib_rrset_rdata_get_next(rrset, rr);
}
return NULL;
}
/*----------------------------------------------------------------------------*/
int dnslib_rrset_set_rrsigs(dnslib_rrset_t *rrset, dnslib_rrset_t *rrsigs)
{
if (rrset == NULL || rrsigs == NULL) {
......@@ -205,7 +266,6 @@ int dnslib_rrset_compare(const dnslib_rrset_t *r1,
return 0;
}
/*! @todo Implement RDATA comparation */
res = res && (dnslib_rdata_compare(r1->rdata, r2->rdata,
desc->wireformat) == 0);
}
......@@ -215,6 +275,14 @@ int dnslib_rrset_compare(const dnslib_rrset_t *r1,
/*----------------------------------------------------------------------------*/
int dnslib_rrset_copy(const dnslib_rrset_t *from, dnslib_rrset_t **to)
{
/*! \todo Implement (shallow copy). */
return DNSLIB_ERROR;
}
/*----------------------------------------------------------------------------*/
void dnslib_rrset_free(dnslib_rrset_t **rrset)
{
if (rrset == NULL || *rrset == NULL) {
......
......@@ -90,6 +90,9 @@ dnslib_rrset_t *dnslib_rrset_new(dnslib_dname_t *owner, uint16_t type,
*/
int dnslib_rrset_add_rdata(dnslib_rrset_t *rrset, dnslib_rdata_t *rdata);
dnslib_rdata_t * dnslib_rrset_remove_rdata(dnslib_rrset_t *rrset,
const dnslib_rdata_t *rdata);
/*!
* \brief Adds RRSIG signatures to this RRSet.
*
......@@ -191,6 +194,8 @@ int dnslib_rrset_compare(const dnslib_rrset_t *r1,
const dnslib_rrset_t *r2,
dnslib_rrset_compare_type_t cmp);
int dnslib_rrset_copy(const dnslib_rrset_t *from, dnslib_rrset_t **to);
/*!
* \brief Destroys the RRSet structure.
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment