chiark / gitweb /
Can get addresses from Additional and Authority sections, and return
[adns.git] / src / parse.c
index 46d76fa29c1858570b6dcdd0d051bd782d44e9d8..f2521d66ffcfad4d2b8d7ff6f99d1b69255623e6 100644 (file)
@@ -111,7 +111,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,15 +127,16 @@ 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 {
-      if (!ctype_alpha(dgram[labstart])) return adns_s_invaliddomain;
+      ch= dgram[labstart];
+      if (!ctype_alpha(ch) && !ctype_digit(ch)) return adns_s_invalidanswerdomain;
       for (i= labstart+1; i<labstart+lablen; i++) {
        ch= dgram[i];
        if (ch != '-' && !ctype_alpha(ch) && !ctype_digit(ch))
-         return adns_s_invaliddomain;
+         return adns_s_invalidanswerdomain;
       }
       if (!adns__vbuf_append(vb,dgram+labstart,lablen))
        return adns_s_nolocalmem;
@@ -145,24 +146,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;
   
@@ -221,21 +209,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);
   }
 }