]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
NSEC str2host
authorJelte Jansen <jeltejan@NLnetLabs.nl>
Thu, 8 Sep 2005 13:17:27 +0000 (13:17 +0000)
committerJelte Jansen <jeltejan@NLnetLabs.nl>
Thu, 8 Sep 2005 13:17:27 +0000 (13:17 +0000)
rr.c
str2host.c

diff --git a/rr.c b/rr.c
index 83201e6c8b06e78717f22bcfcdd7ff5d2c3d594e..03190369fd46bfe6db9a3fc4afd3d10e8204ebc9 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -314,6 +314,7 @@ ldns_rr_new_frm_str(const char *str, uint16_t default_ttl, ldns_rdf *origin)
                                if (ldns_rr_descriptor_field_type(desc, r_cnt) == LDNS_RDF_TYPE_B64 ||
                                    ldns_rr_descriptor_field_type(desc, r_cnt) == LDNS_RDF_TYPE_LOC ||
                                    ldns_rr_descriptor_field_type(desc, r_cnt) == LDNS_RDF_TYPE_WKS ||
+                                   ldns_rr_descriptor_field_type(desc, r_cnt) == LDNS_RDF_TYPE_NSEC ||
                                    ldns_rr_descriptor_field_type(desc, r_cnt) == LDNS_RDF_TYPE_STR
                                    ) {
                                        delimiters = "\n\t";
index e9fa574041625567c9bd196492bbd46769df9fbe..3c56a33577b00faa0bf517b3ec91dd4d5c76fe28 100644 (file)
@@ -430,9 +430,69 @@ ldns_str2rdf_hex(ldns_rdf **rd, const char *str)
 ldns_status
 ldns_str2rdf_nsec(ldns_rdf **rd, const char *str)
 {
-       rd = rd;
-       str = str;
-       return LDNS_STATUS_NOT_IMPL;
+       const char *delimiters = "\n\t ";
+       char token[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;
+       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);
+               } else {
+                       cur_data[i%32] = bitmap[i];
+                       if (bitmap[i] > 0) {
+                               cur_window_max = i%32;
+                       }
+               }
+       }
+       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;
+       }
+
+       *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_NSEC, cur_data_size, data);
+       return LDNS_STATUS_OK;
 }
 
 ldns_status