]> diplodocus.org Git - nmh/blobdiff - sbr/addrsbr.c
crawl_folders.h: Base header on implementation.
[nmh] / sbr / addrsbr.c
index a073e70768be633a66e68d16ab6d0f6138c33c5c..9b2973a369fc8c77d4a9671213495096d91eb025 100644 (file)
@@ -1,16 +1,21 @@
-
-/*
- * addrsbr.c -- parse addresses 822-style
+/* addrsbr.c -- parse addresses 822-style
  *
  * 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.
  */
 
  *
  * 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 <h/mf.h>
-#include <h/mts.h>
+#include "h/mh.h"
+#include "snprintb.h"
+#include "strindex.h"
+#include "uprf.h"
+#include "getcpy.h"
+#include "context_find.h"
+#include "error.h"
+#include "h/addrsbr.h"
+#include "h/mf.h"
+#include "h/mts.h"
+#include "h/utils.h"
 
 /* High level parsing of addresses:
 
 
 /* High level parsing of addresses:
 
    REALLYDUMB are now the default in the code.
 
    If #ifdef DUMB is in effect, a full 822-style parser is called
    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.
+   for syntax recognition.  This breaks each address into its components.
    Note however that no semantics are assumed about the parts or their
    totality.  This means that implicit hostnames aren't made explicit,
    Note however that no semantics are assumed about the parts or their
    totality.  This means that implicit hostnames aren't made explicit,
-   and explicit hostnames aren't expanded to their "official" represenations.
+   and explicit hostnames aren't expanded to their "official" representations.
 
    If DUMB is not in effect, then this module does some
    high-level thinking about what the addresses are.
 
    If DUMB is not in effect, then this module does some
    high-level thinking about what the addresses are.
@@ -48,7 +53,7 @@
 
    If an explicit host is not present, then MH checks for a bang to indicate
    an explicit UUCP-style address.  If so, this is noted.  If not, the host is
 
    If an explicit host is not present, then MH checks for a bang to indicate
    an explicit UUCP-style address.  If so, this is noted.  If not, the host is
-   defaulted, typically to the local host.  The lack of an explict host is
+   defaulted, typically to the local host.  The lack of an explicit host is
    also noted.
 
    If an explicit 822-style host is present, then MH checks to see if it
    also noted.
 
    If an explicit 822-style host is present, then MH checks to see if it
@@ -75,18 +80,25 @@ static char *grp = NULL;
 static char *note = NULL;
 static char err[BUFSIZ];
 static char adr[BUFSIZ];
 static char *note = NULL;
 static char err[BUFSIZ];
 static char adr[BUFSIZ];
+static int eai = 0;
+
+void
+enable_eai(void)
+{
+    eai = 1;
+}
 
 
 char *
 getname (const char *addrs)
 {
     struct adrx *ap;
 
 
 char *
 getname (const char *addrs)
 {
     struct adrx *ap;
-
     pers = mbox = host = route = grp = note = NULL;
     err[0] = '\0';
 
     pers = mbox = host = route = grp = note = NULL;
     err[0] = '\0';
 
-    if ((ap = getadrx (addrs ? addrs : "")) == NULL)
+    if ((ap = getadrx (FENDNULL(addrs), eai)) == NULL) {
        return NULL;
        return NULL;
+    }
 
     strncpy (adr, ap->text, sizeof(adr));
     pers = ap->pers;
 
     strncpy (adr, ap->text, sizeof(adr));
     pers = ap->pers;
@@ -104,35 +116,32 @@ getname (const char *addrs)
 
 
 struct mailname *
 
 
 struct mailname *
-getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
+getm (char *str, char *dfhost, int dftype, char *eresult, size_t eresultsize)
 {
     char *pp;
     struct mailname *mp;
 
     if (err[0]) {
 {
     char *pp;
     struct mailname *mp;
 
     if (err[0]) {
-       if (eresult)
-           strcpy (eresult, err);
-       else
-           if (wanthost == AD_HOST)
-               admonish (NULL, "bad address '%s' - %s", str, err);
+       if (eresult) {
+           strncpy (eresult, err, eresultsize);
+           eresult[eresultsize - 1] = '\0';
+       }
        return NULL;
     }
     if (pers == NULL
            && mbox == NULL && host == NULL && route == NULL
            && grp == NULL) {
        return NULL;
     }
     if (pers == NULL
            && mbox == NULL && host == NULL && route == NULL
            && grp == NULL) {
-       if (eresult)
-           strcpy (eresult, "null address");
-       else
-           if (wanthost == AD_HOST)
-               admonish (NULL, "null address '%s'", str);
+       if (eresult) {
+           strncpy (eresult, "null address", eresultsize);
+           eresult[eresultsize - 1] = '\0';
+       }
        return NULL;
     }
     if (mbox == NULL && grp == NULL) {
        return NULL;
     }
     if (mbox == NULL && grp == NULL) {
-       if (eresult)
-           strcpy (eresult, "no mailbox in address");
-       else
-           if (wanthost == AD_HOST)
-               admonish (NULL, "no mailbox in address '%s'", str);
+       if (eresult) {
+           strncpy (eresult, "no mailbox in address", eresultsize);
+           eresult[eresultsize - 1] = '\0';
+       }
        return NULL;
     }
 
        return NULL;
     }
 
@@ -141,20 +150,11 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
        dftype = LOCALHOST;
     }
 
        dftype = LOCALHOST;
     }
 
-    mp = (struct mailname *) calloc ((size_t) 1, sizeof(*mp));
-    if (mp == NULL) {
-       if (eresult)
-          strcpy (eresult, "insufficient memory to represent address");
-       else
-           if (wanthost == AD_HOST)
-               adios (NULL, "insufficient memory to represent address");
-       return NULL;
-    }
-
+    NEW0(mp);
     mp->m_next = NULL;
     mp->m_text = getcpy (str);
     if (pers)
     mp->m_next = NULL;
     mp->m_text = getcpy (str);
     if (pers)
-       mp->m_pers = getcpy (pers);
+       mp->m_pers = mh_xstrdup(pers);
 
     if (mbox == NULL) {
        mp->m_type = BADHOST;
 
     if (mbox == NULL) {
        mp->m_type = BADHOST;
@@ -162,19 +162,19 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
        mp->m_ingrp = ingrp;
        mp->m_gname = getcpy (grp);
        if (note)
        mp->m_ingrp = ingrp;
        mp->m_gname = getcpy (grp);
        if (note)
-           mp->m_note = getcpy (note);
+           mp->m_note = mh_xstrdup(note);
        return mp;
     }
 
     if (host) {
        mp->m_mbox = getcpy (mbox);
        return mp;
     }
 
     if (host) {
        mp->m_mbox = getcpy (mbox);
-       mp->m_host = getcpy (host);
+       mp->m_host = mh_xstrdup(host);
        mp->m_type =
            strcasecmp (LocalName(0), mp->m_host) ? NETHOST : LOCALHOST;
     } else {
        if ((pp = strchr(mbox, '!'))) {
            *pp++ = '\0';
        mp->m_type =
            strcasecmp (LocalName(0), mp->m_host) ? NETHOST : LOCALHOST;
     } else {
        if ((pp = strchr(mbox, '!'))) {
            *pp++ = '\0';
-           mp->m_mbox = getcpy (pp);
+           mp->m_mbox = mh_xstrdup(pp);
            mp->m_host = getcpy (mbox);
            mp->m_type = UUCPHOST;
        } else {
            mp->m_host = getcpy (mbox);
            mp->m_type = UUCPHOST;
        } else {
@@ -194,12 +194,12 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
        to support wild-card matching. */
 
     if (route)
        to support wild-card matching. */
 
     if (route)
-       mp->m_path = getcpy (route);
+       mp->m_path = mh_xstrdup(route);
     mp->m_ingrp = ingrp;
     if (grp)
     mp->m_ingrp = ingrp;
     if (grp)
-       mp->m_gname = getcpy (grp);
+       mp->m_gname = mh_xstrdup(grp);
     if (note)
     if (note)
-       mp->m_note = getcpy (note);
+       mp->m_note = mh_xstrdup(note);
 
     return mp;
 }
 
     return mp;
 }
@@ -211,26 +211,17 @@ mnfree (struct mailname *mp)
     if (!mp)
        return;
 
     if (!mp)
        return;
 
-    if (mp->m_text)
-       free (mp->m_text);
-    if (mp->m_pers)
-       free (mp->m_pers);
-    if (mp->m_mbox)
-       free (mp->m_mbox);
-    if (mp->m_host)
-       free (mp->m_host);
-    if (mp->m_path)
-       free (mp->m_path);
-    if (mp->m_gname)
-       free (mp->m_gname);
-    if (mp->m_note)
-       free (mp->m_note);
-
-    free ((char *) mp);
-}
+    free(mp->m_text);
+    free(mp->m_pers);
+    free(mp->m_mbox);
+    free(mp->m_host);
+    free(mp->m_path);
+    free(mp->m_gname);
+    free(mp->m_note);
 
 
+    free(mp);
+}
 
 
-#define empty(s) ((s) ? (s) : "")
 
 char *
 auxformat (struct mailname *mp, int extras)
 
 char *
 auxformat (struct mailname *mp, int extras)
@@ -239,13 +230,14 @@ auxformat (struct mailname *mp, int extras)
     static char buffer[BUFSIZ];
 
        if (mp->m_nohost)
     static char buffer[BUFSIZ];
 
        if (mp->m_nohost)
-           strncpy (addr, mp->m_mbox ? mp->m_mbox : "", sizeof(addr));
-       else
-
-       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
+           strncpy (addr, FENDNULL(mp->m_mbox), sizeof(addr));
+       else if (mp->m_type != UUCPHOST) {
+           if (mp->m_host)
+               snprintf (addr, sizeof(addr), "%s%s@%s", FENDNULL(mp->m_path),
+                         FENDNULL(mp->m_mbox), mp->m_host);
+           else snprintf (addr, sizeof(addr), "%s%s", FENDNULL(mp->m_path),
+                          FENDNULL(mp->m_mbox));
+       } else
            snprintf (addr, sizeof(addr), "%s!%s", mp->m_host, mp->m_mbox);
 
     if (!extras)
            snprintf (addr, sizeof(addr), "%s!%s", mp->m_host, mp->m_mbox);
 
     if (!extras)
@@ -260,12 +252,10 @@ auxformat (struct mailname *mp, int extras)
            snprintf (buffer, sizeof(buffer), "%s <%s>",
                    legal_person (mp->m_pers ? mp->m_pers : mp->m_mbox),
                    addr);
            snprintf (buffer, sizeof(buffer), "%s <%s>",
                    legal_person (mp->m_pers ? mp->m_pers : mp->m_mbox),
                    addr);
-    }
+    } else if (mp->m_note)
+        snprintf (buffer, sizeof(buffer), "%s %s", addr, mp->m_note);
     else
     else
-       if (mp->m_note)
-           snprintf (buffer, sizeof(buffer), "%s %s", addr, mp->m_note);
-       else
-           strncpy (buffer, addr, sizeof(buffer));
+        strncpy (buffer, addr, sizeof(buffer));
 
     return buffer;
 }
 
     return buffer;
 }
@@ -284,18 +274,18 @@ auxformat (struct mailname *mp, int extras)
  * Check if this is my address
  */
 
  * Check if this is my address
  */
 
-int
+bool
 ismymbox (struct mailname *np)
 {
 ismymbox (struct mailname *np)
 {
-    int oops;
-    register int len, i;
-    register char *cp;
-    register char *pp;
+    bool oops;
+    int len, i;
+    char *cp;
+    char *pp;
     char buffer[BUFSIZ];
     struct mailname *mp;
     static char *am = NULL;
     static struct mailname mq;
     char buffer[BUFSIZ];
     struct mailname *mp;
     static char *am = NULL;
     static struct mailname mq;
-    static int localmailbox = 0;
+    static bool localmailbox;
 
     /*
      * If this is the first call, initialize
 
     /*
      * If this is the first call, initialize
@@ -307,24 +297,21 @@ ismymbox (struct mailname *np)
 
        if ((am = context_find ("local-mailbox"))) {
 
 
        if ((am = context_find ("local-mailbox"))) {
 
-           localmailbox++;
+           localmailbox = true;
 
            if ((cp = getname(am)) == NULL) {
 
            if ((cp = getname(am)) == NULL) {
-               admonish (NULL, "Unable to find address in local-mailbox");
-               return 0;
+               inform("Unable to find address in local-mailbox, continuing...");
+               return false;
            }
 
            }
 
-           if ((mq.m_next = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) {
-               admonish (NULL, "invalid entry in local-mailbox: %s", cp);
-               return 0;
+           if ((mq.m_next = getm (cp, NULL, 0, NULL, 0)) == NULL) {
+                inform("invalid entry in local-mailbox: %s, continuing...", cp);
+               return false;
            }
 
            }
 
-           /*
-            * 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)
+           /* Sigh, it turns out that the address parser gets messed up
+            * if you don't call getname() until it returns NULL. */
+           while (getname(am) != NULL)
                ;
        }
 
                ;
        }
 
@@ -332,11 +319,11 @@ ismymbox (struct mailname *np)
            am = getusername();
        else {
            mp = mq.m_next ? mq.m_next : &mq;
            am = getusername();
        else {
            mp = mq.m_next ? mq.m_next : &mq;
-           oops = 0;
+           oops = false;
            while ((cp = getname (am))) {
            while ((cp = getname (am))) {
-               if ((mp->m_next = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) {
-                   admonish (NULL, "illegal address: %s", cp);
-                   oops++;
+               if ((mp->m_next = getm (cp, NULL, 0, NULL, 0)) == NULL) {
+                   inform("illegal address: %s, continuing...", cp);
+                   oops = true;
                } else {
                    mp = mp->m_next;
                    mp->m_type = W_NIL;
                } else {
                    mp = mp->m_next;
                    mp->m_type = W_NIL;
@@ -361,7 +348,7 @@ ismymbox (struct mailname *np)
                }
            }
            if (oops)
                }
            }
            if (oops)
-               advise (NULL, "please fix the %s: entry in your %s file",
+               inform("please fix the %s: entry in your %s file",
                        "alternate-mailboxes", mh_profile);
        }
 
                        "alternate-mailboxes", mh_profile);
        }
 
@@ -369,8 +356,8 @@ ismymbox (struct mailname *np)
            for (mp = &mq; mp; mp = mp->m_next) {
              fprintf (stderr, "Local- or Alternate-Mailbox: text=\"%s\" "
                       "mbox=\"%s\" host=\"%s\" %s\n",
            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 : "",
+                      FENDNULL(mp->m_text), mp->m_mbox,
+                      FENDNULL(mp->m_host),
                       snprintb (buffer, sizeof(buffer), (unsigned) mp->m_type,
                                 WBITS));
            }
                       snprintb (buffer, sizeof(buffer), (unsigned) mp->m_type,
                                 WBITS));
            }
@@ -378,7 +365,7 @@ ismymbox (struct mailname *np)
     }
 
     if (np == NULL) /* XXX */
     }
 
     if (np == NULL) /* XXX */
-       return 0;
+       return false;
     
     /*
      * Don't perform this "local" test if we have a Local-Mailbox set
     
     /*
      * Don't perform this "local" test if we have a Local-Mailbox set
@@ -394,11 +381,12 @@ ismymbox (struct mailname *np)
 
            case UUCPHOST:
                if (strcasecmp (np->m_host, SystemName()))
 
            case UUCPHOST:
                if (strcasecmp (np->m_host, SystemName()))
-                   break;              /* fall */
+                   break;
+                   /* FALLTHRU */
            case LOCALHOST:
 local_test: ;
                if (!strcasecmp (np->m_mbox, mq.m_mbox))
            case LOCALHOST:
 local_test: ;
                if (!strcasecmp (np->m_mbox, mq.m_mbox))
-                   return 1;
+                   return true;
                break;
 
            default:
                break;
 
            default:
@@ -412,7 +400,8 @@ local_test: ;
     for (mp = &mq; mp->m_next;) {
        mp = mp->m_next;
        if (!np->m_mbox)
     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) {
                < (i = strlen (pp = mp->m_mbox)))
            continue;
        switch (mp->m_type & W_MBOX) {
@@ -435,8 +424,8 @@ local_test: ;
        }
 
        if (mp->m_nohost)
        }
 
        if (mp->m_nohost)
-           return 1;
-       if (np->m_host == NULL)
+           return true;
+       if (np->m_host == NULL || mp->m_host == NULL)
            continue;
        if ((len = strlen (cp = np->m_host))
                < (i = strlen (pp = mp->m_host)))
            continue;
        if ((len = strlen (cp = np->m_host))
                < (i = strlen (pp = mp->m_host)))
@@ -459,8 +448,8 @@ local_test: ;
                    continue;
                break;
        }
                    continue;
                break;
        }
-       return 1;
+       return true;
     }
 
     }
 
-    return 0;
+    return false;
 }
 }