X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=checkalias.c;h=1e1d16339fe033fc082154c494d78f15b830e512;hb=53293ee30678d3db753e51820cc554c0b2b1bd97;hp=8214b40a5fec0ae2ae228539a299bb4ad0296b7a;hpb=9dc0b8bd674f71f8ee422b037dc409f2dd4f9487;p=~andy%2Ffetchmail diff --git a/checkalias.c b/checkalias.c index 8214b40a..1e1d1633 100644 --- a/checkalias.c +++ b/checkalias.c @@ -28,6 +28,7 @@ typedef unsigned char address_t[sizeof (struct in_addr)]; +#ifdef HAVE_RES_SEARCH static int getaddresses(struct addrinfo **result, const char *name) { struct addrinfo hints; @@ -36,7 +37,7 @@ static int getaddresses(struct addrinfo **result, const char *name) hints.ai_socktype=SOCK_STREAM; hints.ai_protocol=PF_UNSPEC; hints.ai_family=AF_UNSPEC; - return getaddrinfo(name, NULL, &hints, result); + return fm_getaddrinfo(name, NULL, &hints, result); } /* XXX FIXME: doesn't detect if an IPv6-mapped IPv4 address @@ -77,20 +78,23 @@ static int is_ip_alias(const char *name1,const char *name2) found: if (res2) - freeaddrinfo(res2); + fm_freeaddrinfo(res2); if (res1) - freeaddrinfo(res1); + fm_freeaddrinfo(res1); return rc; } +#endif -int is_host_alias(const char *name, struct query *ctl) +int is_host_alias(const char *name, struct query *ctl, struct addrinfo **res) /* determine whether name is a DNS alias of the mailserver for this query */ { +#ifdef HAVE_RES_SEARCH struct mxentry *mxp, *mxrecords; + int e; + struct addrinfo hints, *res_st; +#endif struct idlist *idl; size_t namelen; - int e; - struct addrinfo hints, *res, *res_st; struct hostdata *lead_server = ctl->server.lead_server ? ctl->server.lead_server : &ctl->server; @@ -125,7 +129,7 @@ int is_host_alias(const char *name, struct query *ctl) namelen = strlen(name); for (idl = lead_server->akalist; idl; idl = idl->next) { - char *ep; + const char *ep; /* * Test is >= here because str_in_list() should have caught the @@ -134,7 +138,7 @@ int is_host_alias(const char *name, struct query *ctl) */ if (strlen(idl->id) >= namelen) continue; - ep = (char *)name + (namelen - strlen(idl->id)); + ep = name + (namelen - strlen(idl->id)); /* a suffix led by . must match */ if (ep[-1] == '.' && !strcasecmp(ep, idl->id)) return(TRUE); @@ -143,6 +147,7 @@ int is_host_alias(const char *name, struct query *ctl) if (!ctl->server.dns) return(FALSE); #ifndef HAVE_RES_SEARCH + (void)res; return(FALSE); #else /* @@ -160,16 +165,16 @@ int is_host_alias(const char *name, struct query *ctl) hints.ai_socktype=SOCK_STREAM; hints.ai_flags=AI_CANONNAME; - e = getaddrinfo(name, NULL, &hints, &res); + e = fm_getaddrinfo(name, NULL, &hints, res); if (e == 0) { - int rr = (strcasecmp(ctl->server.truename, res->ai_canonname) == 0); - freeaddrinfo(res); + int rr = (strcasecmp(ctl->server.truename, (*res)->ai_canonname) == 0); + fm_freeaddrinfo(*res); *res = NULL; if (rr) goto match; - else if (ctl->server.checkalias && 0 == getaddrinfo(ctl->server.truename, NULL, &hints, &res_st)) + else if (ctl->server.checkalias && 0 == fm_getaddrinfo(ctl->server.truename, NULL, &hints, &res_st)) { - freeaddrinfo(res_st); + fm_freeaddrinfo(res_st); if (outlevel >= O_DEBUG) report(stdout, GT_("Checking if %s is really the same node as %s\n"),ctl->server.truename,name); if (is_ip_alias(ctl->server.truename,name) == TRUE) @@ -189,6 +194,15 @@ int is_host_alias(const char *name, struct query *ctl) switch (e) { case EAI_NONAME: /* specified host is unknown */ +#ifdef EAI_NODATA + /* EAI_NODATA was in the older RFC-2553, but that got + * obsoleted by RFC-3493 - there, EAI_NODATA is no longer + * valid, and modern operating systems no longer issue this + * error code. libesmtp/getaddrinfo.?, however, still does. + * (This was reported to Brian Stafford 2013-02-03.) + */ + case EAI_NODATA: /* specified host is unknown */ +#endif break; default: