chiark / gitweb /
reverse parsing: Clearer algorithm
[adns.git] / src / internal.h
index 0b39418..24c5c82 100644 (file)
@@ -39,6 +39,7 @@ typedef unsigned char byte;
 #include <errno.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stdbool.h>
 
 #include <sys/time.h>
 
@@ -69,9 +70,6 @@ typedef unsigned char byte;
 #define DNS_IDOFFSET 0
 #define DNS_CLASS_IN 1
 
-#define DNS_INADDR_ARPA "in-addr", "arpa"
-#define DNS_IP6_ARPA "ip6", "arpa"
-
 #define MAX_POLLFDS  ADNS_POLLFDS_RECOMMENDED
 
 /* Some preprocessor hackery */
@@ -131,10 +129,10 @@ typedef struct {
   struct timeval now;
 } parseinfo;
 
-#define NREVDOMAINS 2                  /* keep in sync with addrfam! */
+#define MAXREVLABELS 34                /* keep in sync with addrfam! */
 struct revparse_state {
-  unsigned map;                                /* which domains are still live */
-  byte ipv[NREVDOMAINS][32];           /* address components so far */
+  uint16_t labstart[MAXREVLABELS];
+  uint8_t lablen[MAXREVLABELS];
 };
 
 union checklabel_state {
@@ -198,7 +196,8 @@ typedef struct typeinfo {
 
   adns_status (*checklabel)(adns_state ads, adns_queryflags flags,
                            union checklabel_state *cls, qcontext *ctx,
-                           int labnum, const char *label, int lablen);
+                           int labnum, const char *dgram,
+                           int labstart, int lablen);
   /* Check a label from the query domain string.  The label is not
    * necessarily null-terminated.  The hook can refuse the query's submission
    * by returning a nonzero status.  State can be stored in *cls between
@@ -230,7 +229,7 @@ typedef struct typeinfo {
 adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags,
                               union checklabel_state *cls,
                               qcontext *ctx, int labnum,
-                              const char *label, int lablen);
+                              const char *dgram, int labstart, int lablen);
   /* implemented in query.c, used by types.c as default
    * and as part of implementation for some fancier types
    * doesn't require any state */
@@ -470,24 +469,26 @@ extern int adns__make_reverse_domain(const struct sockaddr *sa,
  * allocate an output buffer failed.
  */
 
-extern int adns__revparse_label(struct revparse_state *rps, int labnum,
-                               const char *label, int lablen);
+extern bool adns__revparse_label(struct revparse_state *rps, int labnum,
+                                const char *dgram,
+                                int labstart, int lablen);
 /* Parse a label in a reverse-domain name, given its index labnum (starting
  * from zero), a pointer to its contents (which need not be null-terminated),
  * and its length.  The state in *rps is initialized implicitly when labnum
  * is zero.
  *
- * Returns zero if the parse was successful, nonzero if the domain name is
- * definitely invalid and the parse must be abandoned.
+ * Returns 1 if the parse is proceeding successfully, 0 if the domain
+ * name is definitely invalid and the parse must be abandoned.
  */
 
-extern int adns__revparse_done(struct revparse_state *rps, int nlabels,
-                              adns_rrtype *rrtype_r, adns_sockaddr *addr_r);
+extern bool adns__revparse_done(struct revparse_state *rps,
+                               const char *dgram, int nlabels,
+                               adns_rrtype *rrtype_r, adns_sockaddr *addr_r);
 /* Finishes parsing a reverse-domain name, given the total number of
  * labels in the name.  On success, fills in the af and protocol
  * address in *addr_r, and the forward query type in *rrtype_r
- * (because that turns out to be useful).  Returns nonzero if the
- * parse must be abandoned.
+ * (because that turns out to be useful).  Returns 1 if the parse
+ * was successful.
  */
 
 /* From setup.c: */
@@ -865,6 +866,8 @@ void adns__update_expires(adns_query qu, unsigned long ttl,
 
 int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len);
 
+bool adns__labels_equal(const byte *a, int al, const byte *b, int bl);
+
 /* From event.c: */
 
 void adns__tcp_broken(adns_state ads, const char *what, const char *why);
@@ -913,6 +916,9 @@ static inline int ctype_digit(int c) { return c>='0' && c<='9'; }
 static inline int ctype_alpha(int c) {
   return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
 }
+static inline int ctype_toupper(int c) {
+  return ctype_alpha(c) ? (c & ~32) : c;
+}
 static inline int ctype_822special(int c) {
   return strchr("()<>@,;:\\\".[]",c) != 0;
 }