--- sendmail-8.12.6-orig/sendmail/domain.c Thu Jun 27 12:55:04 2002 +++ sendmail-8.12.6/sendmail/domain.c Sun Nov 24 23:59:34 2002 @@ -79,6 +79,7 @@ static char *gethostalias __P((char *)); static int mxrand __P((char *)); static int fallbackmxrr __P((int, unsigned short *, char **)); +static int mxaddrinclassw __P((char *)); /* ** GETFALLBACKMXRR -- get MX resource records for fallback MX host. @@ -376,7 +377,8 @@ continue; } # endif /* 0 */ - if (wordinclass(bp, 'w')) + /* JMHACK: Insert if wordinclass w from A records lookup of bp */ + if (wordinclass(bp, 'w') || mxaddrinclassw(bp) ) { if (tTd(8, 3)) sm_dprintf("found localhost (%s) in MX list, pref=%d\n", @@ -1245,4 +1247,107 @@ (void) sm_strlcpy(hbuf, host, sizeof hbuf); return hbuf; } + + + +/* +** Check if a host's numerical address is in class w +** Parameters: +** - char * host +** Return: +** - negative int on fail +** - positive int on match +** - zero means nothing happened +** +*/ + +int +mxaddrinclassw(host) + char * host; +{ + int i = 0; + int ret_code = 0; + struct hostent * h = NULL; +#ifdef NETINET + struct in_addr ia; +#endif /* NETINET */ +#ifdef NETINET6 + struct in6_addr ia6; + char addrbuf[INET6_ADDRSTRLEN]; + char addrbuf2[INET6_ADDRSTRLEN+2]; +#else + char addrbuf[INET_ADDRSTRLEN]; + char addrbuf2[INET_ADDRSTRLEN+2]; +#endif /* NETINET6 */ + + +#ifdef NETINET + SM_SET_H_ERRNO(0); + errno = 0; + h = sm_gethostbyname(host, AF_INET); + if (h == NULL) + { + ret_code = -1; + } + else + { + + while(h->h_addr_list[i]) + { + memcpy( &ia, h->h_addr_list[i], h->h_length); + inet_ntop( AF_INET6, &ia , addrbuf, sizeof(addrbuf) ); + *(addrbuf2) = HOSTBEGIN; + *(addrbuf2+1) = '\0'; + sm_strlcat( addrbuf2, addrbuf , sizeof(addrbuf2) ); + *(addrbuf) = HOSTEND; + *(addrbuf+1) = '\0'; + sm_strlcat( addrbuf2, addrbuf , sizeof(addrbuf2) ); + ret_code = wordinclass(addrbuf2, 'w'); + i++; + + } + goto punt; + + + } +#endif /* NETINET */ +# if NETINET6 + SM_SET_H_ERRNO(0); + errno = 0; + h = sm_gethostbyname(host, AF_INET6); + if (h == NULL) + { + ret_code = -1; + goto punt; + } + else + { + while(h->h_addr_list[i]) + { + + memcpy( &ia6, h->h_addr_list[i], h->h_length); + inet_ntop( AF_INET6, &ia6, addrbuf, sizeof(addrbuf) ); + *(addrbuf2)= HOSTBEGIN; + *(addrbuf2+1) = '\0'; + sm_strlcat( addrbuf2, addrbuf , sizeof(addrbuf2) ); + *(addrbuf) = HOSTEND; + *(addrbuf+1) = '\0'; + sm_strlcat( addrbuf2, addrbuf , sizeof(addrbuf2) ); + ret_code = wordinclass(addrbuf2, 'w'); + i++; + } + goto punt; + + } + + +#endif /* NETINET6 */ +punt: + + return(ret_code); + + +} + + #endif /* NAMED_BIND */