Remove RCS keywords, since they no longer work after git migration.
[mmh] / uip / post.c
index 4ca5955..d5760a2 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * post.c -- enter messages into the mail transport system
  *
- * $Id$
- *
  * 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.
 # define SASLminc(a)  0
 #endif /* CYRUS_SASL */
 
+#ifndef TLS_SUPPORT
+# define TLSminc(a)  (a)
+#else /* TLS_SUPPORT */
+# define TLSminc(a)   0
+#endif /* TLS_SUPPORT */
+
 #define FCCS           10      /* max number of fccs allowed */
 
 #define        uptolow(c)      ((isalpha(c) && isupper (c)) ? tolower (c) : c)
@@ -138,6 +142,10 @@ static struct swit switches[] = {
     { "saslmech", SASLminc(-5) },
 #define USERSW                   39
     { "user", SASLminc(-4) },
+#define PORTSW                  40
+    { "port server port name/number", 4 },
+#define TLSSW                   41
+    { "tls", TLSminc(-3) },
     { NULL, 0 }
 };
 
@@ -236,6 +244,8 @@ static int nameoutput=0;    /* putadr() has output header name       */
 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="smtp";      /* Name of server port for SMTP          */
+static int tls=0;              /* Use TLS for encryption                */
 
 static unsigned msgflags = 0;  /* what we've seen */
 
@@ -294,7 +304,7 @@ static int insert (struct mailname *);
 static void pl (void);
 static void anno (void);
 static int annoaux (struct mailname *);
-static void insert_fcc (struct headers *, char *);
+static void insert_fcc (struct headers *, unsigned char *);
 static void make_bcc_file (int);
 static void verify_all_addresses (int);
 static void chkadr (void);
@@ -518,6 +528,15 @@ main (int argc, char **argv)
                    if (!(user = *argp++) || *user == '-')
                        adios (NULL, "missing argument to %s", argp[-2]);
                    continue;
+
+               case PORTSW:
+                   if (!(port = *argp++) || *port == '-')
+                       adios (NULL, "missing argument to %s", argp[-2]);
+                   continue;
+
+               case TLSSW:
+                   tls++;
+                   continue;
            }
        }
        if (msg)
@@ -546,13 +565,14 @@ main (int argc, char **argv)
            if ((out = fopen (fill_in ? fill_in : "/dev/null", "w")) == NULL)
                adios ("/dev/null", "unable to open");
        } else {
-           strncpy (tmpfil, m_scratch ("", m_maildir (invo_name)),
-               sizeof(tmpfil));
-           if ((out = fopen (tmpfil, "w")) == NULL) {
-               strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil));
-               if ((out = fopen (tmpfil, "w")) == NULL)
-                   adios (tmpfil, "unable to create");
-           }
+            char *cp = m_mktemp(m_maildir(invo_name), NULL, &out);
+            if (cp == NULL) {
+                cp = m_mktemp2(NULL, invo_name, NULL, &out);
+                if (cp == NULL) {
+                   adios ("post", "unable to create temporary file");
+                }
+            }
+            strncpy(tmpfil, cp, sizeof(tmpfil));
            chmod (tmpfil, 0600);
        }
     }
@@ -639,7 +659,8 @@ main (int argc, char **argv)
     if (verbose)
        printf (partno ? "Partial Message #%s Processed\n" : "Message Processed\n",
                partno);
-    return done (0);
+    done (0);
+    return 1;
 }
 
 
@@ -653,7 +674,7 @@ putfmt (char *name, char *str, FILE *out)
     int count, grp, i, keep;
     char *cp, *pp, *qp;
     char namep[BUFSIZ];
-    struct mailname *mp, *np;
+    struct mailname *mp = NULL, *np = NULL;
     struct headers *hdr;
 
     while (*str == ' ' || *str == '\t')
@@ -830,7 +851,7 @@ putfmt (char *name, char *str, FILE *out)
 static void
 start_headers (void)
 {
-    char  *cp;
+    unsigned char  *cp;
     char myhost[BUFSIZ], sigbuf[BUFSIZ];
     struct mailname *mp;
 
@@ -946,7 +967,7 @@ get_header (char *header, struct headers *table)
     struct headers *h;
 
     for (h = table; h->value; h++)
-       if (!strcasecmp (header, h->value))
+       if (!mh_strcasecmp (header, h->value))
            return (h - table);
 
     return NOTOK;
@@ -1048,8 +1069,8 @@ insert (struct mailname *np)
            : &netaddrs;
            mp->m_next;
            mp = mp->m_next)
-       if (!strcasecmp (np->m_host, mp->m_next->m_host)
-               && !strcasecmp (np->m_mbox, mp->m_next->m_mbox)
+       if (!mh_strcasecmp (np->m_host, mp->m_next->m_host)
+               && !mh_strcasecmp (np->m_mbox, mp->m_next->m_mbox)
                && np->m_bcc == mp->m_next->m_bcc)
            return 0;
 
@@ -1128,9 +1149,9 @@ annoaux (struct mailname *mp)
 
 
 static void
-insert_fcc (struct headers *hdr, char *pp)
+insert_fcc (struct headers *hdr, unsigned char *pp)
 {
-    char *cp;
+    unsigned char *cp;
 
     for (cp = pp; isspace (*cp); cp++)
        continue;
@@ -1157,17 +1178,29 @@ make_bcc_file (int dashstuff)
     pid_t child_id;
     char *vec[6];
     FILE *out;
+    char *tfile = NULL;
 
-    strncpy (bccfil, m_tmpfil ("bccs"), sizeof(bccfil));
-    if ((out = fopen (bccfil, "w")) == NULL)
-       adios (bccfil, "unable to create");
+    tfile = m_mktemp2(NULL, "bccs", NULL, &out);
+    if (tfile == NULL) adios("bcc", "unable to create temporary file");
     chmod (bccfil, 0600);
+    strncpy (bccfil, tfile, sizeof(bccfil));
 
     fprintf (out, "Date: %s\n", dtime (&tclock, 0));
     if (msgid)
        fprintf (out, "Message-ID: <%d.%ld@%s>\n",
                (int) getpid (), (long) tclock, LocalName ());
-    fprintf (out, "From: %s\n", signature);
+    if (msgflags & MFRM) {
+      /* There was already a From: in the draft.  Don't add one. */
+      if (!draft_from_masquerading)
+        /* mts.conf didn't contain "masquerade:[...]draft_from[...]"
+           so we'll reveal the user's actual account@thismachine
+           address in a Sender: header (and use it as the envelope
+           From: later). */
+        fprintf (out, "Sender: %s\n", from);
+    }
+    else
+      /* Construct a From: header. */
+      fprintf (out, "From: %s\n", signature);
     if (subject)
        fprintf (out, "Subject: %s", subject);
     fprintf (out, "BCC:\n");
@@ -1277,7 +1310,7 @@ static int
 find_prefix (void)
 {
     int        len, result;
-    char buffer[BUFSIZ];
+    unsigned char buffer[BUFSIZ];
     FILE *in;
 
     if ((in = fopen (tmpfil, "r")) == NULL)
@@ -1288,7 +1321,7 @@ find_prefix (void)
     result = OK;
     while (fgets (buffer, sizeof(buffer) - 1, in))
        if (buffer[0] == '-' && buffer[1] == '-') {
-           char *cp;
+           unsigned char *cp;
 
            for (cp = buffer + strlen (buffer) - 1; cp >= buffer; cp--)
                if (!isspace (*cp))
@@ -1391,9 +1424,9 @@ post (char *file, int bccque, int talk)
 
     sigon ();
 
-    if (rp_isbad (retval = sm_init (clientsw, serversw, watch, verbose,
+    if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch, verbose,
                                    snoop, onex, queued, sasl, saslmech,
-                                   user))
+                                   user, tls))
            || rp_isbad (retval = sm_winit (smtpmode, from)))
        die (NULL, "problem initializing server; %s", rp_string (retval));
 
@@ -1430,8 +1463,9 @@ verify_all_addresses (int talk)
     sigon ();
 
     if (!whomsw || checksw)
-       if (rp_isbad (retval = sm_init (clientsw, serversw, watch, verbose, snoop, 0,
-                                       queued, sasl, saslmech, user))
+       if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
+                                       verbose, snoop, 0, queued, sasl,
+                                       saslmech, user, tls))
                || rp_isbad (retval = sm_winit (smtpmode, from)))
            die (NULL, "problem initializing server; %s", rp_string (retval));