chiark / gitweb /
Implement SOA, RP, HINFO (but no mailbox quoting). Implement _finish.
[adns.git] / src / parse.c
index bb088832b710a86bb26e8ace6d7d1257d40a8af3..388d09a6d771a30dbe12275bb7084859545d6278 100644 (file)
@@ -31,7 +31,7 @@ int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len) {
     for (i=0; i<len; i++) {
       ch= buf[i];
       if (ch == '.' || ch == '"' || ch == '(' || ch == ')' ||
-         ch == '@' || ch == ';' || ch == '$') {
+         ch == '@' || ch == ';' || ch == '$' || ch == '\\') {
        sprintf(qbuf,"\\%c",ch);
        break;
       } else if (ch <= ' ' || ch >= 127) {
@@ -41,7 +41,9 @@ int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len) {
     }
     if (!adns__vbuf_append(vb,buf,i) || !adns__vbuf_append(vb,qbuf,strlen(qbuf)))
       return 0;
-    buf+= i; len-= i;
+    if (i<len) i++;
+    buf+= i;
+    len-= i;
   }
   return 1;
 }
@@ -146,11 +148,11 @@ adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
   return adns_s_ok;
 }
        
-static adns_status findrr_anychk(adns_query qu, int serv,
-                                const byte *dgram, int dglen, int *cbyte_io,
-                                int *type_r, int *class_r, int *rdlen_r, int *rdstart_r,
-                                const byte *eo_dgram, int eo_dglen, int eo_cbyte,
-                                int *eo_matched_r) {
+adns_status adns__findrr_anychk(adns_query qu, int serv,
+                               const byte *dgram, int dglen, int *cbyte_io,
+                               int *type_r, int *class_r, int *rdlen_r, int *rdstart_r,
+                               const byte *eo_dgram, int eo_dglen, int eo_cbyte,
+                               int *eo_matched_r) {
   findlabel_state fls, eo_fls;
   int cbyte;
   
@@ -209,21 +211,21 @@ adns_status adns__findrr(adns_query qu, int serv,
                         int *type_r, int *class_r, int *rdlen_r, int *rdstart_r,
                         int *ownermatchedquery_r) {
   if (!ownermatchedquery_r) {
-    return findrr_anychk(qu,serv,
-                        dgram,dglen,cbyte_io,
-                        type_r,class_r,rdlen_r,rdstart_r,
-                        0,0,0, 0);
+    return adns__findrr_anychk(qu,serv,
+                              dgram,dglen,cbyte_io,
+                              type_r,class_r,rdlen_r,rdstart_r,
+                              0,0,0, 0);
   } else if (!qu->cname_dgram) {
-    return findrr_anychk(qu,serv,
-                        dgram,dglen,cbyte_io,
-                        type_r,class_r,rdlen_r,rdstart_r,
-                        qu->query_dgram,qu->query_dglen,DNS_HDRSIZE,
-                        ownermatchedquery_r);
+    return adns__findrr_anychk(qu,serv,
+                              dgram,dglen,cbyte_io,
+                              type_r,class_r,rdlen_r,rdstart_r,
+                              qu->query_dgram,qu->query_dglen,DNS_HDRSIZE,
+                              ownermatchedquery_r);
   } else {
-    return findrr_anychk(qu,serv,
-                        dgram,dglen,cbyte_io,
-                        type_r,class_r,rdlen_r,rdstart_r,
-                        qu->cname_dgram,qu->cname_dglen,qu->cname_begin,
-                        ownermatchedquery_r);
+    return adns__findrr_anychk(qu,serv,
+                              dgram,dglen,cbyte_io,
+                              type_r,class_r,rdlen_r,rdstart_r,
+                              qu->cname_dgram,qu->cname_dglen,qu->cname_begin,
+                              ownermatchedquery_r);
   }
 }