chiark / gitweb /
Implement SOA, RP, HINFO (but no mailbox quoting). Implement _finish.
[adns.git] / src / parse.c
index d516d24d081b1abcf7bde8f5accc84bd0031b1f4..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;
 }
@@ -111,7 +113,7 @@ adns_status adns__findlabel_next(findlabel_state *fls,
 }
 
 adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
-                              vbuf *vb, int flags,
+                              vbuf *vb, adns_queryflags flags,
                               const byte *dgram, int dglen, int *cbyte_io, int max) {
   findlabel_state fls;
   
@@ -127,7 +129,7 @@ adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
     if (!lablen) break;
     if (vb->used)
       if (!adns__vbuf_append(vb,".",1)) return adns_s_nolocalmem;
-    if (flags & adns_qf_anyquote) {
+    if (flags & pdf_quoteok) {
       if (!vbuf__append_quoted1035(vb,dgram+labstart,lablen))
        return adns_s_nolocalmem;
     } else {
@@ -146,24 +148,11 @@ adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
   return adns_s_ok;
 }
        
-static adns_status findrr_intern(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) {
-  /* Like adns__findrr_checked, except that the datagram to compare
-   * with can be specified explicitly.
-   *
-   * If the caller thinks they know what the owner of the RR ought to
-   * be they can pass in details in eo_*: this is another (or perhaps
-   * the same datagram), and a pointer to where the putative owner
-   * starts in that datagram.  In this case *eo_matched_r will be set
-   * to 1 if the datagram matched or 0 if it did not.  Either
-   * both eo_dgram and eo_matched_r must both be non-null, or they
-   * must both be null (in which case eo_dglen and eo_cbyte will be ignored).
-   * The eo datagram and contained owner domain MUST be valid and
-   * untruncated.
-   */
+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;
   
@@ -222,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_intern(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_intern(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_intern(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);
   }
 }