/*
* 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)
{ "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 }
};
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 */
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);
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)
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);
}
}
if (verbose)
printf (partno ? "Partial Message #%s Processed\n" : "Message Processed\n",
partno);
- return done (0);
+ done (0);
+ return 1;
}
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')
static void
start_headers (void)
{
- char *cp;
+ unsigned char *cp;
char myhost[BUFSIZ], sigbuf[BUFSIZ];
struct mailname *mp;
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;
: &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;
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;
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)
find_prefix (void)
{
int len, result;
- char buffer[BUFSIZ];
+ unsigned char buffer[BUFSIZ];
FILE *in;
if ((in = fopen (tmpfil, "r")) == NULL)
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))
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));
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));