Hm, it turns out we need to make sure we call getname() until we get
[mmh] / sbr / addrsbr.c
index 07bc810..ffdac3f 100644 (file)
@@ -145,7 +145,7 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
     }
 
     if (dfhost == NULL) {
-       dfhost = LocalName ();
+       dfhost = LocalName (0);
        dftype = LOCALHOST;
     }
 
@@ -202,10 +202,10 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
     }
 
     if (wanthost == AD_NHST)
-       mp->m_type = !mh_strcasecmp (LocalName (), mp->m_host)
+       mp->m_type = !mh_strcasecmp (LocalName (0), mp->m_host)
            ? LOCALHOST : NETHOST;
     else
-       mp->m_type = mh_strcasecmp (LocalName(), mp->m_host) ?  NETHOST : LOCALHOST;
+       mp->m_type = mh_strcasecmp (LocalName(0), mp->m_host) ?  NETHOST : LOCALHOST;
 
 got_host: ;
     if (route)
@@ -327,7 +327,7 @@ getlocaladdr(void)
 
     return username;
 
-    domain = LocalName();
+    domain = LocalName(0);
 
     snprintf_return = snprintf (addr, sizeof(addr), "%s@%s", username, domain);
 
@@ -370,8 +370,42 @@ ismymbox (struct mailname *np)
      * list of alternate mailboxes.
      */
     if (am == NULL) {
+       if ((am = context_find ("local-mailbox"))) {
+           struct mailname *mptr;
+
+           if ((cp = getname(am)) == NULL) {
+               admonish (NULL, "Unable to find address in local-mailbox");
+               return 0;
+           }
+
+           if ((mptr = 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 ...
+            */
+
+           mq = *mptr;
+
+           free(mptr);
+
+           /*
+            * Sigh, it turns out that the address parser gets messed up
+            * if you don't call getname() until it returns NULL.
+            */
+
+           while ((cp = getname(am)) != NULL)
+               ;
+       } else {
+           mq.m_mbox = getusername ();
+       }
+
        mq.m_next = NULL;
-       mq.m_mbox = getusername ();
+
        if ((am = context_find ("alternate-mailboxes")) == NULL)
            am = getusername();
        else {
@@ -419,7 +453,7 @@ ismymbox (struct mailname *np)
     
     switch (np->m_type) {
        case NETHOST:
-           len = strlen (cp = LocalName ());
+           len = strlen (cp = LocalName (0));
            if (!uprf (np->m_host, cp) || np->m_host[len] != '.')
                break;
            goto local_test;