X-Git-Url: https://git.exim.org/users/jgh/exim.git/blobdiff_plain/c55a77db55ebf46a399f136eeb3a928b1e862772..refs/heads/dbmjz:/test/src/fakens.c diff --git a/test/src/fakens.c b/test/src/fakens.c index 9ab7b7e2d..fa4431810 100644 --- a/test/src/fakens.c +++ b/test/src/fakens.c @@ -1,5 +1,3 @@ -/* $Cambridge: exim/test/src/fakens.c,v 1.1 2006/02/06 16:24:05 ph10 Exp $ */ - /************************************************* * fakens - A Fake Nameserver Program * *************************************************/ @@ -81,12 +79,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) - -typedef struct adomainstr { - struct adomainstr *next; - uschar name[1]; -} adomainstr; - typedef struct zoneitem { uschar *zone; uschar *zonefile; @@ -210,7 +202,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 - 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 @@ -218,16 +209,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, - int qtypelen, uschar **pkptr, int *countptr, adomainstr **adomainptr) + int qtypelen, uschar **pkptr, int *countptr) { 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]; +uschar RRdomain[256]; /* Decode the required type */ @@ -271,8 +262,22 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL) 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 */ @@ -312,7 +317,10 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL) 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; @@ -368,7 +376,10 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL) 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++; @@ -392,20 +403,9 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL) 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 (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; } @@ -413,18 +413,6 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL) 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; @@ -442,13 +430,11 @@ main(int argc, char **argv) { FILE *f; DIR *d; -int dirlen, domlen, qtypelen; +int domlen, qtypelen; int yield, count; int i; int zonecount = 0; -tlist *typeptr; struct dirent *de; -adomainstr *adomain = NULL; zoneitem zones[32]; uschar *qualify = NULL; uschar *p, *zone; @@ -559,23 +545,17 @@ if (f == NULL) /* 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; -/* 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. */