]> diplodocus.org Git - nmh/blobdiff - uip/post.c
Escape literal leading full stop in man/new.man.
[nmh] / uip / post.c
index d1e58ebf8e6037053d5e743d0ea0eceeb66a347f..9973beb793fa5dadba6322d9a804d9e7f28eb385 100644 (file)
@@ -89,6 +89,8 @@
     X("tls", TLSminc(-3), TLSSW) \
     X("initialtls", TLSminc(-10), INITTLSSW) \
     X("notls", TLSminc(-5), NTLSSW) \
+    X("certverify", TLSminc(-10), CERTVERSW) \
+    X("nocertverify", TLSminc(-12), NOCERTVERSW) \
     X("fileproc", -4, FILEPROCSW) \
     X("mhlproc", -3, MHLPROCSW) \
     X("sendmail program", 0, MTSSM) \
@@ -239,7 +241,7 @@ static int sasl=0;          /* Use SASL auth for SMTP                */
 static char *saslmech=NULL;    /* Force use of particular SASL mech     */
 static char *user=NULL;                /* Authenticate as this user             */
 static char *port="submission";        /* Name of server port for SMTP submission */
-static int tls=-1;             /* Use TLS for encryption                */
+static int tlsflag=0;          /* Flags to control TLS settings         */
 static int fromcount=0;                /* Count of addresses on From: header    */
 static int seensender=0;       /* Have we seen a Sender: header?        */
 
@@ -305,7 +307,6 @@ static void fcc (char *, char *);
 static void die (char *, char *, ...);
 static void post (char *, int, int, int, char *, int, char *);
 static void do_text (char *file, int fd);
-static int scan_input (int, int *);
 static void do_an_address (struct mailname *, int);
 static void do_addresses (int, int);
 static int find_prefix (void);
@@ -314,7 +315,8 @@ static int find_prefix (void);
 int
 main (int argc, char **argv)
 {
-    int state, compnum, dashstuff = 0, swnum, oauth_flag = 0;
+    int state, compnum, dashstuff = 0, swnum, oauth_flag = 0, tls = -1;
+    int noverify = 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;
@@ -531,6 +533,14 @@ main (int argc, char **argv)
                    tls = 0;
                    continue;
 
+               case CERTVERSW:
+                   noverify = 0;
+                   continue;
+
+               case NOCERTVERSW:
+                   noverify++;
+                   continue;
+
                case FILEPROCSW:
                    if (!(cp = *argp++) || *cp == '-')
                        adios (NULL, "missing argument to %s", argp[-2]);
@@ -613,7 +623,7 @@ main (int argc, char **argv)
            case FLD: 
            case FLDPLUS: 
                 compnum++;
-               cp = add (buf, NULL);
+               cp = mh_xstrdup(buf);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
                    state = m_getfld (&gstate, name, buf, &bufsz, in);
@@ -693,6 +703,16 @@ main (int argc, char **argv)
 #endif /* ! TLS_SUPPORT */
     }
 
+    if (tls == 1)
+       tlsflag = S_STARTTLS;
+    else if (tls == 2)
+       tlsflag = S_INITTLS;
+    else
+       tlsflag = 0;
+
+    if (noverify)
+       tlsflag |= S_NOVERIFY;
+
     /*
      * If we were given any oauth flags, store the appropriate profile
      * entries and make sure an authservice was given (we have to do this
@@ -751,7 +771,7 @@ main (int argc, char **argv)
        if (partno)
            printf ("Partial Message #%s Processed\n", partno);
        else
-           printf ("Message Processed\n");
+           puts("Message Processed");
     }
 
     done (0);
@@ -786,7 +806,7 @@ putfmt (char *name, char *str, int *eai, FILE *out)
            If it does, enable EAI support. */
         if (contains8bit(str, NULL)) {
             if (verbose) {
-                printf ("EAI/SMTPUTF8 enabled\n");
+                puts("EAI/SMTPUTF8 enabled");
             }
 
             /* Enable SMTPUTF8. */
@@ -805,8 +825,7 @@ putfmt (char *name, char *str, int *eai, FILE *out)
               should never have reached this point.  Warn about any
               that are non-empty. */
            if (strcmp (str, "\n")) {
-               char *newline = strchr (str, '\n');
-               if (newline) *newline = '\0';
+                trim_suffix_c(str, '\n');
                if (! whomsw) {
                    advise (NULL, "ignoring header line -- %s: %s", name, str);
                }
@@ -828,7 +847,7 @@ putfmt (char *name, char *str, int *eai, FILE *out)
     msgflags |= (hdr->set & ~(MVIS | MINV));
 
     if (hdr->flags & HSUB)
-       subject = subject ? add (str, add ("\t", subject)) : getcpy (str);
+       subject = subject ? add (str, add ("\t", subject)) : mh_xstrdup(str);
     if (hdr->flags & HFCC) {
        if ((cp = strrchr(str, '\n')))
            *cp = 0;
@@ -1043,7 +1062,7 @@ putfmt (char *name, char *str, int *eai, FILE *out)
         * Strip off any trailing newlines
         */
 
-       while (strlen(fullfrom) > 0 && fullfrom[strlen(fullfrom) - 1] == '\n') {
+       while (*fullfrom && fullfrom[strlen(fullfrom) - 1] == '\n') {
            fullfrom[strlen(fullfrom) - 1] = '\0';
        }
     }
@@ -1219,7 +1238,7 @@ putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flag
     }
 
     if (*aka && mp->m_type != UUCPHOST && !mp->m_pers)
-       mp->m_pers = getcpy (aka);
+       mp->m_pers = mh_xstrdup(aka);
     if (format) {
        if (mp->m_gname) {
            snprintf (buffer, sizeof(buffer), "%s;", mp->m_gname);
@@ -1335,7 +1354,7 @@ pl (void)
     printf ("\n\t-- Folder Copies --\nfcc:\t");
     for (i = 0; i < fccind; i++)
        printf ("%s%s", fccfold[i], i + 1 < fccind ? ",\n\t" : "");
-    printf ("\n");
+    putchar('\n');
 }
 
 
@@ -1391,7 +1410,7 @@ insert_fcc (struct headers *hdr, char *pp)
 
     if (fccind >= FCCS)
        adios (NULL, "too many %ss", hdr->value);
-    fccfold[fccind++] = getcpy (cp);
+    fccfold[fccind++] = mh_xstrdup(cp);
 }
 
 /*
@@ -1529,7 +1548,7 @@ find_prefix (void)
     if ((in = fopen (tmpfil, "r")) == NULL)
        adios (tmpfil, "unable to re-open");
 
-    while (fgets (buffer, sizeof(buffer) - 1, in))
+    while (fgets (buffer, sizeof buffer, in))
        if (buffer[0] == '-' && buffer[1] == '-') {
            char *cp;
 
@@ -1574,7 +1593,7 @@ do_addresses (int bccque, int talk)
     for (lp = localaddrs.m_next; lp; lp = lp->m_next)
        if (lp->m_bcc ? bccque : !bccque) {
            if (talk && !state)
-               printf ("  -- Local Recipients --\n");
+               puts("  -- Local Recipients --");
            do_an_address (lp, talk);
            state++;
        }
@@ -1583,7 +1602,7 @@ do_addresses (int bccque, int talk)
     for (lp = uuaddrs.m_next; lp; lp = lp->m_next)
        if (lp->m_bcc ? bccque : !bccque) {
            if (talk && !state)
-               printf ("  -- UUCP Recipients --\n");
+               puts("  -- UUCP Recipients --");
            do_an_address (lp, talk);
            state++;
        }
@@ -1592,7 +1611,7 @@ do_addresses (int bccque, int talk)
     for (lp = netaddrs.m_next; lp; lp = lp->m_next)
        if (lp->m_bcc ? bccque : !bccque) {
            if (talk && !state)
-               printf ("  -- Network Recipients --\n");
+               puts("  -- Network Recipients --");
            do_an_address (lp, talk);
            state++;
        }
@@ -1625,7 +1644,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope,
            printf (" -- Posting for %s Recipients --\n",
                    bccque ? "Blind" : "Sighted");
        else
-           printf (" -- Posting for All Recipients --\n");
+           puts(" -- Posting for All Recipients --");
     }
 
     sigon ();
@@ -1682,7 +1701,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope,
 
        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, tlsflag))
                || rp_isbad (retval = sm_winit (envelope, eai, eightbit))) {
            close (fd);
            die (NULL, "problem initializing server; %s", rp_string (retval));
@@ -1701,7 +1720,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope,
                printf (" -- %s Recipient Copies Posted --\n",
                        bccque ? "Blind" : "Sighted");
             else
-               printf (" -- Recipient Copies Posted --\n");
+               puts(" -- Recipient Copies Posted --");
         }
 
         fflush (stdout);
@@ -1726,32 +1745,32 @@ verify_all_addresses (int talk, int eai, char *envelope, int oauth_flag,
 
        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, tlsflag))
                || rp_isbad (retval = sm_winit (envelope, eai, eightbit))) {
            die (NULL, "problem initializing server; %s", rp_string (retval));
        }
     }
 
     if (talk && !whomsw)
-       printf (" -- Address Verification --\n");
+       puts(" -- Address Verification --");
     if (talk && localaddrs.m_next)
-       printf ("  -- Local Recipients --\n");
+       puts("  -- Local Recipients --");
     for (lp = localaddrs.m_next; lp; lp = lp->m_next)
        do_an_address (lp, talk);
 
     if (talk && uuaddrs.m_next)
-       printf ("  -- UUCP Recipients --\n");
+       puts("  -- UUCP Recipients --");
     for (lp = uuaddrs.m_next; lp; lp = lp->m_next)
        do_an_address (lp, talk);
 
     if (talk && netaddrs.m_next)
-       printf ("  -- Network Recipients --\n");
+       puts("  -- Network Recipients --");
     for (lp = netaddrs.m_next; lp; lp = lp->m_next)
        do_an_address (lp, talk);
 
     chkadr ();
     if (talk && !whomsw)
-       printf (" -- Address Verification Successful --\n");
+       puts(" -- Address Verification Successful --");
 
     if (!whomsw || checksw)
        sm_end (DONE);
@@ -1803,7 +1822,7 @@ do_an_address (struct mailname *lp, int talk)
                         lp->m_type != UUCPHOST ? lp->m_path : NULL)) {
        case RP_OK: 
            if (talk)
-               printf ("address ok\n");
+               puts("address ok");
            break;
 
        case RP_NO: 
@@ -1848,6 +1867,7 @@ do_text (char *file, int fd)
        case RP_NO: 
        case RP_NDEL: 
            die (NULL, "posting failed; %s", rp_string (retval));
+           /* FALLTHRU */
 
        default: 
            die (NULL, "unexpected response; %s", rp_string (retval));
@@ -1855,27 +1875,6 @@ do_text (char *file, int fd)
 }
 
 
-/*
- * See if input has any 8-bit bytes.
- */
-static int
-scan_input (int fd, int *eightbit) {
-    int state;
-    char buf[BUFSIZ];
-
-    lseek (fd, (off_t) 0, SEEK_SET);
-
-    while ((state = read (fd, buf, sizeof buf)) > 0) {
-        if (contains8bit (buf, buf + state)) {
-            *eightbit = 1;
-            return OK;
-        }
-    }
-
-    return state == NOTOK  ?  NOTOK  :  OK;
-}
-
-
 /*
  * SIGNAL HANDLING
  */
@@ -1934,11 +1933,11 @@ p_refile (char *file)
        return;
 
     if (verbose)
-       printf (" -- Filing Folder Copies --\n");
+       puts(" -- Filing Folder Copies --");
     for (i = 0; i < fccind; i++)
        fcc (file, fccfold[i]);
     if (verbose)
-       printf (" -- Folder Copies Filed --\n");
+       puts(" -- Folder Copies Filed --");
 }
 
 
@@ -1993,7 +1992,7 @@ fcc (char *file, char *folder)
                pidstatus (status, verbose ? stdout : stderr, NULL);
            } else {
                if (verbose)
-                   printf ("folder ok\n");
+                   puts("folder ok");
            }
     }