- if (mp->m_nohost)
- return 1;
- if (np->m_host == NULL)
- continue;
- if ((len = strlen (cp = np->m_host))
- < (i = strlen (pp = mp->m_host)))
- continue;
- switch (mp->m_type & W_HOST) {
- case W_NIL:
- if (strcasecmp (cp, pp))
- continue;
- break;
- case W_HBEG:
- if (strcasecmp (cp + len - i, pp))
- continue;
- break;
- case W_HEND:
- if (!uprf (cp, pp))
- continue;
- break;
- case W_HBEG | W_HEND:
- if (stringdex (pp, cp) < 0)
- continue;
- break;
+ /*
+ ** Now scan through list of alternate
+ ** mailboxes, and check for a match.
+ */
+ for (mp = &mq; mp->m_next;) {
+ mp = mp->m_next;
+ if (!np->m_mbox)
+ continue;
+ if ((len = strlen(cp = np->m_mbox))
+ < (i = strlen(pp = mp->m_mbox)))
+ continue;
+ switch (mp->m_type & W_MBOX) {
+ case W_NIL:
+ if (mh_strcasecmp(cp, pp))
+ continue;
+ break;
+ case W_MBEG:
+ if (mh_strcasecmp(cp + len - i, pp))
+ continue;
+ break;
+ case W_MEND:
+ if (!uprf(cp, pp))
+ continue;
+ break;
+ case W_MBEG | W_MEND:
+ if (stringdex(pp, cp) < 0)
+ continue;
+ break;
+ }
+
+ if (mp->m_nohost)
+ return 1;
+ if (np->m_host == NULL)
+ continue;
+ if ((len = strlen(cp = np->m_host))
+ < (i = strlen(pp = mp->m_host)))
+ continue;
+ switch (mp->m_type & W_HOST) {
+ case W_NIL:
+ if (mh_strcasecmp(cp, pp))
+ continue;
+ break;
+ case W_HBEG:
+ if (mh_strcasecmp (cp + len - i, pp))
+ continue;
+ break;
+ case W_HEND:
+ if (!uprf(cp, pp))
+ continue;
+ break;
+ case W_HBEG | W_HEND:
+ if (stringdex(pp, cp) < 0)
+ continue;
+ break;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+
+/*
+** Moved from hosts.c -- find out the official name of a host
+*/
+
+/*
+** In the SendMail world, we really don't know what the valid
+** hosts are. We could poke around in the sendmail.cf file, but
+** that still isn't a guarantee. As a result, we'll say that
+** everything is a valid host, and let SendMail worry about it.
+*/
+
+#include <h/mts.h>
+#include <netdb.h>
+
+
+char *
+OfficialName(char *name)
+{
+ unsigned char *p;
+ char *q, site[BUFSIZ];
+ struct addrinfo hints, *res;
+
+ static char buffer[BUFSIZ];
+
+ for (p = name, q = site; *p && (q - site < sizeof(site) - 1); p++, q++)
+ *q = isupper(*p) ? tolower(*p) : *p;
+ *q = '\0';
+ q = site;
+
+ if (!mh_strcasecmp(LocalName(), site))
+ return LocalName();
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_CANONNAME;
+ hints.ai_family = PF_UNSPEC;
+
+ if (getaddrinfo(q, NULL, &hints, &res) == 0) {
+ strncpy(buffer, res->ai_canonname, sizeof(buffer));
+ buffer[sizeof(buffer) - 1] = '\0';
+ freeaddrinfo(res);
+ return buffer;