]> diplodocus.org Git - nmh/blobdiff - uip/post.c
uip: Replace some ints that are only ever 0 or 1 with bool.
[nmh] / uip / post.c
index ff12d0c9ae1cb770807c340fe6cb476deb242b77..2917945b9b61c2df81514db293739892134c7673 100644 (file)
 #include <h/aliasbr.h>
 #include <h/dropsbr.h>
 #include <h/mime.h>
+#include "h/done.h"
 #include <h/utils.h>
 #include <h/tws.h>
 #include <h/mts.h>
+#include "sbr/m_mktemp.h"
+#include "sbr/message_id.h"
 
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
@@ -227,7 +230,7 @@ static int unkadr = 0;              /* how many of those were unknown        */
 static int badadr = 0;         /* number of bad addrs                   */
 static int badmsg = 0;         /* message has bad semantics             */
 static int verbose = 0;                /* spell it out                          */
-static int format = 1;         /* format addresses                      */
+static bool format = true;     /* format addresses                      */
 static int mime = 0;           /* use MIME-style encapsulations for Bcc */
 static int msgid = 0;          /* add msgid                             */
 static int debug = 0;          /* debugging post                        */
@@ -288,8 +291,9 @@ static char *partno = NULL;
 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 int putadr (char *, char *, struct mailname *, FILE *, unsigned int);
+static int get_header (char *, struct headers *) PURE;
+static int putadr (char *, char *, struct mailname *, FILE *, unsigned int,
+                  char *, unsigned int);
 static void putgrp (char *, char *, FILE *, unsigned int);
 static int insert (struct mailname *);
 static void pl (void);
@@ -298,12 +302,12 @@ static int annoaux (struct mailname *);
 static void insert_fcc (struct headers *, char *);
 static void make_bcc_file (int);
 static void verify_all_addresses (int, int, char *, int, char *);
-static void chkadr (void);
+static void chkadr (void) PURE;
 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 fatal (char *, char *, ...) CHECK_PRINTF(2, 3);
 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);
@@ -320,9 +324,9 @@ main (int argc, char **argv)
     char *cp, *msg = NULL, **argp, **arguments, *envelope;
     char buf[NMH_BUFSIZ], name[NAMESZ], *auth_svc = NULL;
     FILE *in, *out;
-    m_getfld_state_t gstate = 0;
+    m_getfld_state_t gstate;
 
-    if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
+    if (nmh_init(argv[0], false, false)) { return 1; }
 
     mts_init ();
     arguments = getarguments (invo_name, argc, argv, 0);
@@ -335,7 +339,7 @@ main (int argc, char **argv)
                    ambigsw (cp, switches);
                    done (1);
                case UNKWNSW: 
-                   adios (NULL, "-%s unknown", cp);
+                   die("-%s unknown", cp);
 
                case HELPSW: 
                    snprintf (buf, sizeof(buf), "%s [switches] file", invo_name);
@@ -347,7 +351,7 @@ main (int argc, char **argv)
 
                case LIBSW:
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    /* create a minimal context */
                    if (context_foil (cp) == -1)
                        done (1);
@@ -355,9 +359,9 @@ main (int argc, char **argv)
 
                case ALIASW: 
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    if ((state = alias (cp)) != AK_OK)
-                       adios (NULL, "aliasing error in %s - %s",
+                       die("aliasing error in %s - %s",
                                cp, akerror (state));
                    continue;
 
@@ -378,7 +382,7 @@ main (int argc, char **argv)
 
                case FILTSW:
                    if (!(filter = *argp++) || *filter == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    mime = 0;
                    continue;
                case NFILTSW:
@@ -386,10 +390,10 @@ main (int argc, char **argv)
                    continue;
                
                case FRMTSW: 
-                   format++;
+                   format = true;
                    continue;
                case NFRMTSW: 
-                   format = 0;
+                   format = false;
                    continue;
 
                case BITSTUFFSW:
@@ -434,25 +438,25 @@ main (int argc, char **argv)
 
                case WIDTHSW: 
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    if ((outputlinelen = atoi (cp)) < 10)
-                       adios (NULL, "impossible width %d", outputlinelen);
+                       die("impossible width %d", outputlinelen);
                    continue;
 
                case ANNOSW: 
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    if ((pfd = atoi (cp)) <= 2)
-                       adios (NULL, "bad argument %s %s", argp[-2], cp);
+                       die("bad argument %s %s", argp[-2], cp);
                    continue;
 
                case CLIESW:
                    if (!(clientsw = *argp++) || *clientsw == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case SERVSW:
                    if (!(serversw = *argp++) || *serversw == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case SNOOPSW:
                    snoop++;
@@ -460,7 +464,7 @@ main (int argc, char **argv)
 
                case PARTSW:
                    if (!(partno = *argp++) || *partno == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
 
                case SASLSW:
@@ -473,12 +477,12 @@ main (int argc, char **argv)
 
                case SASLMECHSW:
                    if (!(saslmech = *argp++) || *saslmech == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
 
                case AUTHSERVICESW:
                    if (!(auth_svc = *argp++) || *auth_svc == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    oauth_flag++;
                    continue;
 
@@ -493,7 +497,7 @@ main (int argc, char **argv)
                    int i;
 
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
 
                    for (i = 0; oauthswitches[i].profname != NULL; i++) {
                        if (oauthswitches[i].switchnum == swnum) {
@@ -503,7 +507,7 @@ main (int argc, char **argv)
                    }
 
                    if (oauthswitches[i].profname == NULL)
-                       adios (NULL, "internal error: cannot map switch %s "
+                       die("internal error: cannot map switch %s "
                               "to profile entry", argp[-2]);
 
                    oauth_flag++;
@@ -512,12 +516,12 @@ main (int argc, char **argv)
 
                case USERSW:
                    if (!(user = *argp++) || *user == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
 
                case PORTSW:
                    if (!(port = *argp++) || *port == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
 
                case TLSSW:
@@ -542,56 +546,55 @@ main (int argc, char **argv)
 
                case FILEPROCSW:
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    fileproc = cp;
                    continue;
 
                case MHLPROCSW:
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    mhlproc = cp;
                    continue;
 
                case MTSSM:
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                     sendmail = cp;
                    continue;
 
                case MTSSW:
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                     save_mts_method (cp);
                    continue;
 
                case CREDENTIALSSW: {
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    add_profile_entry ("credentials", cp);
                    continue;
                }
 
                case MESSAGEIDSW:
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                     if (save_message_id_style (cp) != 0)
-                       adios (NULL, "unsupported messageid \"%s\"", cp);
+                       die("unsupported messageid \"%s\"", cp);
                    continue;
            }
        }
        if (msg)
-           adios (NULL, "only one message at a time!");
-       else
-           msg = cp;
+           die("only one message at a time!");
+        msg = cp;
     }
 
     alias (AliasFile);
 
     if (!msg)
-       adios (NULL, "usage: %s [switches] file", invo_name);
+       die("usage: %s [switches] file", invo_name);
 
     if (outputlinelen < 10)
-       adios (NULL, "impossible width %d", outputlinelen);
+       die("impossible width %d", outputlinelen);
 
     if ((in = fopen (msg, "r")) == NULL)
        adios (msg, "unable to open");
@@ -607,7 +610,7 @@ main (int argc, char **argv)
        } else {
            char *cp = m_mktemp2(NULL, invo_name, NULL, &out);
            if (cp == NULL) {
-               adios(NULL, "unable to create temporary file in %s",
+               die("unable to create temporary file in %s",
                      get_temp_dir());
            }
             strncpy(tmpfil, cp, sizeof(tmpfil));
@@ -616,16 +619,17 @@ main (int argc, char **argv)
 
     hdrtab = msgstate == NORMAL ? NHeaders : RHeaders;
 
+    gstate = m_getfld_state_init(in);
     for (compnum = 1;;) {
        int bufsz = sizeof buf;
-       switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
+       switch (state = m_getfld2(&gstate, name, buf, &bufsz)) {
            case FLD: 
            case FLDPLUS: 
                 compnum++;
                cp = mh_xstrdup(buf);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
-                   state = m_getfld (&gstate, name, buf, &bufsz, in);
+                   state = m_getfld2(&gstate, name, buf, &bufsz);
                    cp = add (buf, cp);
                }
                putfmt (name, cp, &eai, out);
@@ -639,7 +643,7 @@ main (int argc, char **argv)
                fprintf (out, "\n%s", buf);
                while (state == BODY) {
                    bufsz = sizeof buf;
-                   state = m_getfld (&gstate, name, buf, &bufsz, in);
+                   state = m_getfld2(&gstate, name, buf, &bufsz);
                    fputs (buf, out);
                }
                break;
@@ -650,10 +654,10 @@ main (int argc, char **argv)
 
            case LENERR: 
            case FMTERR: 
-               adios (NULL, "message format error in component #%d", compnum);
+               die("message format error in component #%d", compnum);
 
            default: 
-               adios (NULL, "getfld() returned %d", state);
+               die("getfld() returned %d", state);
        }
        break;
     }
@@ -666,9 +670,8 @@ main (int argc, char **argv)
     if (debug) {
        pl ();
        done (0);
-    } else {
-       fclose (out);
     }
+    fclose (out);
 
     /*
      * Here's how we decide which address to use as the envelope-from
@@ -724,7 +727,7 @@ main (int argc, char **argv)
        char sbuf[128];
 
        if (auth_svc == NULL) {
-           adios(NULL, "No authentication service given with -authservice");
+           die("No authentication service given with -authservice");
        }
 
        for (i = 0; oauthswitches[i].profname != NULL; i++) {
@@ -788,6 +791,8 @@ putfmt (char *name, char *str, int *eai, FILE *out)
     int count, grp, i, keep;
     char *cp, *pp, *qp;
     char namep[BUFSIZ], error[BUFSIZ];
+    char *savehdr = NULL;
+    unsigned int savehdrlen = 0;
     struct mailname *mp = NULL, *np = NULL;
     struct headers *hdr;
 
@@ -871,6 +876,19 @@ putfmt (char *name, char *str, int *eai, FILE *out)
        return;
     }
 
+    /*
+     * If this is a From:/Resent-From: header, save the full thing for
+     * later in case we need it for use when constructing a Bcc draft message.
+     * Because we want to capture the results of alias expansion, save
+     * the output from putadr().
+     */
+
+    if ((msgstate == RESENT) ? (hdr->set & MRFM) : (hdr->set & MFRM)) {
+       savehdr = fullfrom;
+       savehdr[0] = '\0';
+       savehdrlen = sizeof(fullfrom);
+    }
+
     tmpaddrs.m_next = NULL;
 
     for (count = 0; (cp = getname (str)); count++) {
@@ -971,9 +989,8 @@ putfmt (char *name, char *str, int *eai, FILE *out)
                    mp->m_bcc++;
                if (np->m_ingrp)
                    mp->m_ingrp = np->m_ingrp;
-               else
-                   if (mp->m_gname)
-                       putgrp (namep, mp->m_gname, out, hdr->flags);
+               else if (mp->m_gname)
+                    putgrp (namep, mp->m_gname, out, hdr->flags);
                if (mp->m_ingrp) {
                    if (sm_mts == MTS_SENDMAIL_PIPE) {
                        /* Catch this before sendmail chokes with:
@@ -983,14 +1000,14 @@ putfmt (char *name, char *str, int *eai, FILE *out)
                           aliases and put them in Bcc:, but then
                           they'd have the Blind-Carbon-Copy
                           indication. */
-                       adios (NULL,
-                              "blind lists not compatible with"
+                       die(                           "blind lists not compatible with"
                               " sendmail/pipe");
                    }
 
                    grp++;
                }
-               if (putadr (namep, qp, mp, out, hdr->flags))
+               if (putadr (namep, qp, mp, out, hdr->flags, savehdr,
+                           savehdrlen))
                    msgflags |= (hdr->set & (MVIS | MINV));
                else
                    mnfree (mp);
@@ -1039,7 +1056,7 @@ putfmt (char *name, char *str, int *eai, FILE *out)
                putgrp (namep, mp->m_gname, out, hdr->flags);
            if (mp->m_ingrp)
                grp++;
-           keep = putadr (namep, "", mp, out, hdr->flags);
+           keep = putadr (namep, "", mp, out, hdr->flags, savehdr, savehdrlen);
            np = mp->m_next;
            if (keep) {
                mp->m_next = NULL;
@@ -1050,17 +1067,11 @@ putfmt (char *name, char *str, int *eai, FILE *out)
        }
 
     /*
-     * If this is a From:/Resent-From: header, save the full thing for
-     * later in case we need it for use when constructing a Bcc draft message
+     * If it was a From header, strip off any trailing newlines from
+     * the alias-expanded From line.
      */
 
     if ((msgstate == RESENT) ? (hdr->set & MRFM) : (hdr->set & MFRM)) {
-       strncpy(fullfrom, str, sizeof(fullfrom));
-       fullfrom[sizeof(fullfrom) - 1] = 0;
-       /*
-        * Strip off any trailing newlines
-        */
-
        while (*fullfrom && fullfrom[strlen(fullfrom) - 1] == '\n') {
            fullfrom[strlen(fullfrom) - 1] = '\0';
        }
@@ -1199,9 +1210,9 @@ finish_headers (FILE *out)
     }
 
     if (badmsg)
-       adios (NULL, "re-format message and try again");
+       die("re-format message and try again");
     if (!recipients)
-       adios (NULL, "no addressees");
+       die("no addressees");
 }
 
 
@@ -1210,18 +1221,22 @@ get_header (char *header, struct headers *table)
 {
     struct headers *h;
 
+    header = FENDNULL(header);
     for (h = table; h->value; h++)
-       if (!strcasecmp (FENDNULL(header), FENDNULL(h->value)))
-           return (h - table);
+       if (!strcasecmp(FENDNULL(h->value), header))
+           return h - table;
 
     return NOTOK;
 }
 
 
 static int
-putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flags)
+putadr (char *name, char *aka, struct mailname *mp, FILE *out,
+       unsigned int flags, char *savehdr, unsigned int savehdrsize)
 {
     int len;
+    bool saveappend = false;
+    unsigned int shlen;
     char *cp;
     char buffer[BUFSIZ];
 
@@ -1236,6 +1251,11 @@ putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flag
        linepos += (nameoutput = strlen (name) + 2);
     }
 
+    if (savehdr) {
+       shlen = strlen(savehdr);
+       saveappend = true;
+    }
+
     if (*aka && mp->m_type != UUCPHOST && !mp->m_pers)
        mp->m_pers = mh_xstrdup(aka);
     if (format) {
@@ -1251,18 +1271,37 @@ putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flag
     len = strlen (cp);
 
     if (linepos != nameoutput) {
-       if (len + linepos + 2 > outputlinelen)
+       if (len + linepos + 2 > outputlinelen) {
            fprintf (out, ",\n%*s", linepos = nameoutput, "");
-       else {
+           if (saveappend) {
+               if (shlen + 2 + nameoutput + len >= savehdrsize) {
+                   saveappend = false;
+               } else {
+                   snprintf(savehdr + shlen, savehdrsize - shlen, ",\n%*s",
+                            linepos, "");
+               }
+           }
+       } else {
            fputs (", ", out);
            linepos += 2;
+           if (saveappend) {
+               if (shlen + 2 + len >= savehdrsize) {
+                   saveappend = false;
+               } else {
+                   strncat(savehdr, ", ", savehdrsize - shlen);
+               }
+           }
        }
     }
 
     fputs (cp, out);
+
+    if (saveappend && shlen + len < savehdrsize)
+       strncat(savehdr, cp, savehdrsize - shlen + len);
+
     linepos += len;
 
-    return (flags & HTRY);
+    return flags & HTRY;
 }
 
 
@@ -1331,26 +1370,26 @@ pl (void)
     int i;
     struct mailname *mp;
 
-    printf ("-------\n\t-- Addresses --\nlocal:\t");
+    fputs("-------\n\t-- Addresses --\nlocal:\t", stdout);
     for (mp = localaddrs.m_next; mp; mp = mp->m_next)
        printf ("%s%s%s", mp->m_mbox,
                mp->m_bcc ? "[BCC]" : "",
                mp->m_next ? ",\n\t" : "");
 
-    printf ("\nnet:\t");
+    fputs("\nnet:\t", stdout);
     for (mp = netaddrs.m_next; mp; mp = mp->m_next)
        printf ("%s%s@%s%s%s", FENDNULL(mp->m_path),
                mp->m_mbox, mp->m_host,
                mp->m_bcc ? "[BCC]" : "",
                mp->m_next ? ",\n\t" : "");
 
-    printf ("\nuucp:\t");
+    fputs("\nuucp:\t", stdout);
     for (mp = uuaddrs.m_next; mp; mp = mp->m_next)
        printf ("%s!%s%s%s", mp->m_host, mp->m_mbox,
                mp->m_bcc ? "[BCC]" : "",
                mp->m_next ? ",\n\t" : "");
 
-    printf ("\n\t-- Folder Copies --\nfcc:\t");
+    fputs("\n\t-- Folder Copies --\nfcc:\t", stdout);
     for (i = 0; i < fccind; i++)
        printf ("%s%s", fccfold[i], i + 1 < fccind ? ",\n\t" : "");
     putchar('\n');
@@ -1389,7 +1428,7 @@ annoaux (struct mailname *mp)
     snprintf (buffer, sizeof(buffer), "%s\n", adrformat (mp));
     i = strlen (buffer);
 
-    return (write (pfd, buffer, i) == i ? OK : NOTOK);
+    return write(pfd, buffer, i) == i ? OK : NOTOK;
 }
 
 
@@ -1408,7 +1447,7 @@ insert_fcc (struct headers *hdr, char *pp)
        return;
 
     if (fccind >= FCCS)
-       adios (NULL, "too many %ss", hdr->value);
+       die("too many %ss", hdr->value);
     fccfold[fccind++] = mh_xstrdup(cp);
 }
 
@@ -1426,7 +1465,7 @@ make_bcc_file (int dashstuff)
     char *tfile = NULL, *program;
 
     if ((tfile = m_mktemp2(NULL, "bccs", NULL, &out)) == NULL) {
-       adios(NULL, "unable to create temporary file in %s", get_temp_dir());
+       die("unable to create temporary file in %s", get_temp_dir());
     }
     strncpy (bccfil, tfile, sizeof(bccfil));
 
@@ -1451,15 +1490,14 @@ make_bcc_file (int dashstuff)
         * prefix and check again.
         */
        if ((cp = strchr(prefix, 'a')) == NULL)
-           adios (NULL, "lost prefix start");
+           die("lost prefix start");
        while (find_prefix () == NOTOK) {
            if (*cp < 'z')
                (*cp)++;
-           else
-               if (*++cp == 0)
-                   adios (NULL, "can't find a unique delimiter string");
-               else
-                   (*cp)++;
+           else if (*++cp == 0)
+                die("can't find a unique delimiter string");
+            else
+                (*cp)++;
        }
 
        fprintf (out, "%s: %s\n%s: multipart/digest; boundary=\"",
@@ -1476,8 +1514,7 @@ make_bcc_file (int dashstuff)
      * of MIME encapsulation.
      */
     if (filter != NULL) {
-       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-           sleep (5);
+       child_id = fork();
        switch (child_id) {
            case NOTOK: 
                adios ("fork", "unable to");
@@ -1501,7 +1538,7 @@ make_bcc_file (int dashstuff)
                execvp (program, vec);
                fprintf (stderr, "unable to exec ");
                perror (mhlproc);
-               _exit (-1);
+               _exit(1);
 
            default: 
                pidXwait (child_id, mhlproc);
@@ -1570,12 +1607,12 @@ static void
 chkadr (void)
 {
     if (badadr && unkadr)
-       die (NULL, "%d address%s unparsable, %d addressee%s undeliverable",
+       fatal (NULL, "%d address%s unparsable, %d addressee%s undeliverable",
                badadr, PLURALS(badadr), unkadr, PLURALS(badadr));
     if (badadr)
-       die (NULL, "%d address%s unparsable", badadr, PLURALS(badadr));
+       fatal (NULL, "%d address%s unparsable", badadr, PLURALS(badadr));
     if (unkadr)
-       die (NULL, "%d addressee%s undeliverable", unkadr, PLURALS(unkadr));
+       fatal (NULL, "%d addressee%s undeliverable", unkadr, PLURALS(unkadr));
 }
 
 
@@ -1616,7 +1653,7 @@ do_addresses (int bccque, int talk)
     chkadr ();
 
     if (rp_isbad (retval = sm_waend ()))
-       die (NULL, "problem ending addresses; %s", rp_string (retval));
+       fatal (NULL, "problem ending addresses; %s", rp_string (retval));
 }
 
 
@@ -1633,7 +1670,7 @@ static void
 post (char *file, int bccque, int talk, int eai, char *envelope,
       int oauth_flag, char *auth_svc)
 {
-    int        retval, i;
+    int retval;
     pid_t child_id;
 
     if (verbose) {
@@ -1650,8 +1687,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope,
        char **argp, *program;
        int argc;
 
-       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-           sleep (5);
+       child_id = fork();
        switch (child_id) {
            case NOTOK: 
                adios ("fork", "unable to");
@@ -1682,7 +1718,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope,
         int eightbit = 0;
 
         if (fd == NOTOK) {
-          die (file, "unable to re-open");
+          fatal (file, "unable to re-open");
         }
 
         if (msgflags & MMIM  &&  cte != UNKNOWN) {
@@ -1692,7 +1728,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope,
         } else {
             if (scan_input (fd, &eightbit) == NOTOK) {
                 close (fd);
-                die (file, "problem reading from");
+                fatal (file, "problem reading from");
             }
         }
 
@@ -1701,7 +1737,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope,
                                        oauth_flag ? auth_svc : NULL, tlsflag))
                || rp_isbad (retval = sm_winit (envelope, eai, eightbit))) {
            close (fd);
-           die (NULL, "problem initializing server; %s", rp_string (retval));
+           fatal (NULL, "problem initializing server; %s", rp_string (retval));
        }
 
         do_addresses (bccque, talk && verbose);
@@ -1744,7 +1780,7 @@ verify_all_addresses (int talk, int eai, char *envelope, int oauth_flag,
                                        verbose, snoop, sasl, saslmech, user,
                                        oauth_flag ? auth_svc : NULL, tlsflag))
                || rp_isbad (retval = sm_winit (envelope, eai, eightbit))) {
-           die (NULL, "problem initializing server; %s", rp_string (retval));
+           fatal (NULL, "problem initializing server; %s", rp_string (retval));
        }
     }
 
@@ -1770,7 +1806,7 @@ verify_all_addresses (int talk, int eai, char *envelope, int oauth_flag,
        puts(" -- Address Verification Successful --");
 
     if (!whomsw || checksw)
-       sm_end (DONE);
+       sm_end (whomsw ? OK : DONE);
 
     fflush (stdout);
     sigoff ();
@@ -1812,7 +1848,7 @@ do_an_address (struct mailname *lp, int talk)
        return;
     }
     if (talk)
-       printf (": ");
+       fputs(": ", stdout);
     fflush (stdout);
 
     switch (retval = sm_wadr (mbox, host,
@@ -1834,7 +1870,7 @@ do_an_address (struct mailname *lp, int talk)
        default: 
            if (!talk)
                fprintf (stderr, "  %s: ", addr);
-           die (NULL, "unexpected response; %s", rp_string (retval));
+           fatal (NULL, "unexpected response; %s", rp_string (retval));
     }
 
     fflush (stdout);
@@ -1847,15 +1883,15 @@ do_text (char *file, int fd)
     int retval, state;
     char buf[BUFSIZ];
 
-    lseek (fd, (off_t) 0, SEEK_SET);
+    lseek(fd, 0, SEEK_SET);
 
     while ((state = read (fd, buf, sizeof(buf))) > 0) {
        if (rp_isbad (retval = sm_wtxt (buf, state)))
-           die (NULL, "problem writing text; %s\n", rp_string (retval));
+           fatal (NULL, "problem writing text; %s\n", rp_string (retval));
     }
 
     if (state == NOTOK)
-       die (file, "problem reading from");
+       fatal (file, "problem reading from");
 
     switch (retval = sm_wtend ()) {
        case RP_OK: 
@@ -1863,11 +1899,11 @@ do_text (char *file, int fd)
 
        case RP_NO: 
        case RP_NDEL: 
-           die (NULL, "posting failed; %s", rp_string (retval));
-           /* FALLTHRU */
+           fatal (NULL, "posting failed; %s", rp_string (retval));
+           break;
 
        default: 
-           die (NULL, "unexpected response; %s", rp_string (retval));
+           fatal (NULL, "unexpected response; %s", rp_string (retval));
     }
 }
 
@@ -1946,7 +1982,7 @@ static void
 fcc (char *file, char *folder)
 {
     pid_t child_id;
-    int i, status, argp;
+    int status, argp;
     char fold[BUFSIZ];
     char **arglist, *program;
 
@@ -1954,9 +1990,7 @@ fcc (char *file, char *folder)
        printf ("  %sFcc %s: ", msgstate == RESENT ? "Resent-" : "", folder);
     fflush (stdout);
 
-    for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
-       sleep (5);
-
+    child_id = fork();
     switch (child_id) {
        case NOTOK: 
            if (!verbose)
@@ -1979,7 +2013,7 @@ fcc (char *file, char *folder)
            arglist[argp++] = fold;
            arglist[argp] = NULL;
            execvp (program, arglist);
-           _exit (-1);
+           _exit(1);
 
        default: 
            if ((status = pidwait (child_id, OK))) {
@@ -2001,7 +2035,7 @@ fcc (char *file, char *folder)
  */
 
 static void
-die (char *what, char *fmt, ...)
+fatal (char *what, char *fmt, ...)
 {
     int err;
     va_list ap;