X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/487ad115de1c5a97ab4e61bbf3f3bbbdbd97b258..c0ee509559273a5133ff73026e76c19aca65fa87:/sbr/addrsbr.c?ds=sidebyside diff --git a/sbr/addrsbr.c b/sbr/addrsbr.c index bb0b2c78..6bb94211 100644 --- a/sbr/addrsbr.c +++ b/sbr/addrsbr.c @@ -11,6 +11,7 @@ #include #include #include +#include /* High level parsing of addresses: @@ -48,7 +49,7 @@ 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 + defaulted, typically to the local host. The lack of an explicit host is also noted. If an explicit 822-style host is present, then MH checks to see if it @@ -75,18 +76,24 @@ static char *grp = NULL; static char *note = NULL; static char err[BUFSIZ]; static char adr[BUFSIZ]; +static int eai = 0; + +void +enable_eai() { + eai = 1; +} char * -getname (char *addrs) +getname (const char *addrs) { struct adrx *ap; - pers = mbox = host = route = grp = note = NULL; err[0] = '\0'; - if ((ap = getadrx (addrs ? addrs : "")) == NULL) + if ((ap = getadrx (addrs ? addrs : "", eai)) == NULL) { return NULL; + } strncpy (adr, ap->text, sizeof(adr)); pers = ap->pers; @@ -104,35 +111,32 @@ getname (char *addrs) struct mailname * -getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) +getm (char *str, char *dfhost, int dftype, char *eresult, size_t eresultsize) { char *pp; struct mailname *mp; if (err[0]) { - if (eresult) - strcpy (eresult, err); - else - if (wanthost == AD_HOST) - admonish (NULL, "bad address '%s' - %s", str, err); + if (eresult) { + strncpy (eresult, err, eresultsize); + eresult[eresultsize - 1] = '\0'; + } return NULL; } if (pers == NULL && mbox == NULL && host == NULL && route == NULL && grp == NULL) { - if (eresult) - strcpy (eresult, "null address"); - else - if (wanthost == AD_HOST) - admonish (NULL, "null address '%s'", str); + if (eresult) { + strncpy (eresult, "null address", eresultsize); + eresult[eresultsize - 1] = '\0'; + } return NULL; } if (mbox == NULL && grp == NULL) { - if (eresult) - strcpy (eresult, "no mailbox in address"); - else - if (wanthost == AD_HOST) - admonish (NULL, "no mailbox in address '%s'", str); + if (eresult) { + strncpy (eresult, "no mailbox in address", eresultsize); + eresult[eresultsize - 1] = '\0'; + } return NULL; } @@ -141,13 +145,13 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult) dftype = LOCALHOST; } - mp = (struct mailname *) calloc ((size_t) 1, sizeof(*mp)); + mp = (struct mailname *) mh_xcalloc ((size_t) 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"); + if (eresult) { + strncpy (eresult, "insufficient memory to represent address", + eresultsize); + eresult[eresultsize - 1] = '\0'; + } return NULL; } @@ -242,10 +246,13 @@ auxformat (struct mailname *mp, int extras) strncpy (addr, mp->m_mbox ? mp->m_mbox : "", sizeof(addr)); else - 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 + if (mp->m_type != UUCPHOST) { + if (mp->m_host) + snprintf (addr, sizeof(addr), "%s%s@%s", empty(mp->m_path), + empty(mp->m_mbox), mp->m_host); + else snprintf (addr, sizeof(addr), "%s%s", empty(mp->m_path), + empty(mp->m_mbox)); + } else snprintf (addr, sizeof(addr), "%s!%s", mp->m_host, mp->m_mbox); if (!extras) @@ -271,24 +278,6 @@ auxformat (struct mailname *mp, int extras) } -/* - * This used to be adrsprintf() (where it would format an address for you - * given a username and a domain). But somewhere we got to the point where - * the only caller was post, and it only called it with both arguments NULL. - * So the function was renamed with a more sensible name. - */ - -char * -getlocaladdr(void) -{ - char *username; - - username = getusername(); - - return username; -} - - #define W_NIL 0x0000 #define W_MBEG 0x0001 #define W_MEND 0x0002 @@ -332,7 +321,7 @@ ismymbox (struct mailname *np) return 0; } - if ((mq.m_next = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) { + if ((mq.m_next = getm (cp, NULL, 0, NULL, 0)) == NULL) { admonish (NULL, "invalid entry in local-mailbox: %s", cp); return 0; } @@ -352,7 +341,7 @@ ismymbox (struct mailname *np) mp = mq.m_next ? mq.m_next : &mq; oops = 0; while ((cp = getname (am))) { - if ((mp->m_next = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) { + if ((mp->m_next = getm (cp, NULL, 0, NULL, 0)) == NULL) { admonish (NULL, "illegal address: %s", cp); oops++; } else { @@ -430,7 +419,8 @@ local_test: ; for (mp = &mq; mp->m_next;) { mp = mp->m_next; if (!np->m_mbox) - continue; if ((len = strlen (cp = np->m_mbox)) + continue; + if ((len = strlen (cp = np->m_mbox)) < (i = strlen (pp = mp->m_mbox))) continue; switch (mp->m_type & W_MBOX) { @@ -454,7 +444,7 @@ local_test: ; if (mp->m_nohost) return 1; - if (np->m_host == NULL) + if (np->m_host == NULL || mp->m_host == NULL) continue; if ((len = strlen (cp = np->m_host)) < (i = strlen (pp = mp->m_host)))