Testsuite: move manyhome.test,ex handling from exim to fakens
[users/heiko/exim.git] / test / src / fakens.c
index fc7848e77e146a1c2349bf496a57d9b8d035d79f..d82dd7cbb7a2a51265710f1854e30a8c4cceeef6 100644 (file)
@@ -7,8 +7,8 @@ avoids the need to install special zones in a real nameserver. When Exim is
 running in its (new) test harness, DNS lookups are first passed to this program
 instead of to the real resolver. (With a few exceptions - see the discussion in
 the test suite's README file.) The program is also passed the name of the Exim
-spool directory; it expects to find its "zone files" in ../dnszones relative to
-that directory. Note that there is little checking in this program. The fake
+spool directory; it expects to find its "zone files" in dnszones relative to
+exim config_main_directory. Note that there is little checking in this program. The fake
 zone files are assumed to be syntactically valid.
 
 The zones that are handled are found by scanning the dnszones directory. A file
@@ -354,21 +354,20 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
 
   p = buffer;
   for (;;)
-       {
-       if (Ustrncmp(p, US"DNSSEC ", 7) == 0)   /* tagged as secure */
-         {
-         rr_sec = TRUE;
-         p += 7;
-         }
-       else if (Ustrncmp(p, US"DELAY=", 6) == 0)       /* delay beforee response */
-         {
-         for (p += 6; *p >= '0' && *p <= '9'; p++)
-               delay = delay*10 + *p - '0';
-         while (isspace(*p)) p++;
-         }
-       else
-         break;
-       }
+    {
+    if (Ustrncmp(p, US"DNSSEC ", 7) == 0)      /* tagged as secure */
+      {
+      rr_sec = TRUE;
+      p += 7;
+      }
+    else if (Ustrncmp(p, US"DELAY=", 6) == 0)  /* delay before response */
+      {
+      for (p += 6; *p >= '0' && *p <= '9'; p++) delay = delay*10 + *p - '0';
+      while (isspace(*p)) p++;
+      }
+    else
+      break;
+    }
 
   if (!isspace(*p))
     {
@@ -587,7 +586,7 @@ uschar *zonefile = NULL;
 uschar domain[256];
 uschar buffer[256];
 uschar qtype[12];
-uschar packet[512];
+uschar packet[2048 * 32 + 32];
 uschar *pk = packet;
 BOOL dnssec;
 
@@ -601,7 +600,7 @@ if (argc != 4)
 
 /* Find the zones */
 
-(void)sprintf(CS buffer, "%s/../dnszones", argv[1]);
+(void)sprintf(CS buffer, "%s/dnszones", argv[1]);
 
 d = opendir(CCS buffer);
 if (d == NULL)
@@ -636,7 +635,8 @@ Ustrncpy(qtype, argv[3], sizeof(qtype));
 qtypelen = Ustrlen(qtype);
 for (p = qtype; *p != 0; p++) *p = toupper(*p);
 
-/* Find the domain, lower case it, check that it is in a zone that we handle,
+/* Find the domain, lower case it, deal with any specials,
+check that it is in a zone that we handle,
 and set up the zone file name. The zone names in the table all start with a
 dot. */
 
@@ -646,6 +646,41 @@ Ustrncpy(domain, argv[2], domlen);
 domain[domlen] = 0;
 for (i = 0; i < domlen; i++) domain[i] = tolower(domain[i]);
 
+if (Ustrcmp(domain, "manyhome.test.ex") == 0 && Ustrcmp(qtype, "A") == 0)
+  {
+  uschar *pk = packet + 12;
+  uschar *rdlptr;
+  int i, j;
+
+  memset(packet, 0, 12);
+
+  for (i = 104; i <= 111; i++) for (j = 0; j <= 255; j++)
+    {
+    pk = packname(domain, pk);
+    *pk++ = (ns_t_a >> 8) & 255;
+    *pk++ = (ns_t_a) & 255;
+    *pk++ = 0;
+    *pk++ = 1;     /* class = IN */
+    pk += 4;       /* TTL field; don't care */
+    rdlptr = pk;   /* remember rdlength field */
+    pk += 2;
+
+    *pk++ = 10; *pk++ = 250; *pk++ = i; *pk++ = j;
+
+    rdlptr[0] = ((pk - rdlptr - 2) >> 8) & 255;
+    rdlptr[1] = (pk - rdlptr - 2) & 255;
+    }
+
+  packet[6] = (2048 >> 8) & 255;
+  packet[7] = 2048 & 255;
+  packet[10] = 0;
+  packet[11] = 0;
+
+  (void)fwrite(packet, 1, pk - packet, stdout);
+  return 0;
+  }
+
+
 if (Ustrchr(domain, '.') == NULL && qualify != NULL &&
     Ustrcmp(domain, "dontqualify") != 0)
   {
@@ -672,7 +707,7 @@ if (zonefile == NULL)
   return PASS_ON;
   }
 
-(void)sprintf(CS buffer, "%s/../dnszones/%s", argv[1], zonefile);
+(void)sprintf(CS buffer, "%s/dnszones/%s", argv[1], zonefile);
 
 /* Initialize the start of the response packet. We don't have to fake up
 everything, because we know that Exim will look only at the answer and