-/* Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2018 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#pragma once
+#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
int knot_rdataset_sort_at(knot_rdataset_t *rrs, uint16_t pos, knot_mm_t *mm);
/*! \brief Check helper. */
-#define KNOT_RDATASET_CHECK(rrs, pos, code) \
- if (rrs == NULL || rrs->data == NULL || rrs->rr_count == 0 || \
- pos >= rrs->rr_count) { \
- code; \
- }
+#define KNOT_RDATASET_CHECK(rrs, pos) \
+ assert(rrs && rrs->data && rrs->rr_count > 0 && pos < rrs->rr_count);
/*! \brief Access helper. */
static inline
-uint8_t *knot_rdata_offset(const knot_rdataset_t *rrs, uint16_t pos, uint16_t offset) {
+uint8_t *knot_rdata_offset(const knot_rdataset_t *rrs, uint16_t pos, uint16_t offset)
+{
knot_rdata_t *rr = knot_rdataset_at(rrs, pos);
+ assert(rr);
return rr->data + offset;
}
static inline
uint16_t knot_dnskey_flags(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u16(knot_rdata_offset(rrs, pos, 0));
}
static inline
uint8_t knot_dnskey_proto(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
-
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 2);
}
static inline
uint8_t knot_dnskey_alg(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 3);
}
void knot_dnskey_key(const knot_rdataset_t *rrs, size_t pos, uint8_t **key,
uint16_t *key_size)
{
- KNOT_RDATASET_CHECK(rrs, pos, return);
+ KNOT_RDATASET_CHECK(rrs, pos);
*key = knot_rdata_offset(rrs, pos, 4);
const knot_rdata_t *rr = knot_rdataset_at(rrs, pos);
*key_size = rr->len - 4;
static inline
uint16_t knot_ds_key_tag(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u16(knot_rdata_offset(rrs, pos, 0));
}
static inline
uint8_t knot_ds_alg(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 2);
}
static inline
uint8_t knot_ds_digest_type(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 3);
}
void knot_ds_digest(const knot_rdataset_t *rrs, size_t pos,
uint8_t **digest, uint16_t *digest_size)
{
- KNOT_RDATASET_CHECK(rrs, pos, return);
+ KNOT_RDATASET_CHECK(rrs, pos);
*digest = knot_rdata_offset(rrs, pos, 4);
const knot_rdata_t *rr = knot_rdataset_at(rrs, pos);
*digest_size = rr->len - 4;
static inline
const knot_dname_t *knot_nsec_next(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return NULL);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_rdata_offset(rrs, 0, 0);
}
void knot_nsec_bitmap(const knot_rdataset_t *rrs,
uint8_t **bitmap, uint16_t *size)
{
- KNOT_RDATASET_CHECK(rrs, 0, return);
+ KNOT_RDATASET_CHECK(rrs, 0);
knot_rdata_t *rr = knot_rdataset_at(rrs, 0);
int next_size = knot_dname_size(knot_nsec_next(rrs));
static inline
uint8_t knot_nsec3_algorithm(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 0);
}
static inline
uint8_t knot_nsec3_flags(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 1);
}
static inline
uint16_t knot_nsec3_iterations(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u16(knot_rdata_offset(rrs, pos, 2));
}
static inline
uint8_t knot_nsec3_salt_length(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *(knot_rdata_offset(rrs, pos, 0) + 4);
}
static inline
const uint8_t *knot_nsec3_salt(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return NULL);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_rdata_offset(rrs, pos, 5);
}
void knot_nsec3_next_hashed(const knot_rdataset_t *rrs, size_t pos,
uint8_t **name, uint8_t *name_size)
{
- KNOT_RDATASET_CHECK(rrs, pos, return);
+ KNOT_RDATASET_CHECK(rrs, pos);
uint8_t salt_size = knot_nsec3_salt_length(rrs, pos);
*name_size = *knot_rdata_offset(rrs, pos, 4 + salt_size + 1);
*name = knot_rdata_offset(rrs, pos, 4 + salt_size + 2);
void knot_nsec3_bitmap(const knot_rdataset_t *rrs, size_t pos,
uint8_t **bitmap, uint16_t *size)
{
- KNOT_RDATASET_CHECK(rrs, pos, return);
+ KNOT_RDATASET_CHECK(rrs, pos);
/* Bitmap is last, skip all the items. */
size_t offset = 6; //hash alg., flags, iterations, salt len., hash len.
static inline
uint8_t knot_nsec3param_algorithm(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 0);
}
static inline
uint8_t knot_nsec3param_flags(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 1);
}
static inline
uint16_t knot_nsec3param_iterations(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u16(knot_rdata_offset(rrs, pos, 2));
}
static inline
uint8_t knot_nsec3param_salt_length(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 4);
}
static inline
const uint8_t *knot_nsec3param_salt(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_rdata_offset(rrs, pos, 5);
}
-/* Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2018 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
static inline
const knot_dname_t *knot_cname_name(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return NULL);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_rdata_offset(rrs, 0, 0);
}
static inline
const knot_dname_t *knot_dname_target(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return NULL);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_rdata_offset(rrs, 0, 0);
}
static inline
const knot_dname_t *knot_ns_name(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_rdata_offset(rrs, pos, 0);
}
static inline
const knot_dname_t *knot_mx_name(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_rdata_offset(rrs, pos, 2);
}
static inline
const knot_dname_t *knot_srv_name(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_rdata_offset(rrs, pos, 6);
}
static inline
uint16_t knot_rrsig_type_covered(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u16(knot_rdata_offset(rrs, pos, 0));
}
static inline
uint8_t knot_rrsig_algorithm(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 2);
}
static inline
uint8_t knot_rrsig_labels(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return *knot_rdata_offset(rrs, pos, 3);
}
static inline
uint32_t knot_rrsig_original_ttl(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u32(knot_rdata_offset(rrs, pos, 4));
}
static inline
uint32_t knot_rrsig_sig_expiration(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u32(knot_rdata_offset(rrs, pos, 8));
}
static inline
uint32_t knot_rrsig_sig_inception(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u32(knot_rdata_offset(rrs, pos, 12));
}
static inline
uint16_t knot_rrsig_key_tag(const knot_rdataset_t *rrs, size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_wire_read_u16(knot_rdata_offset(rrs, pos, 16));
}
const knot_dname_t *knot_rrsig_signer_name(const knot_rdataset_t *rrs,
size_t pos)
{
- KNOT_RDATASET_CHECK(rrs, pos, return 0);
+ KNOT_RDATASET_CHECK(rrs, pos);
return knot_rdata_offset(rrs, pos, 18);
}
static inline
const knot_dname_t *knot_soa_primary_ns(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return NULL);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_rdata_offset(rrs, 0, 0);
}
static inline
const knot_dname_t *knot_soa_mailbox(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return NULL);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_rdata_offset(rrs, 0, knot_dname_size(knot_soa_primary_ns(rrs)));
}
static inline
size_t knot_soa_names_len(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return 0);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_dname_size(knot_soa_primary_ns(rrs))
+ knot_dname_size(knot_soa_mailbox(rrs));
}
static inline
uint32_t knot_soa_serial(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return 0);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_wire_read_u32(knot_rdata_offset(rrs, 0, knot_soa_names_len(rrs)));
}
static inline
void knot_soa_serial_set(knot_rdataset_t *rrs, uint32_t serial)
{
- KNOT_RDATASET_CHECK(rrs, 0, return);
+ KNOT_RDATASET_CHECK(rrs, 0);
knot_wire_write_u32(knot_rdata_offset(rrs, 0, knot_soa_names_len(rrs)), serial);
}
static inline
uint32_t knot_soa_refresh(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return 0);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_wire_read_u32(knot_rdata_offset(rrs, 0, knot_soa_names_len(rrs) + 4));
}
static inline
uint32_t knot_soa_retry(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return 0);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_wire_read_u32(knot_rdata_offset(rrs, 0, knot_soa_names_len(rrs) + 8));
}
static inline
uint32_t knot_soa_expire(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return 0);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_wire_read_u32(knot_rdata_offset(rrs, 0, knot_soa_names_len(rrs) + 12));
}
static inline
uint32_t knot_soa_minimum(const knot_rdataset_t *rrs)
{
- KNOT_RDATASET_CHECK(rrs, 0, return 0);
+ KNOT_RDATASET_CHECK(rrs, 0);
return knot_wire_read_u32(knot_rdata_offset(rrs, 0, knot_soa_names_len(rrs) + 16));
}