ft_at
} ft_state;
-#define INIT_OFFSETS(name, var, default_offsets) \
- { \
- (var) = (default_offsets); \
- }
-
-#define SETUP_OFFSETS(name, var, default_offsets) \
- ({ \
- (var) = (default_offsets); \
- set_offsets(name, var, NULL); \
- })
-
/*%
* Note: If additional attributes are added that should not be set for
* empty names, MAKE_EMPTY() must be changed so it clears them.
static thread_local dns_name_totextfilter_t *totext_filter_proc = NULL;
static uint8_t
-set_offsets(const dns_name_t *name, unsigned char *offsets,
+set_offsets(const dns_name_t *name, dns_offsets_t offsets,
dns_name_t *set_name);
bool
unsigned int l1, l2, l, count1, count2, count, nlabels;
int cdiff, ldiff, diff;
unsigned char *label1, *label2;
- unsigned char *offsets1, *offsets2;
- dns_offsets_t odata1, odata2;
+ dns_offsets_t offsets1, offsets2;
dns_namereln_t namereln = dns_namereln_none;
/*
return dns_namereln_equal;
}
- l1 = SETUP_OFFSETS(name1, offsets1, odata1);
- l2 = SETUP_OFFSETS(name2, offsets2, odata2);
+ l1 = dns_name_offsets(name1, offsets1);
+ l2 = dns_name_offsets(name2, offsets2);
nlabels = 0;
if (l2 > l1) {
ldiff = l1 - l2;
}
- offsets1 += l1;
- offsets2 += l2;
-
while (l-- > 0) {
- offsets1--;
- offsets2--;
- label1 = &name1->ndata[*offsets1];
- label2 = &name2->ndata[*offsets2];
+ l1--;
+ l2--;
+ label1 = &name1->ndata[offsets1[l1]];
+ label2 = &name2->ndata[offsets2[l2]];
count1 = *label1++;
count2 = *label2++;
void
dns_name_getlabel(const dns_name_t *name, unsigned int n, dns_label_t *label) {
- unsigned char *offsets;
- dns_offsets_t odata;
+ dns_offsets_t offsets;
/*
* Make 'label' refer to the 'n'th least significant label of 'name'.
REQUIRE(DNS_NAME_VALID(name));
REQUIRE(label != NULL);
- uint8_t labels = SETUP_OFFSETS(name, offsets, odata);
+ uint8_t labels = dns_name_offsets(name, offsets);
REQUIRE(labels > 0);
REQUIRE(n < labels);
void
dns_name_fromregion(dns_name_t *name, const isc_region_t *r) {
- unsigned char *offsets;
- dns_offsets_t odata;
+ dns_offsets_t offsets;
unsigned int len;
isc_region_t r2 = { .base = NULL, .length = 0 };
REQUIRE(r != NULL);
REQUIRE(DNS_NAME_BINDABLE(name));
- INIT_OFFSETS(name, offsets, odata);
-
name->ndata = r->base;
if (name->buffer != NULL) {
isc_buffer_clear(name->buffer);
unsigned int n1 = 0, n2 = 0;
unsigned int tlen, nrem, nused, digits = 0, labels, tused;
bool done;
- unsigned char *offsets;
- dns_offsets_t odata;
bool downcase;
/*
REQUIRE(DNS_NAME_BINDABLE(name));
- INIT_OFFSETS(name, offsets, odata);
- offsets[0] = 0;
-
/*
* Make 'name' empty in case of failure.
*/
*label = count;
labels++;
INSIST(labels < DNS_NAME_MAXLABELS);
- offsets[labels] = nused;
if (tlen == 0) {
labels++;
*ndata++ = 0;
*label = count;
labels++;
INSIST(labels < DNS_NAME_MAXLABELS);
- offsets[labels] = nused;
}
if (origin != NULL) {
if (nrem < origin->length) {
labels++;
if (n1 > 0) {
INSIST(labels < DNS_NAME_MAXLABELS);
- offsets[labels] = nused;
}
}
if (origin->attributes.absolute) {
}
static uint8_t
-set_offsets(const dns_name_t *name, unsigned char *offsets,
+set_offsets(const dns_name_t *name, dns_offsets_t offsets,
dns_name_t *set_name) {
unsigned int offset, count, length, nlabels;
unsigned char *ndata;
uint32_t name_len = 0;
MAKE_EMPTY(name); /* in case of failure */
- dns_offsets_t odata;
- uint8_t *offsets = NULL;
- uint32_t labels = 0;
- INIT_OFFSETS(name, offsets, odata);
-
/*
* After chasing a compression pointer, these variables refer to the
* source buffer as follows:
* the offsets array. Don't touch any source bytes yet!
* The source bounds check will happen when we loop.
*/
- offsets[labels++] = name_len;
/* and then a step to the ri-i-i-i-i-ight */
cursor += label_len;
name_len += label_len + 1;
}
uint8_t
-dns_name_offsets(const dns_name_t *name, uint8_t *offsets) {
+dns_name_offsets(const dns_name_t *name, dns_offsets_t offsets) {
REQUIRE(DNS_NAME_VALID(name));
return set_offsets(name, offsets, NULL);
}