Changed msg_style and msg_delim to be file static to m_getfld.c
[mmh] / sbr / addrsbr.c
index d1fd730..929b491 100644 (file)
@@ -2,19 +2,25 @@
 /*
  * 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>
+#include <h/mts.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
@@ -70,11 +76,6 @@ static char *note = NULL;
 static char err[BUFSIZ];
 static char adr[BUFSIZ];
 
-/*
- * external prototypes
- */
-char *getusername (void);
-
 
 char *
 getname (char *addrs)
@@ -107,11 +108,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
@@ -139,7 +137,7 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
     }
 
     if (dfhost == NULL) {
-       dfhost = LocalName ();
+       dfhost = LocalName (0);
        dftype = LOCALHOST;
     }
 
@@ -171,58 +169,30 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
     if (host) {
        mp->m_mbox = getcpy (mbox);
        mp->m_host = getcpy (host);
-    }
-    else {
+       mp->m_type =
+           mh_strcasecmp (LocalName(0), mp->m_host) ? NETHOST : LOCALHOST;
+    } else {
        if ((pp = strchr(mbox, '!'))) {
            *pp++ = '\0';
            mp->m_mbox = getcpy (pp);
            mp->m_host = getcpy (mbox);
            mp->m_type = UUCPHOST;
-       }
-       else {
+       } 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 */
-           {
+           } else {
                mp->m_host = route ? NULL : getcpy (dfhost);
                mp->m_type = route ? NETHOST : dftype;
            }
        }
-       goto got_host;
     }
 
-    if (wanthost == AD_NHST)
-       mp->m_type = !strcasecmp (LocalName (), 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 */
+    /* For alternate mailboxes, m_type gets overwritten in ismymbox ()
+       to support wild-card matching. */
 
-got_host: ;
     if (route)
        mp->m_path = getcpy (route);
     mp->m_ingrp = ingrp;
@@ -268,18 +238,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)
@@ -306,35 +272,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 *local, char *domain)
+getlocaladdr(void)
 {
-    static char addr[BUFSIZ];
+    char        *username;
 
-    if (local == NULL)
-#ifdef REALLYDUMB
-       return getusername ();
-    else
-#endif /* REALLYDUMB */
-       local = getusername ();
-
-    if (domain == NULL)
-#ifdef REALLYDUMB
-       return local;
-    else
-#endif /* REALLYDUMB */
-       domain = LocalName ();
+    username = getusername();
 
-#ifndef        BANG
-    snprintf (addr, sizeof(addr), "%s@%s", local, domain);
-#else /* BANG */
-    snprintf (addr, sizeof(addr), "%s!%s", domain, local);
-#endif /* BANG */
-
-    return addr;
+    return username;
 }
 
 
@@ -361,7 +312,8 @@ ismymbox (struct mailname *np)
     char buffer[BUFSIZ];
     struct mailname *mp;
     static char *am = NULL;
-    static struct mailname mq={NULL};
+    static struct mailname mq;
+    static int localmailbox = 0;
 
     /*
      * If this is the first call, initialize
@@ -370,10 +322,34 @@ ismymbox (struct mailname *np)
     if (am == NULL) {
        mq.m_next = NULL;
        mq.m_mbox = getusername ();
+
+       if ((am = context_find ("local-mailbox"))) {
+
+           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;
+           }
+
+           /*
+            * 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)
+               ;
+       }
+
        if ((am = context_find ("alternate-mailboxes")) == NULL)
            am = getusername();
        else {
-           mp = &mq;
+           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) {
@@ -400,40 +376,52 @@ ismymbox (struct mailname *np)
                            *cp = '\0';
                        }
                    }
-                   if ((cp = getenv ("MHWDEBUG")) && *cp)
-                       fprintf (stderr, "mbox=\"%s\" host=\"%s\" %s\n",
-                           mp->m_mbox, mp->m_host,
-                           snprintb (buffer, sizeof(buffer), (unsigned) mp->m_type, WBITS));
                }
            }
            if (oops)
                advise (NULL, "please fix the %s: entry in your %s file",
                        "alternate-mailboxes", mh_profile);
        }
+
+       if ((cp = getenv ("MHWDEBUG")) && *cp) {
+           for (mp = &mq; mp; mp = mp->m_next) {
+             fprintf (stderr, "Local- or Alternate-Mailbox: text=\"%s\" "
+                      "mbox=\"%s\" host=\"%s\" %s\n",
+                      mp->m_text ? mp->m_text : "", mp->m_mbox,
+                      mp->m_host ? mp->m_host : "",
+                      snprintb (buffer, sizeof(buffer), (unsigned) mp->m_type,
+                                WBITS));
+           }
+       }
     }
 
     if (np == NULL) /* XXX */
        return 0;
     
-    switch (np->m_type) {
-       case NETHOST:
-           len = strlen (cp = LocalName ());
-           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 (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 (!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
@@ -442,17 +430,16 @@ 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) {
            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: 
@@ -474,11 +461,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: