Create proper prototypes for formataddr() and concataddr().
[mmh] / sbr / addrsbr.c
index 633f6ef..9edb139 100644 (file)
@@ -10,6 +10,7 @@
 #include <h/mh.h>
 #include <h/addrsbr.h>
 #include <h/mf.h>
+#include <h/mts.h>
 
 /* 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) {