#include <h/dropsbr.h>
#include <h/mime.h>
#include <h/utils.h>
-
#include <h/tws.h>
#include <h/mts.h>
-#include <errno.h>
-#include <signal.h>
-
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
X("user", SASLminc(-4), USERSW) \
X("port server port name/number", 4, PORTSW) \
X("tls", TLSminc(-3), TLSSW) \
+ X("initialtls", TLSminc(-10), INITTLSSW) \
X("notls", TLSminc(-5), NTLSSW) \
X("fileproc", -4, FILEPROCSW) \
X("mhlproc", -3, MHLPROCSW) \
X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \
+ X("credentials legacy|file:filename", 0, CREDENTIALSSW) \
X("messageid localname|random", 2, MESSAGEIDSW) \
#define X(sw, minchars, id) id,
static short outputlinelen = OUTPUTLINELEN;
static int pfd = NOTOK; /* fd to write annotation list to */
-static uid_t myuid= -1; /* my user id */
-static gid_t mygid= -1; /* my group id */
static int recipients = 0; /* how many people will get a copy */
static int unkadr = 0; /* how many of those were unknown */
static int badadr = 0; /* number of bad addrs */
static char sender[BUFSIZ]; /* my Sender: header */
static char efrom[BUFSIZ]; /* my Envelope-From: header */
static char fullfrom[BUFSIZ]; /* full contents of From header */
-static char signature[BUFSIZ]; /* my signature */
static char *filter = NULL; /* the filter for BCC'ing */
static char *subject = NULL; /* the subject field for BCC'ing */
static char *fccfold[FCCS]; /* foldernames for FCC'ing */
static void pl (void);
static void anno (void);
static int annoaux (struct mailname *);
-static void insert_fcc (struct headers *, unsigned char *);
+static void insert_fcc (struct headers *, char *);
static void make_bcc_file (int);
static void verify_all_addresses (int, char *);
static void chkadr (void);
FILE *in, *out;
m_getfld_state_t gstate = 0;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* foil search of user profile/context */
- if (context_foil (NULL) == -1)
- done (1);
+ if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 0);
continue;
case TLSSW:
- tls++;
+ tls = 1;
+ continue;
+
+ case INITTLSSW:
+ tls = 2;
continue;
case NTLSSW:
save_mts_method (cp);
continue;
+ case CREDENTIALSSW: {
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "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]);
if ((out = fopen ("/dev/null", "w")) == NULL)
adios ("/dev/null", "unable to open");
} else {
- 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");
- }
- }
+ char *cp = m_mktemp2(NULL, invo_name, NULL, &out);
+ if (cp == NULL) {
+ adios(NULL, "unable to create temporary file in %s",
+ get_temp_dir());
+ }
strncpy(tmpfil, cp, sizeof(tmpfil));
- chmod (tmpfil, 0600);
}
}
post (tmpfil, 0, verbose, envelope);
}
post (bccfil, 1, verbose, envelope);
- unlink (bccfil);
+ (void) m_unlink (bccfil);
} else {
post (tmpfil, 0, isatty (1), envelope);
}
p_refile (tmpfil);
- unlink (tmpfil);
+ (void) m_unlink (tmpfil);
+
+ if (verbose) {
+ if (partno)
+ printf ("Partial Message #%s Processed\n", partno);
+ else
+ printf ("Message Processed\n");
+ }
- if (verbose)
- printf (partno ? "Partial Message #%s Processed\n" : "Message Processed\n",
- partno);
done (0);
return 1;
}
{
int count, grp, i, keep;
char *cp, *pp, *qp;
- char namep[BUFSIZ];
+ char namep[BUFSIZ], error[BUFSIZ];
struct mailname *mp = NULL, *np = NULL;
struct headers *hdr;
tmpaddrs.m_next = NULL;
for (count = 0; (cp = getname (str)); count++)
- if ((mp = getm (cp, NULL, 0, AD_HOST, NULL))) {
+ if ((mp = getm (cp, NULL, 0, error, sizeof(error)))) {
if (tmpaddrs.m_next)
np->m_next = mp;
else
tmpaddrs.m_next = mp;
np = mp;
}
- else
+ else {
+ admonish(cp, "%s", error);
if (hdr->flags & HTRY)
badadr++;
else
badmsg++;
+ }
if (count < 1) {
if (hdr->flags & HNIL)
if (np->m_gname)
putgrp (namep, np->m_gname, out, hdr->flags);
while ((cp = getname (pp))) {
- if (!(mp = getm (cp, NULL, 0, AD_HOST, NULL))) {
+ if (!(mp = getm (cp, NULL, 0, error, sizeof(error)))) {
+ admonish(cp, "%s", error);
badadr++;
continue;
}
static void
start_headers (void)
{
- unsigned char *cp;
- char sigbuf[BUFSIZ];
- struct mailname *mp;
-
- myuid = getuid ();
- mygid = getgid ();
time (&tclock);
/*
efrom[0] = '\0';
sender[0] = '\0';
fullfrom[0] = '\0';
-
- if ((cp = getfullname ()) && *cp) {
- strncpy (sigbuf, cp, sizeof(sigbuf));
- snprintf (signature, sizeof(signature), "%s <%s>",
- sigbuf, getlocaladdr());
- if ((cp = getname (signature)) == NULL)
- adios (NULL, "getname () failed -- you lose extraordinarily big");
- if ((mp = getm (cp, NULL, 0, AD_HOST, NULL)) == NULL)
- adios (NULL, "bad signature '%s'", sigbuf);
- mnfree (mp);
- while (getname (""))
- continue;
- } else {
- strncpy (signature, getlocaladdr(), sizeof(signature));
- }
}
struct headers *h;
for (h = table; h->value; h++)
- if (!mh_strcasecmp (header, h->value))
+ if (!strcasecmp (header ? header : "", h->value ? h->value : ""))
return (h - table);
return NOTOK;
: &netaddrs;
mp->m_next;
mp = mp->m_next)
- 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)
+ if (!strcasecmp (np->m_host ? np->m_host : "",
+ mp->m_next->m_host ? mp->m_next->m_host : "") &&
+ !strcasecmp (np->m_mbox ? np->m_mbox : "",
+ mp->m_next->m_mbox ? mp->m_next->m_mbox : "") &&
+ np->m_bcc == mp->m_next->m_bcc)
return 0;
mp->m_next = np;
static void
-insert_fcc (struct headers *hdr, unsigned char *pp)
+insert_fcc (struct headers *hdr, char *pp)
{
- unsigned char *cp;
+ char *cp;
- for (cp = pp; isspace (*cp); cp++)
+ for (cp = pp; isspace ((unsigned char) *cp); cp++)
continue;
- for (pp += strlen (pp) - 1; pp > cp && isspace (*pp); pp--)
+ for (pp += strlen (pp) - 1; pp > cp && isspace ((unsigned char) *pp); pp--)
continue;
if (pp >= cp)
*++pp = 0;
FILE *out;
char *tfile = NULL, *program;
- tfile = m_mktemp2(NULL, "bccs", NULL, &out);
- if (tfile == NULL) adios("bcc", "unable to create temporary file");
+ if ((tfile = m_mktemp2(NULL, "bccs", NULL, &out)) == NULL) {
+ adios(NULL, "unable to create temporary file in %s", get_temp_dir());
+ }
strncpy (bccfil, tfile, sizeof(bccfil));
fprintf (out, "From: %s\n", fullfrom);
find_prefix (void)
{
int result = OK;
- unsigned char buffer[BUFSIZ];
+ char buffer[BUFSIZ];
FILE *in;
if ((in = fopen (tmpfil, "r")) == NULL)
while (fgets (buffer, sizeof(buffer) - 1, in))
if (buffer[0] == '-' && buffer[1] == '-') {
- unsigned char *cp;
+ char *cp;
for (cp = buffer + strlen (buffer) - 1; cp >= buffer; cp--)
- if (!isspace (*cp))
+ if (!isspace ((unsigned char) *cp))
break;
*++cp = '\0';
if (strcmp (buffer + 2, prefix) == 0) {
sigon ();
if (sm_mts == MTS_SENDMAIL_PIPE) {
- char *sargv[16], **argp;
+ char **argp, *program;
+ int argc;
for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
sleep (5);
adios (file, "can't reopen for sendmail");
}
- argp = sargv;
- *argp++ = "sendmail";
- *argp++ = "-t"; /* read msg for recipients */
- *argp++ = "-i"; /* don't stop on "." */
+ argp = argsplit(sendmail, &program, &argc);
+ argp[argc++] = "-t"; /* read msg for recipients */
+ argp[argc++] = "-i"; /* don't stop on "." */
if (whomsw)
- *argp++ = "-bv";
+ argp[argc++] = "-bv";
if (snoop)
- *argp++ = "-v";
- *argp = NULL;
+ argp[argc++] = "-v";
+ argp[argc] = NULL;
- execv (sendmail, sargv);
+ execv (program, argp);
adios (sendmail, "can't exec");
default:
{
NMH_UNUSED (i);
- unlink (tmpfil);
+ (void) m_unlink (tmpfil);
if (msgflags & MINV)
- unlink (bccfil);
+ (void) m_unlink (bccfil);
if (!whomsw || checksw)
sm_end (NOTOK);
{
va_list ap;
- unlink (tmpfil);
+ (void) m_unlink (tmpfil);
if (msgflags & MINV)
- unlink (bccfil);
+ (void) m_unlink (bccfil);
if (!whomsw || checksw)
sm_end (NOTOK);