** complete copyright information.
*/
+#include <sysexits.h>
#include <h/mh.h>
+#include <h/utils.h>
#include <h/addrsbr.h>
#include <h/mf.h>
** addresses. The routines in sbr/addrsbr.c associate semantics with those
** addresses.
**
-** If #ifdef DUMB is in effect, a full 822-style parser is called
-** for syntax recongition. This breaks each address into its components.
-** Note however that no semantics are assumed about the parts or their
-** totality. This means that implicit hostnames aren't made explicit,
-** and explicit hostnames aren't expanded to their "official" represenations.
-**
-** If DUMB is not in effect, then this module does some
-** high-level thinking about what the addresses are.
-**
-** 1. for MMDF systems:
-**
-** string%<uucp>@<local> -> string
-**
-** 2. for non-MMDF systems:
-**
-** string@host.<uucp> -> host!string
-**
-** 3. for any system, an address interpreted relative to the local host:
-**
-** string@<uucp> -> string
-**
-** For cases (1) and (3) above, the leftmost host is extracted. If it's not
-** present, the local host is used. If the tests above fail, the address is
-** considered to be a real 822-style address.
-**
-** If an explicit host is not present, then MH checks for a bang to indicate
-** an explicit UUCP-style address. If so, this is noted. If not, the host is
-** defaulted, typically to the local host. The lack of an explict host is
-** also noted.
-**
-** If an explicit 822-style host is present, then MH checks to see if it
-** can expand this to the official name for the host. If the hostname is
-** unknown, the address is so typed.
+** A full 822-style parser is called for syntax recongition. This breaks
+** each address into its components. Note however that no semantics are
+** assumed about the parts or their totality. This means that implicit
+** hostnames aren't made explicit, and explicit hostnames aren't expanded
+** to their "official" represenations.
**
** To summarize, when we're all done, here's what MH knows about the address:
-**
-** DUMB - type: local, uucp, or network
-** host: not locally defaulted, not explicitly expanded
-** everything else
-**
-** other - type: local, uucp, network, unknown
-** everything else
+** type: local or network
+** host: not locally defaulted, not explicitly expanded
+** everything else
*/
static char adr[BUFSIZ];
-extern boolean username_extension_masquerading; /* defined in mts.c */
-
-
-/*
-** external prototypes
-*/
-char *getusername(void);
-
-
char *
getname(char *addrs)
{
struct mailname *
getm(char *str, char *dfhost, int dftype, int wanthost, char *eresult)
{
- char *pp;
struct mailname *mp;
-#ifndef DUMB
- char *dp;
-#endif /* not DUMB */
if (err[0]) {
if (eresult)
dftype = LOCALHOST;
}
- mp = (struct mailname *) calloc((size_t) 1, sizeof(*mp));
+ mp = mh_xcalloc(1, sizeof(*mp));
if (mp == NULL) {
if (eresult)
strcpy(eresult, "insufficient memory to represent address");
else if (wanthost == AD_HOST)
- adios(NULL, "insufficient memory to represent address");
+ adios(EX_OSERR, NULL, "insufficient memory to represent address");
return NULL;
}
mp->m_next = NULL;
- mp->m_text = getcpy(str);
+ mp->m_text = mh_xstrdup(str);
if (pers)
- mp->m_pers = getcpy(pers);
+ mp->m_pers = mh_xstrdup(pers);
if (mbox == NULL) {
mp->m_type = BADHOST;
mp->m_nohost = 1;
mp->m_ingrp = ingrp;
- mp->m_gname = getcpy(grp);
+ mp->m_gname = mh_xstrdup(grp);
if (note)
- mp->m_note = getcpy(note);
+ mp->m_note = mh_xstrdup(note);
return mp;
}
if (host) {
- mp->m_mbox = getcpy(mbox);
- mp->m_host = getcpy(host);
+ mp->m_mbox = mh_xstrdup(mbox);
+ mp->m_host = mh_xstrdup(host);
} else {
- if ((pp = strchr(mbox, '!'))) {
- *pp++ = '\0';
- mp->m_mbox = getcpy(pp);
- mp->m_host = getcpy(mbox);
- mp->m_type = UUCPHOST;
+ mp->m_nohost = 1;
+ mp->m_mbox = mh_xstrdup(mbox);
+ if (route == NULL && dftype == LOCALHOST) {
+ mp->m_host = NULL;
+ mp->m_type = dftype;
} else {
- mp->m_nohost = 1;
- mp->m_mbox = getcpy(mbox);
-#ifdef DUMB
- if (route == NULL && dftype == LOCALHOST) {
- mp->m_host = NULL;
- mp->m_type = dftype;
- } else
-#endif /* DUMB */
- {
- mp->m_host = route ? NULL : getcpy(dfhost);
- mp->m_type = route ? NETHOST : dftype;
- }
+ mp->m_host = route ? NULL : mh_xstrdup(dfhost);
+ mp->m_type = route ? NETHOST : dftype;
}
goto got_host;
}
if (wanthost == AD_NHST)
mp->m_type = !mh_strcasecmp(LocalName(), mp->m_host)
? LOCALHOST : NETHOST;
-#ifdef DUMB
else
mp->m_type = mh_strcasecmp(LocalName(), mp->m_host) ? NETHOST : LOCALHOST;
-#else /* not DUMB */
- else
- if (pp = OfficialName(mp->m_host)) {
- got_real_host: ;
- free (mp->m_host);
- mp->m_host = getcpy(pp);
- mp->m_type = mh_strcasecmp(LocalName(), mp->m_host) ? NETHOST : LOCALHOST;
- } else {
- if (dp = strchr(mp->m_host, '.')) {
- *dp = NULL;
- if (pp = OfficialName(mp->m_host))
- goto got_real_host;
- *dp = '.';
- }
- mp->m_type = BADHOST;
- }
-#endif /* not DUMB */
got_host: ;
if (route)
- mp->m_path = getcpy(route);
+ mp->m_path = mh_xstrdup(route);
mp->m_ingrp = ingrp;
if (grp)
- mp->m_gname = getcpy(grp);
+ mp->m_gname = mh_xstrdup(grp);
if (note)
- mp->m_note = getcpy(note);
+ mp->m_note = mh_xstrdup(note);
return mp;
}
return;
if (mp->m_text)
- free(mp->m_text);
+ mh_free0(&(mp->m_text));
if (mp->m_pers)
- free(mp->m_pers);
+ mh_free0(&(mp->m_pers));
if (mp->m_mbox)
- free(mp->m_mbox);
+ mh_free0(&(mp->m_mbox));
if (mp->m_host)
- free(mp->m_host);
+ mh_free0(&(mp->m_host));
if (mp->m_path)
- free(mp->m_path);
+ mh_free0(&(mp->m_path));
if (mp->m_gname)
- free(mp->m_gname);
+ mh_free0(&(mp->m_gname));
if (mp->m_note)
- free(mp->m_note);
+ mh_free0(&(mp->m_note));
- free((char *) mp);
+ mh_free0(&mp);
}
static char addr[BUFSIZ];
static char buffer[BUFSIZ];
-#ifdef DUMB
if (mp->m_nohost)
strncpy(addr, mp->m_mbox ? mp->m_mbox : "", sizeof(addr));
else
-#endif /* DUMB */
-
-#ifndef BANG
- if (mp->m_type != UUCPHOST)
snprintf(addr, sizeof(addr), mp->m_host ? "%s%s@%s" : "%s%s",
empty(mp->m_path), empty(mp->m_mbox), mp->m_host);
- else
-#endif /* not BANG */
- snprintf(addr, sizeof(addr), "%s!%s", mp->m_host, mp->m_mbox);
if (mp->m_pers || mp->m_path) {
if (mp->m_note)
ismymbox(struct mailname *np)
{
int oops;
- register int len, i;
- register char *cp;
- register char *pp;
+ int len, i;
+ char *cp;
+ char *pp;
char buffer[BUFSIZ];
struct mailname *mp;
static char *am = NULL;
- static struct mailname mq={NULL};
+ static struct mailname mq;
/*
** If this is the first call, initialize
if (am == NULL) {
mq.m_next = NULL;
mq.m_mbox = getusername();
- if ((am = context_find("alternate-mailboxes")) == NULL)
+ mp = &mq;
+ if ((am = context_find("alternate-mailboxes")) == NULL) {
am = getusername();
- else {
- mp = &mq;
+ } else {
oops = 0;
while ((cp = getname(am))) {
if ((mp->m_next = getm(cp, NULL, 0, AD_NAME, NULL)) == NULL) {
*cp = '\0';
}
}
- if ((cp = getenv("MHWDEBUG")) && *cp)
+ if ((cp = getenv("MHWDEBUG")) && *cp) {
+ fprintf(stderr, "mbox=\"%s\" host=\"%s\" %s\n",
+ mp->m_mbox, mp->m_host,
+ snprintb(buffer, sizeof(buffer), (unsigned) mp->m_type, WBITS));
+ }
+ }
+ }
+ if (oops != 0) {
+ advise(NULL, "please fix the profile entry %s",
+ "alternate-mailboxes");
+ }
+ }
+
+ if ((cp = context_find("Default-From")) != NULL) {
+ int i = 0;
+ char *cp2;
+ oops = 0;
+
+ while ((cp2 = getname(cp)) != NULL) {
+ i++;
+ if ((mp->m_next = getm(cp2, NULL, 0, AD_NAME, NULL)) == NULL) {
+ admonish(NULL, "illegal address: %s", cp);
+ oops++;
+ } else {
+ mp = mp->m_next;
+ if ((cp = getenv("MHWDEBUG")) && *cp) {
fprintf(stderr, "mbox=\"%s\" host=\"%s\" %s\n",
mp->m_mbox, mp->m_host,
snprintb(buffer, sizeof(buffer), (unsigned) mp->m_type, WBITS));
+ }
}
+
}
- if (oops)
- advise(NULL, "please fix the %s: entry in your %s file",
- "alternate-mailboxes", mh_profile);
+
+ if (oops != 0 || i < 1) {
+ advise(NULL, "please fix the profile entry %s",
+ "Default-From");
+ }
+
}
}
return 0;
switch (np->m_type) {
- case NETHOST:
- len = strlen(cp = LocalName());
- if (!uprf(np->m_host, cp) || np->m_host[len] != '.')
- break;
- goto local_test;
-
- case UUCPHOST:
- if (mh_strcasecmp(np->m_host, SystemName()))
- break; /* fall */
- case LOCALHOST:
-local_test: ;
- if (!mh_strcasecmp(np->m_mbox, mq.m_mbox))
- return 1;
+ case NETHOST:
+ len = strlen(cp = LocalName());
+ if (!uprf(np->m_host, cp) || np->m_host[len] != '.')
break;
+ goto local_test;
- default:
- break;
+ case LOCALHOST:
+local_test: ;
+ if (!mh_strcasecmp(np->m_mbox, mq.m_mbox))
+ return 1;
+ break;
+
+ default:
+ break;
}
/*
< (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;
+ 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)
< (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;
+ 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)
+ * Insert mailname after element and returns the
+ * number of parsed addresses. element is set to
+ * the last parsed addresse.
+ */
+ssize_t
+getmboxes(char *line, struct mailname **element)
{
- 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;
+ struct mailname *mp, *next, *first;
+ char *cp;
+ size_t i = 0;
- if (!mh_strcasecmp(LocalName(), site))
- return LocalName();
+ first = *element;
+ next = first->m_next;
- 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;
+ while ((cp = getname(line))) {
+ mp = getm(cp, NULL, 0, AD_HOST, NULL);
+ if (mp == NULL) {
+ goto error;
+ }
+ (*element)->m_next = mp;
+ *element = mp;
+ i++;
}
- strncpy(buffer, site, sizeof(buffer));
- return buffer;
+ (*element)->m_next = next;
+ return i;
+error:
+ while (first->m_next != NULL && first->m_next != next) {
+ mp = first->m_next;
+ first->m_next = mp->m_next;
+ mh_free0(&mp);
+ }
+ first->m_next = next;
+ return -1;
}