Add/update copyright notice in all source code files.
[mmh] / uip / post.c
index d0d750c..32888e6 100644 (file)
@@ -3,6 +3,10 @@
  * 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.
  */
 
 #include <h/mh.h>
@@ -14,7 +18,7 @@
 #include <h/mime.h>
 
 #include <h/tws.h>
-#include <zotnet/mts/mts.h>
+#include <h/mts.h>
 
 #include <errno.h>
 #include <setjmp.h>
 # include <mts/mmdf/mmdf.h>
 #endif
 
-/*
- * Currently smtp and sendmail use
- * the same interface for posting.
- */
 #ifdef SMTPMTS
-# define SENDMTS
-#endif
-
-#ifdef SENDMTS
 # include <mts/smtp/smtp.h>
 #endif
 
 # define uptolow(c) ((isalpha(c) && isupper (c)) ? tolower (c) : (c))
 #endif
 
+#ifndef CYRUS_SASL
+# define SASLminc(a) (a)
+#else /* CYRUS_SASL */
+# define SASLminc(a)  0
+#endif /* CYRUS_SASL */
+
 #define FCCS           10      /* max number of fccs allowed */
 
 /* In the following array of structures, the numeric second field of the
@@ -136,6 +138,12 @@ static struct swit switches[] = {
     { "partno", -6 },
 #define        QUEUESW                  36
     { "queued", -6 },
+#define SASLSW                   37
+    { "sasl", SASLminc(-4) },
+#define SASLMECHSW               38
+    { "saslmech", SASLminc(-5) },
+#define USERSW                   39
+    { "user", SASLminc(-4) },
     { NULL, 0 }
 };
 
@@ -235,6 +243,9 @@ static int whomsw = 0;              /* we are whom not post                  */
 static int checksw = 0;                /* whom -check                           */
 static int linepos=0;          /* putadr()'s position on the line       */
 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 unsigned msgflags = 0;  /* what we've seen */
 
@@ -267,14 +278,14 @@ static char *submitmode = "m";            /* deliver to mailbox only    */
 static char submitopts[6] = "vl";      /* initial options for submit */
 #endif /* MMDFMTS */
 
-#ifdef SENDMTS
+#ifdef SMTPMTS
 static int snoop      = 0;
 static int smtpmode   = S_MAIL;
 static char *clientsw = NULL;
 static char *serversw = NULL;
 
 extern struct smtp sm_reply;
-#endif /* SENDMTS */
+#endif /* SMTPMTS */
 
 static char prefix[] = "----- =_aaaaaaaaaa";
 
@@ -475,7 +486,7 @@ main (int argc, char **argv)
                        adios (NULL, "missing argument to %s", argp[-2]);
                    continue;
 
-#ifndef        SENDMTS
+#ifndef        SMTPMTS
                case CLIESW:
                case SERVSW:
                    if (!(cp = *argp++) || *cp == '-')
@@ -484,7 +495,7 @@ main (int argc, char **argv)
 
                case SNOOPSW:
                    continue;
-#else /* SENDMTS */
+#else /* SMTPMTS */
                case MAILSW:
                    smtpmode = S_MAIL;
                    continue;
@@ -508,7 +519,7 @@ main (int argc, char **argv)
                case SNOOPSW:
                    snoop++;
                    continue;
-#endif /* SENDMTS */
+#endif /* SMTPMTS */
 
                case FILLSW:
                    if (!(fill_in = *argp++) || *fill_in == '-')
@@ -525,6 +536,20 @@ main (int argc, char **argv)
                case QUEUESW:
                    queued++;
                    continue;
+               
+               case SASLSW:
+                   sasl++;
+                   continue;
+               
+               case SASLMECHSW:
+                   if (!(saslmech = *argp++) || *saslmech == '-')
+                       adios (NULL, "missing argument to %s", argp[-2]);
+                   continue;
+               
+               case USERSW:
+                   if (!(user = *argp++) || *user == '-')
+                       adios (NULL, "missing argument to %s", argp[-2]);
+                   continue;
            }
        }
        if (msg)
@@ -1378,10 +1403,10 @@ do_addresses (int bccque, int talk)
        die (NULL, "problem ending addresses [%s]\n", rp_valstr (retval));
 #endif /* MMDFMTS */
 
-#ifdef SENDMTS
+#ifdef SMTPMTS
     if (rp_isbad (retval = sm_waend ()))
        die (NULL, "problem ending addresses; %s", rp_string (retval));
-#endif /* SENDMTS */
+#endif /* SMTPMTS */
 }
 
 
@@ -1394,7 +1419,7 @@ do_addresses (int bccque, int talk)
  * SENDMAIL/SMTP routines
  */
 
-#ifdef SENDMTS
+#ifdef SMTPMTS
 
 static void
 post (char *file, int bccque, int talk)
@@ -1414,7 +1439,8 @@ post (char *file, int bccque, int talk)
     sigon ();
 
     if (rp_isbad (retval = sm_init (clientsw, serversw, watch, verbose,
-                                   snoop, onex, queued))
+                                   snoop, onex, queued, sasl, saslmech,
+                                   user))
            || rp_isbad (retval = sm_winit (smtpmode, from)))
        die (NULL, "problem initializing server; %s", rp_string (retval));
 
@@ -1451,7 +1477,8 @@ verify_all_addresses (int talk)
     sigon ();
 
     if (!whomsw || checksw)
-       if (rp_isbad (retval = sm_init (clientsw, serversw, 0, 0, snoop, 0, 0))
+       if (rp_isbad (retval = sm_init (clientsw, serversw, 0, 0, snoop, 0,
+                                       0, 0, 0, 0))
                || rp_isbad (retval = sm_winit (smtpmode, from)))
            die (NULL, "problem initializing server; %s", rp_string (retval));
 
@@ -1577,7 +1604,7 @@ do_text (char *file, int fd)
     }
 }
 
-#endif /* SENDMTS */
+#endif /* SMTPMTS */
 
 /*
  * MMDF routines
@@ -1870,10 +1897,10 @@ sigser (int i)
        mm_end (NOTOK);
 #endif /* MMDFMTS */
 
-#ifdef SENDMTS
+#ifdef SMTPMTS
     if (!whomsw || checksw)
        sm_end (NOTOK);
-#endif /* SENDMTS */
+#endif /* SMTPMTS */
 
     done (1);
 }
@@ -1994,10 +2021,10 @@ die (char *what, char *fmt, ...)
        mm_end (NOTOK);
 #endif /* MMDFMTS */
 
-#ifdef SENDMTS
+#ifdef SMTPMTS
     if (!whomsw || checksw)
        sm_end (NOTOK);
-#endif /* SENDMTS */
+#endif /* SMTPMTS */
 
     va_start(ap, fmt);
     advertise (what, NULL, fmt, ap);