]> diplodocus.org Git - nmh/blobdiff - uip/post.c
Make sure stderr is directed to terminal, as well as stdin and
[nmh] / uip / post.c
index 6482d1d000a6f1ceaeb3951afdd54d4982febc36..db9c02986cb078f223045c404af0588762e57fdf 100644 (file)
@@ -276,7 +276,7 @@ static char *partno = NULL;
 /*
  * static prototypes
  */
 /*
  * static prototypes
  */
-static void putfmt (char *, char *, FILE *);
+static void putfmt (char *, char *, int *, FILE *);
 static void start_headers (void);
 static void finish_headers (FILE *);
 static int get_header (char *, struct headers *);
 static void start_headers (void);
 static void finish_headers (FILE *);
 static int get_header (char *, struct headers *);
@@ -288,14 +288,14 @@ static void anno (void);
 static int annoaux (struct mailname *);
 static void insert_fcc (struct headers *, char *);
 static void make_bcc_file (int);
 static int annoaux (struct mailname *);
 static void insert_fcc (struct headers *, char *);
 static void make_bcc_file (int);
-static void verify_all_addresses (int, char *, int, char *);
+static void verify_all_addresses (int, int, char *, int, char *);
 static void chkadr (void);
 static void sigon (void);
 static void sigoff (void);
 static void p_refile (char *);
 static void fcc (char *, char *);
 static void die (char *, char *, ...);
 static void chkadr (void);
 static void sigon (void);
 static void sigoff (void);
 static void p_refile (char *);
 static void fcc (char *, char *);
 static void die (char *, char *, ...);
-static void post (char *, int, int, char *, int, char *);
+static void post (char *, int, int, int, char *, int, char *);
 static void do_text (char *file, int fd);
 static void do_an_address (struct mailname *, int);
 static void do_addresses (int, int);
 static void do_text (char *file, int fd);
 static void do_an_address (struct mailname *, int);
 static void do_addresses (int, int);
@@ -306,6 +306,7 @@ int
 main (int argc, char **argv)
 {
     int state, compnum, dashstuff = 0, swnum, oauth_flag = 0;
 main (int argc, char **argv)
 {
     int state, compnum, dashstuff = 0, swnum, oauth_flag = 0;
+    int eai = 0; /* use Email Address Internationalization (EAI) (SMTPUTF8) */
     char *cp, *msg = NULL, **argp, **arguments, *envelope;
     char buf[BUFSIZ], name[NAMESZ], *auth_svc = NULL;
     FILE *in, *out;
     char *cp, *msg = NULL, **argp, **arguments, *envelope;
     char buf[BUFSIZ], name[NAMESZ], *auth_svc = NULL;
     FILE *in, *out;
@@ -313,7 +314,7 @@ main (int argc, char **argv)
 
     if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
 
 
     if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
 
-    mts_init (invo_name);
+    mts_init ();
     arguments = getarguments (invo_name, argc, argv, 0);
     argp = arguments;
 
     arguments = getarguments (invo_name, argc, argv, 0);
     argp = arguments;
 
@@ -602,14 +603,14 @@ main (int argc, char **argv)
        switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
            case FLD: 
            case FLDPLUS: 
        switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
            case FLD: 
            case FLDPLUS: 
-               compnum++;
+                compnum++;
                cp = add (buf, NULL);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
                    state = m_getfld (&gstate, name, buf, &bufsz, in);
                    cp = add (buf, cp);
                }
                cp = add (buf, NULL);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
                    state = m_getfld (&gstate, name, buf, &bufsz, in);
                    cp = add (buf, cp);
                }
-               putfmt (name, cp, out);
+               putfmt (name, cp, &eai, out);
                free (cp);
                continue;
 
                free (cp);
                continue;
 
@@ -711,7 +712,7 @@ main (int argc, char **argv)
     /* If we are doing a "whom" check */
     if (whomsw) {
        /* This won't work with MTS_SENDMAIL_PIPE. */
     /* If we are doing a "whom" check */
     if (whomsw) {
        /* This won't work with MTS_SENDMAIL_PIPE. */
-        verify_all_addresses (1, envelope, oauth_flag, auth_svc);
+        verify_all_addresses (1, eai, envelope, oauth_flag, auth_svc);
        done (0);
     }
 
        done (0);
     }
 
@@ -723,14 +724,15 @@ main (int argc, char **argv)
                   verify_all_addresses with MTS_SENDMAIL_PIPE, but
                   that might require running sendmail as root.  Note
                   that spost didn't verify addresses. */
                   verify_all_addresses with MTS_SENDMAIL_PIPE, but
                   that might require running sendmail as root.  Note
                   that spost didn't verify addresses. */
-               verify_all_addresses (verbose, envelope, oauth_flag, auth_svc);
+               verify_all_addresses (verbose, eai, envelope, oauth_flag,
+                                      auth_svc);
            }
            }
-           post (tmpfil, 0, verbose, envelope, oauth_flag, auth_svc);
+           post (tmpfil, 0, verbose, eai, envelope, oauth_flag, auth_svc);
        }
        }
-       post (bccfil, 1, verbose, envelope, oauth_flag, auth_svc);
+       post (bccfil, 1, verbose, eai, envelope, oauth_flag, auth_svc);
        (void) m_unlink (bccfil);
     } else {
        (void) m_unlink (bccfil);
     } else {
-       post (tmpfil, 0, isatty (1), envelope, oauth_flag, auth_svc);
+       post (tmpfil, 0, isatty (1), eai, envelope, oauth_flag, auth_svc);
     }
 
     p_refile (tmpfil);
     }
 
     p_refile (tmpfil);
@@ -753,7 +755,7 @@ main (int argc, char **argv)
  */
 
 static void
  */
 
 static void
-putfmt (char *name, char *str, FILE *out)
+putfmt (char *name, char *str, int *eai, FILE *out)
 {
     int count, grp, i, keep;
     char *cp, *pp, *qp;
 {
     int count, grp, i, keep;
     char *cp, *pp, *qp;
@@ -770,8 +772,24 @@ putfmt (char *name, char *str, FILE *out)
        return;
     }
 
        return;
     }
 
+    if (! *eai) {
+        /* Check each header field value to see if it has any 8-bit characters.
+           If it does, enable EAI support. */
+        if (contains8bit(str, NULL)) {
+            if (verbose) {
+                printf ("EAI/SMTPUTF8 enabled\n");
+            }
+
+            /* Enable SMTPUTF8. */
+            *eai = 1;
+
+            /* Enable passing of utf-8 setting to getname()/getadrx(). */
+            enable_eai();
+        }
+    }
+
     if ((i = get_header (name, hdrtab)) == NOTOK) {
     if ((i = get_header (name, hdrtab)) == NOTOK) {
-       if (strncasecmp (name, "nmh-", 4)) {
+        if (strncasecmp (name, "nmh-", 4)) {
            fprintf (out, "%s: %s", name, str);
        } else {
            /* Filter out all Nmh-* headers, because Norm asked.  They
            fprintf (out, "%s: %s", name, str);
        } else {
            /* Filter out all Nmh-* headers, because Norm asked.  They
@@ -819,7 +837,8 @@ putfmt (char *name, char *str, FILE *out)
     }
 
     tmpaddrs.m_next = NULL;
     }
 
     tmpaddrs.m_next = NULL;
-    for (count = 0; (cp = getname (str)); count++)
+
+    for (count = 0; (cp = getname (str)); count++) {
        if ((mp = getm (cp, NULL, 0, error, sizeof(error)))) {
            if (tmpaddrs.m_next)
                np->m_next = mp;
        if ((mp = getm (cp, NULL, 0, error, sizeof(error)))) {
            if (tmpaddrs.m_next)
                np->m_next = mp;
@@ -834,6 +853,7 @@ putfmt (char *name, char *str, FILE *out)
            else
                badmsg++;
        }
            else
                badmsg++;
        }
+    }
 
     if (count < 1) {
        if (hdr->flags & HNIL)
 
     if (count < 1) {
        if (hdr->flags & HNIL)
@@ -1577,8 +1597,8 @@ do_addresses (int bccque, int talk)
  */
 
 static void
  */
 
 static void
-post (char *file, int bccque, int talk, char *envelope, int oauth_flag,
-      char *auth_svc)
+post (char *file, int bccque, int talk, int eai, char *envelope,
+      int oauth_flag, char *auth_svc)
 {
     int fd;
     int        retval, i;
 {
     int fd;
     int        retval, i;
@@ -1626,11 +1646,12 @@ post (char *file, int bccque, int talk, char *envelope, int oauth_flag,
                break;
        }
     } else {
                break;
        }
     } else {
-        if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
-                                        verbose, snoop, sasl, saslmech, user,
+       if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
+                                       verbose, snoop, sasl, saslmech, user,
                                        oauth_flag ? auth_svc : NULL, tls))
                                        oauth_flag ? auth_svc : NULL, tls))
-            || rp_isbad (retval = sm_winit (envelope)))
+            || rp_isbad (retval = sm_winit (envelope, eai))) {
            die (NULL, "problem initializing server; %s", rp_string (retval));
            die (NULL, "problem initializing server; %s", rp_string (retval));
+       }
 
         do_addresses (bccque, talk && verbose);
         if ((fd = open (file, O_RDONLY)) == NOTOK)
 
         do_addresses (bccque, talk && verbose);
         if ((fd = open (file, O_RDONLY)) == NOTOK)
@@ -1658,19 +1679,22 @@ post (char *file, int bccque, int talk, char *envelope, int oauth_flag,
 /* Address Verification */
 
 static void
 /* Address Verification */
 
 static void
-verify_all_addresses (int talk, char *envelope, int oauth_flag, char *auth_svc)
+verify_all_addresses (int talk, int eai, char *envelope, int oauth_flag,
+                      char *auth_svc)
 {
     int retval;
     struct mailname *lp;
 
     sigon ();
 
 {
     int retval;
     struct mailname *lp;
 
     sigon ();
 
-    if (!whomsw || checksw)
+    if (!whomsw || checksw) {
        if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
                                        verbose, snoop, sasl, saslmech, user,
                                        oauth_flag ? auth_svc : NULL, tls))
        if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
                                        verbose, snoop, sasl, saslmech, user,
                                        oauth_flag ? auth_svc : NULL, tls))
-               || rp_isbad (retval = sm_winit (envelope)))
+               || rp_isbad (retval = sm_winit (envelope, eai))) {
            die (NULL, "problem initializing server; %s", rp_string (retval));
            die (NULL, "problem initializing server; %s", rp_string (retval));
+       }
+    }
 
     if (talk && !whomsw)
        printf (" -- Address Verification --\n");
 
     if (talk && !whomsw)
        printf (" -- Address Verification --\n");