* complete copyright information.
*/
-#include <h/mh.h>
+#include "h/mh.h"
+#include "sbr/pidstatus.h"
+#include "sbr/print_version.h"
+#include "sbr/print_help.h"
+#include "sbr/arglist.h"
+#include "sbr/error.h"
#include <fcntl.h>
-#include <h/signals.h>
-#include <h/addrsbr.h>
-#include <h/aliasbr.h>
-#include <h/dropsbr.h>
-#include <h/mime.h>
-#include <h/utils.h>
-#include <h/tws.h>
-#include <h/mts.h>
+#include "h/signals.h"
+#include "h/addrsbr.h"
+#include "h/aliasbr.h"
+#include "h/dropsbr.h"
+#include "h/mime.h"
+#include "h/done.h"
+#include "h/utils.h"
+#include "h/tws.h"
+#include "h/mts.h"
#include "sbr/m_mktemp.h"
#include "sbr/message_id.h"
#endif
#include <time.h>
-#include <mts/smtp/smtp.h>
+#include "mts/smtp/smtp.h"
#ifndef CYRUS_SASL
# define SASLminc(a) (a)
static short outputlinelen = OUTPUTLINELEN;
static int pfd = NOTOK; /* fd to write annotation list to */
-static int recipients = 0; /* how many people will get a copy */
+static bool recipients; /* 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 int badmsg = 0; /* message has bad semantics */
-static int verbose = 0; /* spell it out */
-static int format = 1; /* format addresses */
-static int mime = 0; /* use MIME-style encapsulations for Bcc */
-static int msgid = 0; /* add msgid */
-static int debug = 0; /* debugging post */
-static int watch = 0; /* watch the delivery process */
-static int whomsw = 0; /* we are whom not post */
-static int checksw = 0; /* whom -check */
+static bool badmsg; /* message has bad semantics */
+static bool verbose; /* spell it out */
+static bool format = true; /* format addresses */
+static bool mime; /* use MIME-style encapsulations for Bcc */
+static bool msgid; /* add msgid */
+static bool debug; /* debugging post */
+static bool watch; /* watch the delivery process */
+static bool whomsw; /* we are whom not post */
+static bool checksw; /* 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 bool sasl; /* 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 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? */
+static bool seensender; /* Have we seen a Sender: header? */
static unsigned msgflags = 0; /* what we've seen */
static struct mailname uuaddrs; /* uucp addrs */
static struct mailname tmpaddrs; /* temporary queue */
-static int snoop = 0;
+static bool snoop;
static char *clientsw = NULL;
static char *serversw = NULL;
int
main (int argc, char **argv)
{
- int state, compnum, dashstuff = 0, swnum, oauth_flag = 0, tls = -1;
- int noverify = 0;
+ int state, compnum, dashstuff = 0, swnum;
+ bool oauth_flag = false;
+ int tls = -1;
+ bool noverify = false;
int eai = 0; /* use Email Address Internationalization (EAI) (SMTPUTF8) */
char *cp, *msg = NULL, **argp, **arguments, *envelope;
char buf[NMH_BUFSIZ], name[NAMESZ], *auth_svc = NULL;
FILE *in, *out;
m_getfld_state_t gstate;
- if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
+ if (nmh_init(argv[0], false, false)) { return 1; }
mts_init ();
arguments = getarguments (invo_name, argc, argv, 0);
ambigsw (cp, switches);
done (1);
case UNKWNSW:
- adios (NULL, "-%s unknown", cp);
+ die("-%s unknown", cp);
case HELPSW:
snprintf (buf, sizeof(buf), "%s [switches] file", invo_name);
case LIBSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
/* create a minimal context */
if (context_foil (cp) == -1)
done (1);
case ALIASW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
if ((state = alias (cp)) != AK_OK)
- adios (NULL, "aliasing error in %s - %s",
+ die("aliasing error in %s - %s",
cp, akerror (state));
continue;
case CHKSW:
- checksw++;
+ checksw = true;
continue;
case NCHKSW:
- checksw = 0;
+ checksw = false;
continue;
case DEBUGSW:
- debug++;
+ debug = true;
continue;
case DISTSW:
case FILTSW:
if (!(filter = *argp++) || *filter == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- mime = 0;
+ die("missing argument to %s", argp[-2]);
+ mime = false;
continue;
case NFILTSW:
filter = NULL;
continue;
case FRMTSW:
- format++;
+ format = true;
continue;
case NFRMTSW:
- format = 0;
+ format = false;
continue;
case BITSTUFFSW:
continue;
case MIMESW:
- mime++;
+ mime = true;
filter = NULL;
continue;
case NMIMESW:
- mime = 0;
+ mime = false;
continue;
case MSGDSW:
- msgid++;
+ msgid = true;
continue;
case NMSGDSW:
- msgid = 0;
+ msgid = false;
continue;
case VERBSW:
- verbose++;
+ verbose = true;
continue;
case NVERBSW:
- verbose = 0;
+ verbose = false;
continue;
case WATCSW:
- watch++;
+ watch = true;
continue;
case NWATCSW:
- watch = 0;
+ watch = false;
continue;
case WHOMSW:
- whomsw++;
+ whomsw = true;
continue;
case WIDTHSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
if ((outputlinelen = atoi (cp)) < 10)
- adios (NULL, "impossible width %d", outputlinelen);
+ die("impossible width %d", outputlinelen);
continue;
case ANNOSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
if ((pfd = atoi (cp)) <= 2)
- adios (NULL, "bad argument %s %s", argp[-2], cp);
+ die("bad argument %s %s", argp[-2], cp);
continue;
case CLIESW:
if (!(clientsw = *argp++) || *clientsw == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case SERVSW:
if (!(serversw = *argp++) || *serversw == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case SNOOPSW:
- snoop++;
+ snoop = true;
continue;
case PARTSW:
if (!(partno = *argp++) || *partno == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case SASLSW:
- sasl++;
+ sasl = true;
continue;
case NOSASLSW:
- sasl = 0;
+ sasl = false;
continue;
case SASLMECHSW:
if (!(saslmech = *argp++) || *saslmech == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case AUTHSERVICESW:
if (!(auth_svc = *argp++) || *auth_svc == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- oauth_flag++;
+ die("missing argument to %s", argp[-2]);
+ oauth_flag = true;
continue;
case OAUTHCREDFILESW:
int i;
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
for (i = 0; oauthswitches[i].profname != NULL; i++) {
if (oauthswitches[i].switchnum == swnum) {
}
if (oauthswitches[i].profname == NULL)
- adios (NULL, "internal error: cannot map switch %s "
+ die("internal error: cannot map switch %s "
"to profile entry", argp[-2]);
- oauth_flag++;
+ oauth_flag = true;
continue;
}
case USERSW:
if (!(user = *argp++) || *user == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case PORTSW:
if (!(port = *argp++) || *port == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case TLSSW:
continue;
case CERTVERSW:
- noverify = 0;
+ noverify = false;
continue;
case NOCERTVERSW:
- noverify++;
+ noverify = true;
continue;
case FILEPROCSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
fileproc = cp;
continue;
case MHLPROCSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
mhlproc = cp;
continue;
case MTSSM:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
sendmail = cp;
continue;
case MTSSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
save_mts_method (cp);
continue;
case CREDENTIALSSW: {
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("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]);
+ die("missing argument to %s", argp[-2]);
if (save_message_id_style (cp) != 0)
- adios (NULL, "unsupported messageid \"%s\"", cp);
+ die("unsupported messageid \"%s\"", cp);
continue;
}
}
if (msg)
- adios (NULL, "only one message at a time!");
+ die("only one message at a time!");
msg = cp;
}
alias (AliasFile);
if (!msg)
- adios (NULL, "usage: %s [switches] file", invo_name);
+ die("usage: %s [switches] file", invo_name);
if (outputlinelen < 10)
- adios (NULL, "impossible width %d", outputlinelen);
+ die("impossible width %d", outputlinelen);
if ((in = fopen (msg, "r")) == NULL)
adios (msg, "unable to open");
start_headers ();
if (debug) {
- verbose++;
+ verbose = true;
out = stdout;
} else {
if (whomsw) {
} else {
char *cp = m_mktemp2(NULL, invo_name, NULL, &out);
if (cp == NULL) {
- adios(NULL, "unable to create temporary file in %s",
+ die("unable to create temporary file in %s",
get_temp_dir());
}
strncpy(tmpfil, cp, sizeof(tmpfil));
case LENERR:
case FMTERR:
- adios (NULL, "message format error in component #%d", compnum);
+ die("message format error in component #%d", compnum);
default:
- adios (NULL, "getfld() returned %d", state);
+ die("getfld() returned %d", state);
}
break;
}
char sbuf[128];
if (auth_svc == NULL) {
- adios(NULL, "No authentication service given with -authservice");
+ die("No authentication service given with -authservice");
}
for (i = 0; oauthswitches[i].profname != NULL; i++) {
static void
putfmt (char *name, char *str, int *eai, FILE *out)
{
- int count, grp, i, keep;
+ int count;
+ bool grp;
+ int i, keep;
char *cp, *pp, *qp;
char namep[BUFSIZ], error[BUFSIZ];
char *savehdr = NULL;
if (msgstate == NORMAL && uprf (name, "resent")) {
inform("illegal header line -- %s:", name);
- badmsg++;
+ badmsg = true;
return;
}
}
if (hdr->flags & HBAD) {
inform("illegal header line -- %s:", name);
- badmsg++;
+ badmsg = true;
return;
}
msgflags |= (hdr->set & ~(MVIS | MINV));
if (hdr->flags & HTRY)
badadr++;
else
- badmsg++;
+ badmsg = true;
}
}
if ((msgstate == RESENT) ? (hdr->set & MRSN)
: (hdr->set & MSND)) {
inform("%s: field requires one address", name);
- badmsg++;
+ badmsg = true;
}
#ifdef notdef
inform("%s: field requires at least one address", name);
- badmsg++;
+ badmsg = true;
#endif /* notdef */
}
return;
if (count > 1 && (hdr->flags & HONE)) {
inform("%s: field only permits one address", name);
- badmsg++;
+ badmsg = true;
return;
}
snprintf (namep, sizeof(namep), "%s%s",
(hdr->flags & HMNG) ? "Original-" : "", name);
- for (grp = 0, mp = tmpaddrs.m_next; mp; mp = np)
+ for (grp = false, mp = tmpaddrs.m_next; mp; mp = np)
if (mp->m_nohost) { /* also used to test (hdr->flags & HTRY) */
/* The address doesn't include a host, so it might be an alias. */
pp = akvalue (mp->m_mbox); /* do mh alias substitution */
: (hdr->set & MSND)) {
strncpy(sender, auxformat(mp, 0), sizeof(sender) - 1);
sender[sizeof(sender) - 1] = '\0';
- seensender++;
+ seensender = true;
}
/*
aliases and put them in Bcc:, but then
they'd have the Blind-Carbon-Copy
indication. */
- adios (NULL,
- "blind lists not compatible with"
+ die( "blind lists not compatible with"
" sendmail/pipe");
}
- grp++;
+ grp = true;
}
if (putadr (namep, qp, mp, out, hdr->flags, savehdr,
savehdrlen))
: (hdr->set & MSND)) {
strncpy(sender, auxformat(mp, 0), sizeof(sender) - 1);
sender[sizeof(sender) - 1] = '\0';
- seensender++;
+ seensender = true;
}
/*
if (mp->m_gname)
putgrp (namep, mp->m_gname, out, hdr->flags);
if (mp->m_ingrp)
- grp++;
+ grp = true;
keep = putadr (namep, "", mp, out, hdr->flags, savehdr, savehdrlen);
np = mp->m_next;
if (keep) {
}
}
- if (grp > 0 && (hdr->flags & HNGR)) {
+ if (grp && (hdr->flags & HNGR)) {
inform("%s: field does not allow groups", name);
- badmsg++;
+ badmsg = true;
}
if (linepos) {
putc ('\n', out);
*/
inform("message has no From: header");
inform("See default components files for examples");
- badmsg++;
+ badmsg = true;
break;
}
- if (fromcount > 1 && (seensender == 0 && !(msgflags & MEFM))) {
+ if (fromcount > 1 && (!seensender && !(msgflags & MEFM))) {
inform("A Sender: or Envelope-From: header is required "
"with multiple\nFrom: addresses");
- badmsg++;
+ badmsg = true;
break;
}
* from Envelope-From: (which in this case, cannot be blank)
*/
- if (fromcount > 1 && seensender == 0) {
+ if (fromcount > 1 && !seensender) {
if (efrom[0] == '\0') {
inform("Envelope-From cannot be blank when there "
"is multiple From: addresses\nand no Sender: "
"header");
- badmsg++;
+ badmsg = true;
} else {
fprintf (out, "Sender: %s\n", efrom);
}
case RESENT:
if (!(msgflags & MDAT)) {
inform("message has no Date: header");
- badmsg++;
+ badmsg = true;
}
if (!(msgflags & MFRM)) {
inform("message has no From: header");
- badmsg++;
+ badmsg = true;
}
if (!(msgflags & MRFM)) {
inform("message has no Resent-From: header");
inform("See default components files for examples");
- badmsg++;
+ badmsg = true;
break;
}
- if (fromcount > 1 && (seensender == 0 && !(msgflags & MEFM))) {
+ if (fromcount > 1 && (!seensender && !(msgflags & MEFM))) {
inform("A Resent-Sender: or Envelope-From: header is "
"required with multiple\nResent-From: addresses");
- badmsg++;
+ badmsg = true;
break;
}
* from Envelope-From (which in this case, cannot be blank)
*/
- if (fromcount > 1 && seensender == 0) {
+ if (fromcount > 1 && !seensender) {
if (efrom[0] == '\0') {
inform("Envelope-From cannot be blank when there "
"is multiple Resent-From: addresses and no "
"Resent-Sender: header");
- badmsg++;
+ badmsg = true;
} else {
fprintf (out, "Resent-Sender: %s\n", efrom);
}
}
if (badmsg)
- adios (NULL, "re-format message and try again");
+ die("re-format message and try again");
if (!recipients)
- adios (NULL, "no addressees");
+ die("no addressees");
}
putadr (char *name, char *aka, struct mailname *mp, FILE *out,
unsigned int flags, char *savehdr, unsigned int savehdrsize)
{
- int len, saveappend = 0;
+ int len;
+ bool saveappend = false;
unsigned int shlen;
char *cp;
char buffer[BUFSIZ];
if (savehdr) {
shlen = strlen(savehdr);
- saveappend = 1;
+ saveappend = true;
}
if (*aka && mp->m_type != UUCPHOST && !mp->m_pers)
fprintf (out, ",\n%*s", linepos = nameoutput, "");
if (saveappend) {
if (shlen + 2 + nameoutput + len >= savehdrsize) {
- saveappend = 0;
+ saveappend = false;
} else {
snprintf(savehdr + shlen, savehdrsize - shlen, ",\n%*s",
linepos, "");
linepos += 2;
if (saveappend) {
if (shlen + 2 + len >= savehdrsize) {
- saveappend = 0;
+ saveappend = false;
} else {
strncat(savehdr, ", ", savehdrsize - shlen);
}
return 0;
mp->m_next = np;
- recipients++;
+ recipients = true;
return 1;
}
int i;
struct mailname *mp;
- printf ("-------\n\t-- Addresses --\nlocal:\t");
+ fputs("-------\n\t-- Addresses --\nlocal:\t", stdout);
for (mp = localaddrs.m_next; mp; mp = mp->m_next)
printf ("%s%s%s", mp->m_mbox,
mp->m_bcc ? "[BCC]" : "",
mp->m_next ? ",\n\t" : "");
- printf ("\nnet:\t");
+ fputs("\nnet:\t", stdout);
for (mp = netaddrs.m_next; mp; mp = mp->m_next)
printf ("%s%s@%s%s%s", FENDNULL(mp->m_path),
mp->m_mbox, mp->m_host,
mp->m_bcc ? "[BCC]" : "",
mp->m_next ? ",\n\t" : "");
- printf ("\nuucp:\t");
+ fputs("\nuucp:\t", stdout);
for (mp = uuaddrs.m_next; mp; mp = mp->m_next)
printf ("%s!%s%s%s", mp->m_host, mp->m_mbox,
mp->m_bcc ? "[BCC]" : "",
mp->m_next ? ",\n\t" : "");
- printf ("\n\t-- Folder Copies --\nfcc:\t");
+ fputs("\n\t-- Folder Copies --\nfcc:\t", stdout);
for (i = 0; i < fccind; i++)
printf ("%s%s", fccfold[i], i + 1 < fccind ? ",\n\t" : "");
putchar('\n');
return;
if (fccind >= FCCS)
- adios (NULL, "too many %ss", hdr->value);
+ die("too many %ss", hdr->value);
fccfold[fccind++] = mh_xstrdup(cp);
}
char *tfile = NULL, *program;
if ((tfile = m_mktemp2(NULL, "bccs", NULL, &out)) == NULL) {
- adios(NULL, "unable to create temporary file in %s", get_temp_dir());
+ die("unable to create temporary file in %s", get_temp_dir());
}
strncpy (bccfil, tfile, sizeof(bccfil));
* prefix and check again.
*/
if ((cp = strchr(prefix, 'a')) == NULL)
- adios (NULL, "lost prefix start");
+ die("lost prefix start");
while (find_prefix () == NOTOK) {
if (*cp < 'z')
(*cp)++;
else if (*++cp == 0)
- adios (NULL, "can't find a unique delimiter string");
+ die("can't find a unique delimiter string");
else
(*cp)++;
}
return;
}
if (talk)
- printf (": ");
+ fputs(": ", stdout);
fflush (stdout);
switch (retval = sm_wadr (mbox, host,