Testsuite: Fix fakens parser for A and AAAA RRs
[exim.git] / test / src / fakens.c
index a03f94a07414615bacdde0e5e7c85b75aa80a1e5..00f1f7d46f2c4c87690e78a038958144b3600b5f 100644 (file)
@@ -61,6 +61,9 @@ Any DNS record line in a zone file can be prefixed with "AA "
 if all the records found by a lookup are marked
 as such then the response will have the "AA" bit set.
 
+Any DNS record line in a zone file can be prefixed with "TTL=" and
+a number of seconds (followed by one space).
+
 */
 
 #include <ctype.h>
@@ -72,9 +75,11 @@ as such then the response will have the "AA" bit set.
 #include <errno.h>
 #include <signal.h>
 #include <arpa/nameser.h>
+#include <arpa/inet.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <dirent.h>
+#include <unistd.h>
 
 #define FALSE         0
 #define TRUE          1
@@ -105,6 +110,8 @@ typedef struct tlist {
   int value;
 } tlist;
 
+#define DEFAULT_TTL 3600U
+
 /* On some (older?) operating systems, the standard ns_t_xxx definitions are
 not available, and only the older T_xxx ones exist in nameser.h. If ns_t_a is
 not defined, assume we are in this state. A really old system might not even
@@ -347,6 +354,7 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
   BOOL rr_sec = FALSE;
   BOOL rr_aa = FALSE;
   int delay = 0;
+  uint ttl = DEFAULT_TTL;
 
   p = buffer;
   while (isspace(*p)) p++;
@@ -380,6 +388,12 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
       for (p += 6; *p >= '0' && *p <= '9'; p++) delay = delay*10 + *p - '0';
       if (isspace(*p)) p++;
       }
+    else if (Ustrncmp(p, US"TTL=", 4) == 0)     /* TTL for record */
+      {
+      ttl = 0;
+      for (p += 4; *p >= '0' && *p <= '9'; p++) ttl = ttl*10 + *p - '0';
+      if (isspace(*p)) p++;
+      }
     else
       break;
     }
@@ -459,7 +473,10 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
   *pk++ = 0;
   *pk++ = 1;     /* class = IN */
 
-  pk += 4;       /* TTL field; don't care */
+  *pk++ = (ttl >>24) & 255;
+  *pk++ = (ttl >>16) & 255;
+  *pk++ = (ttl >> 8) & 255;
+  *pk++ = ttl & 255;
 
   rdlptr = pk;   /* remember rdlength field */
   pk += 2;
@@ -485,35 +502,13 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
       break;
 
     case ns_t_a:
-      for (i = 0; i < 4; i++)
-        {
-        value = 0;
-        while (isdigit(*p)) value = value*10 + *p++ - '0';
-        *pk++ = value;
-        p++;
-        }
+      inet_pton(AF_INET, p, pk);                /* FIXME: error checking */
+      pk += 4;
       break;
 
-    /* The only occurrence of a double colon is for ::1 */
     case ns_t_aaaa:
-      if (Ustrcmp(p, "::1") == 0)
-        {
-        memset(pk, 0, 15);
-        pk += 15;
-        *pk++ = 1;
-        }
-      else for (i = 0; i < 8; i++)
-        {
-        value = 0;
-        while (isxdigit(*p))
-          {
-          value = value * 16 + toupper(*p) - (isdigit(*p)? '0' : '7');
-          p++;
-          }
-        *pk++ = (value >> 8) & 255;
-        *pk++ = value & 255;
-        p++;
-        }
+      inet_pton(AF_INET6, p, pk);               /* FIXME: error checking */
+      pk += 16;
       break;
 
     case ns_t_mx: