]> diplodocus.org Git - nmh/blobdiff - sbr/addrsbr.c
Fix C-T-E of message, as well as multipart, types to be 7bit, 8bit,
[nmh] / sbr / addrsbr.c
index a073e70768be633a66e68d16ab6d0f6138c33c5c..6bb94211f4f6b04828ce2c4cf994eb7bd005355f 100644 (file)
@@ -11,6 +11,7 @@
 #include <h/addrsbr.h>
 #include <h/mf.h>
 #include <h/mts.h>
+#include <h/utils.h>
 
 /* High level parsing of addresses:
 
@@ -48,7 +49,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
-   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
@@ -75,18 +76,24 @@ static char *grp = NULL;
 static char *note = NULL;
 static char err[BUFSIZ];
 static char adr[BUFSIZ];
+static int eai = 0;
+
+void
+enable_eai() {
+    eai = 1;
+}
 
 
 char *
 getname (const char *addrs)
 {
     struct adrx *ap;
-
     pers = mbox = host = route = grp = note = NULL;
     err[0] = '\0';
 
-    if ((ap = getadrx (addrs ? addrs : "")) == NULL)
+    if ((ap = getadrx (addrs ? addrs : "", eai)) == NULL) {
        return NULL;
+    }
 
     strncpy (adr, ap->text, sizeof(adr));
     pers = ap->pers;
@@ -104,35 +111,32 @@ getname (const char *addrs)
 
 
 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]) {
-       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) {
-       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) {
-       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;
     }
 
@@ -141,13 +145,13 @@ getm (char *str, char *dfhost, int dftype, int wanthost, char *eresult)
        dftype = LOCALHOST;
     }
 
-    mp = (struct mailname *) calloc ((size_t) 1, sizeof(*mp));
+    mp = (struct mailname *) mh_xcalloc ((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");
+       if (eresult) {
+           strncpy (eresult, "insufficient memory to represent address",
+                    eresultsize);
+           eresult[eresultsize - 1] = '\0';
+       }
        return NULL;
     }
 
@@ -242,10 +246,13 @@ auxformat (struct mailname *mp, int extras)
            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
+       if (mp->m_type != UUCPHOST) {
+           if (mp->m_host)
+               snprintf (addr, sizeof(addr), "%s%s@%s", empty(mp->m_path),
+                         empty(mp->m_mbox), mp->m_host);
+           else snprintf (addr, sizeof(addr), "%s%s", empty(mp->m_path),
+                          empty(mp->m_mbox));
+       } else
            snprintf (addr, sizeof(addr), "%s!%s", mp->m_host, mp->m_mbox);
 
     if (!extras)
@@ -314,7 +321,7 @@ ismymbox (struct mailname *np)
                return 0;
            }
 
-           if ((mq.m_next = getm (cp, NULL, 0, AD_NAME, NULL)) == NULL) {
+           if ((mq.m_next = getm (cp, NULL, 0, NULL, 0)) == NULL) {
                admonish (NULL, "invalid entry in local-mailbox: %s", cp);
                return 0;
            }
@@ -334,7 +341,7 @@ ismymbox (struct mailname *np)
            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) {
+               if ((mp->m_next = getm (cp, NULL, 0, NULL, 0)) == NULL) {
                    admonish (NULL, "illegal address: %s", cp);
                    oops++;
                } else {
@@ -412,7 +419,8 @@ 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) {
@@ -436,7 +444,7 @@ local_test: ;
 
        if (mp->m_nohost)
            return 1;
-       if (np->m_host == NULL)
+       if (np->m_host == NULL || mp->m_host == NULL)
            continue;
        if ((len = strlen (cp = np->m_host))
                < (i = strlen (pp = mp->m_host)))