Add "continue" modifier.
[users/jgh/exim.git] / test / src / fakens.c
index 9ab7b7e2d551fa7ceb409c1fda0c453e82b88443..9c561653d883bb8c3866e7087d32e5b48fd71d8d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/test/src/fakens.c,v 1.1 2006/02/06 16:24:05 ph10 Exp $ */
+/* $Cambridge: exim/test/src/fakens.c,v 1.3 2006/11/07 14:13:19 ph10 Exp $ */
 
 /*************************************************
 *       fakens - A Fake Nameserver Program       *
 
 /*************************************************
 *       fakens - A Fake Nameserver Program       *
@@ -81,12 +81,6 @@ typedef unsigned char uschar;
 #define Ustrncmp(s,t,n)    strncmp(CCS(s),CCS(t),n)
 #define Ustrncpy(s,t,n)    strncpy(CS(s),CCS(t),n)
 
 #define Ustrncmp(s,t,n)    strncmp(CCS(s),CCS(t),n)
 #define Ustrncpy(s,t,n)    strncpy(CS(s),CCS(t),n)
 
-
-typedef struct adomainstr {
-  struct adomainstr *next;
-  uschar name[1];
-} adomainstr;
-
 typedef struct zoneitem {
   uschar *zone;
   uschar *zonefile;
 typedef struct zoneitem {
   uschar *zone;
   uschar *zonefile;
@@ -210,7 +204,6 @@ Arguments:
   qtypelen    the length of qtype
   pkptr       points to the output buffer pointer; this is updated
   countptr    points to the record count; this is updated
   qtypelen    the length of qtype
   pkptr       points to the output buffer pointer; this is updated
   countptr    points to the record count; this is updated
-  adomainptr  points to where to hang additional domains
 
 Returns:      0 on success, else HOST_NOT_FOUND or NO_DATA or NO_RECOVERY or
               PASS_ON - the latter if a "PASS ON NOT FOUND" line is seen
 
 Returns:      0 on success, else HOST_NOT_FOUND or NO_DATA or NO_RECOVERY or
               PASS_ON - the latter if a "PASS ON NOT FOUND" line is seen
@@ -218,16 +211,16 @@ Returns:      0 on success, else HOST_NOT_FOUND or NO_DATA or NO_RECOVERY or
 
 static int
 find_records(FILE *f, uschar *zone, uschar *domain, uschar *qtype,
 
 static int
 find_records(FILE *f, uschar *zone, uschar *domain, uschar *qtype,
-  int qtypelen, uschar **pkptr, int *countptr, adomainstr **adomainptr)
+  int qtypelen, uschar **pkptr, int *countptr)
 {
 int yield = HOST_NOT_FOUND;
 {
 int yield = HOST_NOT_FOUND;
-int zonelen = Ustrlen(zone);
 int domainlen = Ustrlen(domain);
 BOOL pass_on_not_found = FALSE;
 tlist *typeptr;
 uschar *pk = *pkptr;
 uschar buffer[256];
 uschar rrdomain[256];
 int domainlen = Ustrlen(domain);
 BOOL pass_on_not_found = FALSE;
 tlist *typeptr;
 uschar *pk = *pkptr;
 uschar buffer[256];
 uschar rrdomain[256];
+uschar RRdomain[256];
 
 /* Decode the required type */
 
 
 /* Decode the required type */
 
@@ -271,8 +264,22 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
   if (!isspace(*p))
     {
     uschar *pp = rrdomain;
   if (!isspace(*p))
     {
     uschar *pp = rrdomain;
-    while (!isspace(*p)) *pp++ = tolower(*p++);
-    if (pp[-1] != '.') Ustrcpy(pp, zone); else pp[-1] = 0;
+    uschar *PP = RRdomain;
+    while (!isspace(*p))
+      {
+      *pp++ = tolower(*p);
+      *PP++ = *p++;
+      }
+    if (pp[-1] != '.')
+      {
+      Ustrcpy(pp, zone);
+      Ustrcpy(PP, zone);
+      }
+    else
+      {
+      pp[-1] = 0;
+      PP[-1] = 0;
+      }
     }
 
   /* Compare domain names; first check for a wildcard */
     }
 
   /* Compare domain names; first check for a wildcard */
@@ -312,7 +319,10 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
   p += qtlen;
   while (isspace(*p)) p++;
 
   p += qtlen;
   while (isspace(*p)) p++;
 
-  pk = packname(domain, pk);            /* Not rrdomain because of wildcard */
+  /* For a wildcard record, use the search name; otherwise use the record's
+  name in its original case because it might contain upper case letters. */
+
+  pk = packname((rrdomain[0] == '*')? domain : RRdomain, pk);
   *pk++ = (tvalue >> 8) & 255;
   *pk++ = (tvalue) & 255;
   *pk++ = 0;
   *pk++ = (tvalue >> 8) & 255;
   *pk++ = (tvalue) & 255;
   *pk++ = 0;
@@ -368,7 +378,10 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
     while (isspace(*p)) p++;
     *pk++ = (value >> 8) & 255;
     *pk++ = value & 255;
     while (isspace(*p)) p++;
     *pk++ = (value >> 8) & 255;
     *pk++ = value & 255;
-    goto PACKNAME;
+    if (ep[-1] != '.') sprintf(ep, "%s.", zone);
+    pk = packname(p, pk);
+    plen = Ustrlen(p);
+    break;
 
     case ns_t_txt:
     pp = pk++;
 
     case ns_t_txt:
     pp = pk++;
@@ -392,20 +405,9 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
     case ns_t_cname:
     case ns_t_ns:
     case ns_t_ptr:
     case ns_t_cname:
     case ns_t_ns:
     case ns_t_ptr:
-    PACKNAME:
     if (ep[-1] != '.') sprintf(ep, "%s.", zone);
     pk = packname(p, pk);
     plen = Ustrlen(p);
     if (ep[-1] != '.') sprintf(ep, "%s.", zone);
     pk = packname(p, pk);
     plen = Ustrlen(p);
-    if (adomainptr != NULL && plen > zonelen + 2 &&
-        Ustrncmp(p + plen - zonelen - 1, zone, zonelen) == 0)
-      {
-      adomainstr *adomain = (adomainstr *)malloc(sizeof(adomainstr) + plen);
-      *adomainptr = adomain;
-      adomainptr = &(adomain->next);
-      adomain->next = NULL;
-      Ustrncpy(adomain->name, p, plen - 1);
-      adomain->name[plen-1] = 0;
-      }
     break;
     }
 
     break;
     }
 
@@ -413,18 +415,6 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
 
   rdlptr[0] = ((pk - rdlptr - 2) >> 8) & 255;
   rdlptr[1] = (pk -rdlptr - 2) & 255;
 
   rdlptr[0] = ((pk - rdlptr - 2) >> 8) & 255;
   rdlptr[1] = (pk -rdlptr - 2) & 255;
-
-  /* If we have just yielded a CNAME, we must change the domain name to the
-  new domain, and re-start the scan from the beginning. */
-
-  if (found_cname)
-    {
-    domain = fcopystring("%s", p);
-    domainlen = Ustrlen(domain);
-    domain[domainlen - 1] = 0;       /* Removed trailing dot */
-    rrdomain[0] = 0;                 /* No previous domain */
-    (void)fseek(f, 0, SEEK_SET);     /* Start again at the beginning */
-    }
   }
 
 *pkptr = pk;
   }
 
 *pkptr = pk;
@@ -442,13 +432,11 @@ main(int argc, char **argv)
 {
 FILE *f;
 DIR *d;
 {
 FILE *f;
 DIR *d;
-int dirlen, domlen, qtypelen;
+int domlen, qtypelen;
 int yield, count;
 int i;
 int zonecount = 0;
 int yield, count;
 int i;
 int zonecount = 0;
-tlist *typeptr;
 struct dirent *de;
 struct dirent *de;
-adomainstr *adomain = NULL;
 zoneitem zones[32];
 uschar *qualify = NULL;
 uschar *p, *zone;
 zoneitem zones[32];
 uschar *qualify = NULL;
 uschar *p, *zone;
@@ -559,23 +547,17 @@ if (f == NULL)
 /* Find the records we want, and add them to the result. */
 
 count = 0;
 /* Find the records we want, and add them to the result. */
 
 count = 0;
-yield = find_records(f, zone, domain, qtype, qtypelen, &pk, &count, &adomain);
+yield = find_records(f, zone, domain, qtype, qtypelen, &pk, &count);
 if (yield == NO_RECOVERY) goto END_OFF;
 
 packet[6] = (count >> 8) & 255;
 packet[7] = count & 255;
 
 if (yield == NO_RECOVERY) goto END_OFF;
 
 packet[6] = (count >> 8) & 255;
 packet[7] = count & 255;
 
-/* Search for additional records and add them to the result. */
-
-count = 0;
-for (; adomain != NULL; adomain = adomain->next)
-  {
-  (void)find_records(f, zone, adomain->name, US"AAAA", 4, &pk, &count, NULL);
-  (void)find_records(f, zone, adomain->name, US"A", 1, &pk, &count, NULL);
-  }
+/* There is no need to return any additional records because Exim no longer
+(from release 4.61) makes any use of them. */
 
 
-packet[10] = (count >> 8) & 255;
-packet[11] = count & 255;
+packet[10] = 0;
+packet[11] = 0;
 
 /* Close the zone file, write the result, and return. */
 
 
 /* Close the zone file, write the result, and return. */