Hm, it turns out we need to make sure we call getname() until we get
[mmh] / sbr / addrsbr.c
index 4f734b4..ffdac3f 100644 (file)
@@ -2,19 +2,24 @@
 /*
  * addrsbr.c -- parse addresses 822-style
  *
- * $Id$
+ * This code is Copyright (c) 2002, by the authors of nmh.  See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
  */
 
 #include <h/mh.h>
 #include <h/addrsbr.h>
-#include <zotnet/mf/mf.h>
+#include <h/mf.h>
 
 /* High level parsing of addresses:
 
-   The routines in zotnet/mf/mf.c parse the syntactic representations of
+   The routines in sbr/mf.c parse the syntactic representations of
    addresses.  The routines in sbr/addrsbr.c associate semantics with those
    addresses.  
 
+   The comments below are left in for historical purposes; DUMB and
+   REALLYDUMB are now the default in the code.
+
    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
@@ -111,11 +116,8 @@ 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 && err[0]) {
+    if (err[0]) {
        if (eresult)
            strcpy (eresult, err);
        else
@@ -143,7 +145,7 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
     }
 
     if (dfhost == NULL) {
-       dfhost = LocalName ();
+       dfhost = LocalName (0);
        dftype = LOCALHOST;
     }
 
@@ -186,13 +188,11 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
        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;
@@ -202,29 +202,10 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
     }
 
     if (wanthost == AD_NHST)
-       mp->m_type = !strcasecmp (LocalName (), mp->m_host)
+       mp->m_type = !mh_strcasecmp (LocalName (0), mp->m_host)
            ? LOCALHOST : NETHOST;
-#ifdef DUMB
-    else
-       mp->m_type = 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 = 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 */
+       mp->m_type = mh_strcasecmp (LocalName(0), mp->m_host) ?  NETHOST : LOCALHOST;
 
 got_host: ;
     if (route)
@@ -272,18 +253,14 @@ auxformat (struct mailname *mp, int extras)
     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 (!extras)
@@ -310,17 +287,20 @@ auxformat (struct mailname *mp, int extras)
 
 
 /*
- * address specific "sprintf"
+ * 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 *
-adrsprintf (char *username, char *domain)
+getlocaladdr(void)
 {
     int          snprintf_return;
+    char        *username, *domain;
     static char  addr[BUFSIZ];
 
-    if (username == NULL)
-       username = getusername();
+    username = getusername();
 
     if (username_extension_masquerading) {
        /* mts.conf contains "masquerade:[...]username_extension[...]", so tack
@@ -335,7 +315,7 @@ adrsprintf (char *username, char *domain)
                                       "%s%s", username, extension);
            
            if (snprintf_return < 0 ||
-               snprintf_return >= sizeof(username_with_extension))
+               snprintf_return >= (int) sizeof(username_with_extension))
                adios(NULL, "snprintf() error writing username (%d chars) and"
                      " $USERNAME_EXTENSION (%d chars) to array of BUFSIZ (%d)"
                      " chars",
@@ -345,20 +325,13 @@ adrsprintf (char *username, char *domain)
        }
     }
 
-#ifdef REALLYDUMB
     return username;
-#endif
 
-    if (domain == NULL)
-       domain = LocalName();
+    domain = LocalName(0);
 
-#ifndef        BANG
     snprintf_return = snprintf (addr, sizeof(addr), "%s@%s", username, domain);
-#else /* BANG */
-    snprintf_return = snprintf (addr, sizeof(addr), "%s!%s", domain, username);
-#endif /* BANG */
 
-    if (snprintf_return < 0 || snprintf_return >= sizeof(addr))
+    if (snprintf_return < 0 || snprintf_return >= (int) sizeof(addr))
        adios(NULL, "snprintf() error writing username (%d chars), domain (%d"
              " chars), and 1 separator char to array of BUFSIZ (%d) chars",
              strlen(username), strlen(domain), BUFSIZ);
@@ -390,15 +363,49 @@ ismymbox (struct mailname *np)
     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
      * 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 {
@@ -446,17 +453,17 @@ 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;
 
        case UUCPHOST:
-           if (strcasecmp (np->m_host, SystemName()))
+           if (mh_strcasecmp (np->m_host, SystemName()))
                break;          /* fall */
        case LOCALHOST:
 local_test: ;
-           if (!strcasecmp (np->m_mbox, mq.m_mbox))
+           if (!mh_strcasecmp (np->m_mbox, mq.m_mbox))
                return 1;
            break;
 
@@ -477,11 +484,11 @@ local_test: ;
            continue;
        switch (mp->m_type & W_MBOX) {
            case W_NIL: 
-               if (strcasecmp (cp, pp))
+               if (mh_strcasecmp (cp, pp))
                    continue;
                break;
            case W_MBEG: 
-               if (strcasecmp (cp + len - i, pp))
+               if (mh_strcasecmp (cp + len - i, pp))
                    continue;
                break;
            case W_MEND: 
@@ -503,11 +510,11 @@ local_test: ;
            continue;
        switch (mp->m_type & W_HOST) {
            case W_NIL: 
-               if (strcasecmp (cp, pp))
+               if (mh_strcasecmp (cp, pp))
                    continue;
                break;
            case W_HBEG: 
-               if (strcasecmp (cp + len - i, pp))
+               if (mh_strcasecmp (cp + len - i, pp))
                    continue;
                break;
            case W_HEND: