]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
final part of strings in txt rrs
authorJelte Jansen <jeltejan@NLnetLabs.nl>
Tue, 13 Sep 2005 13:09:46 +0000 (13:09 +0000)
committerJelte Jansen <jeltejan@NLnetLabs.nl>
Tue, 13 Sep 2005 13:09:46 +0000 (13:09 +0000)
parse.c
str2host.c

diff --git a/parse.c b/parse.c
index 3a8ab0d84bfad7375ee4def2fa6494f3c36a5cc4..1a7f61a02d55f497eab64db1875e16cf3a58603f 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -239,7 +239,7 @@ ldns_bget_all_keyword_data(ldns_buffer *b, const char *keyword, const char *k_de
 ssize_t
 ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit)
 {      
-       int c;
+       int c, lc;
        int p; /* 0 -> no parenthese seen, >0 nr of ( seen */
        int com;
        char *t;
@@ -259,6 +259,7 @@ ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit)
        i = 0;
        com = 0;
        t = token;
+       lc = 0;
        while ((c = ldns_bgetc(b)) != EOF) {
                if (c == '(') {
                        p++;
@@ -301,7 +302,7 @@ ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit)
 
                /* check if we hit the delim */
                for (d = del; *d; d++) {
-                        if (c == *d) {
+                        if (c == *d && lc != '\\') {
                                goto tokenread;
                         }
                }
@@ -312,6 +313,11 @@ ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit)
                        *t = '\0';
                        return -1;
                }
+
+               if (c == '\\' && lc == '\\') {
+                       lc = 0;
+               }
+               lc = c;
        }
        *t = '\0';
        if (i == 0) {
index 780680d3f124068dc44fccb48775abfb8edc10d0..60b1a741ef83c29752743399bf6d7d2ae0953f07 100644 (file)
@@ -267,15 +267,39 @@ ldns_status
 ldns_str2rdf_str(ldns_rdf **rd, const char *str)
 {
        uint8_t *data;
+       uint8_t val;
+       size_t i, str_i;
        
        if (strlen(str) > 255) {
                return LDNS_STATUS_INVALID_STR;
        }
 
        data = LDNS_XMALLOC(uint8_t, strlen(str) + 1);
-       data[0] = strlen(str);
-       memcpy(data + 1, str, strlen(str));
-       *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_STR, strlen(str) + 1, data);
+       i = 1;
+       for (str_i = 0; str_i < strlen(str); str_i++) {
+               if (str[str_i] == '\\') {
+                       if(str_i + 3 < strlen(str) && 
+                          isdigit(str[str_i + 1]) &&
+                          isdigit(str[str_i + 2]) &&
+                          isdigit(str[str_i + 3])) {
+                               val = (uint8_t) ldns_hexdigit_to_int((char) str[str_i + 1]) * 100 +
+                                               ldns_hexdigit_to_int((char) str[str_i + 2]) * 10 +
+                                               ldns_hexdigit_to_int((char) str[str_i + 3]);
+                               data[i] = val;
+                               i++;
+                               str_i += 3;
+                       } else {
+                               str_i++;
+                               data[i] = str[str_i];
+                               i++;
+                       }
+               } else {
+                       data[i] = str[str_i];
+                       i++;
+               }
+       }
+       data[0] = i - 1;
+       *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_STR, i, data);
        LDNS_FREE(data);
        return LDNS_STATUS_OK;
 }