X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=checkalias.c;h=5b8b67445cce178c75dc80a6407bfeaefc101639;hb=0a08619fa7ff51777b62719a6cceac9828b13556;hp=3c8a6e6bb6c42774c71fc8867ee74c2419dbb33a;hpb=ee409a69c7f931c02aac69553c92817dfa7951db;p=~andy%2Ffetchmail diff --git a/checkalias.c b/checkalias.c index 3c8a6e6b..5b8b6744 100644 --- a/checkalias.c +++ b/checkalias.c @@ -10,9 +10,15 @@ #include #include #include +#ifdef HAVE_NET_SOCKET_H +#include +#else #include +#endif #include +#ifdef HAVE_ARPA_INET_H #include +#endif #include #include "i18n.h" #include "mx.h" @@ -90,6 +96,8 @@ int is_host_alias(const char *name, struct query *ctl) { struct hostent *he,*he_st; struct mxentry *mxp, *mxrecords; + struct idlist *idl; + int namelen; struct hostdata *lead_server = ctl->server.lead_server ? ctl->server.lead_server : &ctl->server; @@ -118,6 +126,29 @@ int is_host_alias(const char *name, struct query *ctl) else if (!ctl->server.dns) return(FALSE); + /* + * Now check for a suffix match on the akalist. The theory here is + * that if the user says `aka netaxs.com', we actually want to match + * foo.netaxs.com and bar.netaxs.com. + */ + namelen = strlen(name); + for (idl = lead_server->akalist; idl; idl = idl->next) + { + char *ep; + + /* + * Test is >= here because str_in_list() should have caught the + * equal-length case above. Doing it this way guarantees that + * ep[-1] is a valid reference. + */ + if (strlen(idl->id) >= namelen) + continue; + ep = (char *)name + (namelen - strlen(idl->id)); + /* a suffix led by . must match */ + if (ep[-1] == '.' && !strcmp(ep, idl->id)) + return(TRUE); + } + #ifndef HAVE_RES_SEARCH return(FALSE); #else @@ -130,22 +161,23 @@ int is_host_alias(const char *name, struct query *ctl) * delivering the current message or anything else from the * current server until it's back up. */ - else if ((he = gethostbyname(name)) != (struct hostent *)NULL) + if ((he = gethostbyname(name)) != (struct hostent *)NULL) { if (strcasecmp(ctl->server.truename, he->h_name) == 0) goto match; else if (((he_st = gethostbyname(ctl->server.truename)) != (struct hostent *)NULL) && ctl->server.checkalias) { if (outlevel >= O_DEBUG) - progress(0, 0, _("Checking if %s is really the same node as %s"),ctl->server.truename,name); + report(stdout, _("Checking if %s is really the same node as %s\n"),ctl->server.truename,name); if (is_ip_alias(ctl->server.truename,name) == TRUE) { if (outlevel >= O_DEBUG) - progress(0, 0, _("Yes, their IP addresses match")); + report(stdout, _("Yes, their IP addresses match\n")); goto match; } if (outlevel >= O_DEBUG) - progress(0, 0, _("No, their IP addresses don't match")); + report(stdout, _("No, their IP addresses don't match\n")); + return(FALSE); } else return(FALSE); @@ -154,16 +186,17 @@ int is_host_alias(const char *name, struct query *ctl) switch (h_errno) { case HOST_NOT_FOUND: /* specified host is unknown */ +#ifndef __BEOS__ case NO_ADDRESS: /* valid, but does not have an IP address */ break; - +#endif case NO_RECOVERY: /* non-recoverable name server error */ case TRY_AGAIN: /* temporary error on authoritative server */ default: if (outlevel != O_SILENT) - putchar('\n'); /* terminate the progress message */ - error(0, 0, - _("nameserver failure while looking for `%s' during poll of %s."), + report_complete(stdout, "\n"); /* terminate the progress message */ + report(stderr, + _("nameserver failure while looking for `%s' during poll of %s.\n"), name, ctl->server.pollname); ctl->errcount++; break; @@ -180,15 +213,16 @@ int is_host_alias(const char *name, struct query *ctl) switch (h_errno) { case HOST_NOT_FOUND: /* specified host is unknown */ +#ifndef __BEOS__ case NO_ADDRESS: /* valid, but does not have an IP address */ return(FALSE); break; - +#endif case NO_RECOVERY: /* non-recoverable name server error */ case TRY_AGAIN: /* temporary error on authoritative server */ default: - error(0, -1, - _("nameserver failure while looking for `%s' during poll of %s."), + report(stderr, + _("nameserver failure while looking for `%s' during poll of %s.\n"), name, ctl->server.pollname); ctl->errcount++; break;