X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Faddrsbr.c;h=9edb1392c75b1925b11c252c0c6e63bb07ada411;hb=40ae9d199d58c85469e3528fc53205143baf29d2;hp=633f6ef9aac252f96210ecf44995a53e1f8d85dd;hpb=5aab34095ffbff27be09091e703e61ddf352ad87;p=mmh diff --git a/sbr/addrsbr.c b/sbr/addrsbr.c index 633f6ef..9edb139 100644 --- a/sbr/addrsbr.c +++ b/sbr/addrsbr.c @@ -10,6 +10,7 @@ #include #include #include +#include /* High level parsing of addresses: @@ -79,12 +80,6 @@ static char adr[BUFSIZ]; extern boolean username_extension_masquerading; /* defined in mts.c */ -/* - * external prototypes - */ -char *getusername (void); - - char * getname (char *addrs) { @@ -364,35 +359,39 @@ ismymbox (struct mailname *np) struct mailname *mp; static char *am = NULL; static struct mailname mq; + static int localmailbox = 0; /* * If this is the first call, initialize * list of alternate mailboxes. */ if (am == NULL) { + mq.m_next = NULL; + mq.m_mbox = getusername (); + if ((am = context_find ("local-mailbox"))) { - struct mailname *mptr; - if ((mptr = getm (am, NULL, 0, AD_NAME, NULL)) == NULL) { - admonish (NULL, "invalid entry in local-mailbox: %s", am); + localmailbox++; + + if ((cp = getname(am)) == NULL) { + admonish (NULL, "Unable to find address in local-mailbox"); + return 0; + } + + if ((mq.m_next = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) { + admonish (NULL, "invalid entry in local-mailbox: %s", cp); return 0; } /* - * Yes, we're not freeing the whole entry, because all of those - * elements contain allocated pointers that we need; maybe - * later ... + * Sigh, it turns out that the address parser gets messed up + * if you don't call getname() until it returns NULL. */ - mq = *mptr; - - free(mptr); - } else { - mq.m_mbox = getusername (); + while ((cp = getname(am)) != NULL) + ; } - mq.m_next = NULL; - if ((am = context_find ("alternate-mailboxes")) == NULL) am = getusername(); else { @@ -438,25 +437,30 @@ ismymbox (struct mailname *np) if (np == NULL) /* XXX */ return 0; - switch (np->m_type) { - case NETHOST: - len = strlen (cp = LocalName (0)); - if (!uprf (np->m_host, cp) || np->m_host[len] != '.') - break; - goto local_test; + /* + * Don't perform this "local" test if we have a Local-Mailbox set + */ - case UUCPHOST: - if (mh_strcasecmp (np->m_host, SystemName())) - break; /* fall */ - case LOCALHOST: + if (! localmailbox) + switch (np->m_type) { + case NETHOST: + len = strlen (cp = LocalName (0)); + 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; - break; + if (!mh_strcasecmp (np->m_mbox, mq.m_mbox)) + return 1; + break; - default: - break; - } + default: + break; + } /* * Now scan through list of alternate @@ -465,8 +469,7 @@ 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) {