X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=mts%2Fsmtp%2Fhosts.c;h=ec73e869751c798c1d69aec1ac598719ea062c08;hp=40697ce90b4501c7810bc870fe8a576a9167e92d;hb=128545e06224233b7e91fc4c83f8830252fe16c9;hpb=75e073ea52a427394690e0c1ef7943a1727c7095 diff --git a/mts/smtp/hosts.c b/mts/smtp/hosts.c index 40697ce..ec73e86 100644 --- a/mts/smtp/hosts.c +++ b/mts/smtp/hosts.c @@ -2,7 +2,9 @@ /* * hosts.c -- find out the official name of a host * - * $Id$ + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ /* @@ -13,125 +15,38 @@ */ #include -#include +#include #include -static struct host { - char *h_name; - char **h_aliases; - struct host *h_next; -} hosts; - - -/* - * static prototypes - */ -static int init_hs(void); - char * OfficialName (char *name) { - char *p, *q, site[BUFSIZ]; - struct hostent *hp; + unsigned char *p; + char *q, site[BUFSIZ]; + struct addrinfo hints, *res; static char buffer[BUFSIZ]; - char **r; - struct host *h; for (p = name, q = site; *p && (q - site < sizeof(site) - 1); p++, q++) *q = isupper (*p) ? tolower (*p) : *p; *q = '\0'; q = site; - if (!strcasecmp (LocalName(), site)) + if (!mh_strcasecmp (LocalName(), site)) return LocalName(); -#ifdef HAVE_SETHOSTENT - sethostent (1); -#endif + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_CANONNAME; + hints.ai_family = PF_UNSPEC; - if ((hp = gethostbyname (q))) { - strncpy (buffer, hp->h_name, sizeof(buffer)); + if (getaddrinfo(q, NULL, &hints, &res) == 0) { + strncpy (buffer, res->ai_canonname, sizeof(buffer)); + buffer[sizeof(buffer) - 1] = '\0'; + freeaddrinfo(res); return buffer; } - if (hosts.h_name || init_hs ()) { - for (h = hosts.h_next; h; h = h->h_next) - if (!strcasecmp (h->h_name, q)) { - return h->h_name; - } else { - for (r = h->h_aliases; *r; r++) - if (!strcasecmp (*r, q)) - return h->h_name; - } - } strncpy (buffer, site, sizeof(buffer)); return buffer; } - -/* - * Use hostable as an exception file for those hosts that aren't - * on the Internet (listed in /etc/hosts). These are usually - * PhoneNet and UUCP sites. - */ - -#define NALIASES 50 - -static int -init_hs (void) -{ - char *cp, *dp, **q, **r; - char buffer[BUFSIZ], *aliases[NALIASES]; - register struct host *h; - register FILE *fp; - - if ((fp = fopen (hostable, "r")) == NULL) - return 0; - - h = &hosts; - while (fgets (buffer, sizeof(buffer), fp) != NULL) { - if ((cp = strchr(buffer, '#'))) - *cp = 0; - if ((cp = strchr(buffer, '\n'))) - *cp = 0; - for (cp = buffer; *cp; cp++) - if (isspace (*cp)) - *cp = ' '; - for (cp = buffer; isspace (*cp); cp++) - continue; - if (*cp == 0) - continue; - - q = aliases; - if ((cp = strchr(dp = cp, ' '))) { - *cp = 0; - for (cp++; *cp; cp++) { - while (isspace (*cp)) - cp++; - if (*cp == 0) - break; - if ((cp = strchr(*q++ = cp, ' '))) - *cp = 0; - else - break; - if (q >= aliases + NALIASES) - break; - } - } - - *q = 0; - - h->h_next = (struct host *) calloc (1, sizeof(*h)); - h = h->h_next; - h->h_name = getcpy (dp); - r = h->h_aliases = - (char **) calloc ((size_t) (q - aliases + 1), sizeof(*q)); - for (q = aliases; *q; q++) - *r++ = getcpy (*q); - *r = 0; - } - - fclose (fp); - return 1; -}