const char *delimiters = "\n\t ";
char *token = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
uint8_t *bitmap = LDNS_XMALLOC(uint8_t, 1);
- uint16_t bm_len = 0;
ldns_buffer *str_buf;
ssize_t c;
uint16_t cur_type;
- uint8_t cur_data[32];
- uint8_t cur_window = 0;
- uint8_t cur_window_max = 0;
- uint16_t cur_data_size = 0;
- uint16_t i;
+ size_t type_count = 0;
+ ldns_rr_type type_list[1024];
uint8_t *data = NULL;
str_buf = LDNS_MALLOC(ldns_buffer);
ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str));
- bitmap[0] = 0;
while ((c = ldns_bget_token(str_buf, token, delimiters, LDNS_MAX_RDFLEN)) != -1) {
cur_type = ldns_get_rr_type_by_name(token);
- if ((cur_type / 8) + 1 > bm_len) {
- bitmap = LDNS_XREALLOC(bitmap, uint8_t, (cur_type / 8) + 1);
- /* set to 0 */
- for (; bm_len <= cur_type / 8; bm_len++) {
- bitmap[bm_len] = 0;
- }
- }
- ldns_set_bit(bitmap + (int) cur_type / 8, (int) (7 - (cur_type % 8)), true);
- }
-
- memset(cur_data, 0, 32);
- for (i = 0; i < bm_len; i++) {
- if (i / 32 > cur_window) {
- /* check, copy, new */
- if (cur_window_max > 0) {
- /* this window has stuff, add it */
- data = LDNS_XREALLOC(data, uint8_t, cur_data_size + cur_window_max + 3);
- data[cur_data_size] = cur_window;
- data[cur_data_size + 1] = cur_window_max + 1;
- memcpy(data + cur_data_size + 2, cur_data, cur_window_max+1);
- cur_data_size += cur_window_max + 3;
- }
- cur_window++;
- cur_window_max = 0;
- memset(cur_data, 0, 32);
- }
- cur_data[i%32] = bitmap[i];
- if (bitmap[i] > 0) {
- cur_window_max = i%32;
- }
- }
- if (cur_window_max > 0 || cur_data[0] > 0) {
- /* this window has stuff, add it */
- data = LDNS_XREALLOC(data, uint8_t, cur_data_size + cur_window_max + 3);
- data[cur_data_size] = cur_window;
- data[cur_data_size + 1] = cur_window_max + 1;
- memcpy(data + cur_data_size + 2, cur_data, cur_window_max+1);
- cur_data_size += cur_window_max + 3;
+ type_list[type_count] = cur_type;
+ type_count++;
}
-
- *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_NSEC, cur_data_size, data);
+
+ *rd = ldns_dnssec_create_nsec_bitmap(type_list,
+ type_count,
+ LDNS_RR_TYPE_NSEC);
if(data)
LDNS_FREE(data);
if (token)