#include <h/dropsbr.h>
#include <h/mime.h>
-#include <zotnet/tws/tws.h>
+#include <h/tws.h>
#include <zotnet/mts/mts.h>
#include <errno.h>
#include <setjmp.h>
#include <signal.h>
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef TM_IN_SYS_TIME
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
#ifdef MMDFMTS
# include <mts/mmdf/util.h>
# include <mts/mmdf/mmdf.h>
#define FCCS 10 /* max number of fccs allowed */
+/* In the following array of structures, the numeric second field of the
+ structures (minchars) is apparently used like this:
+
+ -# : Switch can be abbreviated to # characters; switch hidden in -help.
+ 0 : Switch can't be abbreviated; switch shown in -help.
+ # : Switch can be abbreviated to # characters; switch shown in -help. */
+
static struct swit switches[] = {
#define ALIASW 0
{ "alias aliasfile", 0 },
#define VERSIONSW 20
{ "version", 0 },
#define HELPSW 21
- { "help", 4 },
+ { "help", 0 },
#define BITSTUFFSW 22
{ "dashstuffing", -12 }, /* should we dashstuff BCC messages? */
#define NBITSTUFFSW 23
static char *partno = NULL;
static int queued = 0;
+extern boolean draft_from_masquerading; /* defined in mts.c */
+
/*
* static prototypes
*/
if (verbose)
printf (partno ? "Partial Message #%s Processed\n" : "Message Processed\n",
partno);
- done (0);
+ return done (0);
}
if ((cp = strrchr(str, '\n')))
*cp = 0;
- for (cp = pp = str; cp = strchr(pp, ','); pp = cp) {
+ for (cp = pp = str; (cp = strchr(pp, ',')); pp = cp) {
*cp++ = 0;
insert_fcc (hdr, pp);
}
}
tmpaddrs.m_next = NULL;
- for (count = 0; cp = getname (str); count++)
+ for (count = 0; (cp = getname (str)); count++)
if ((mp = getm (cp, NULL, 0, AD_HOST, NULL))) {
if (tmpaddrs.m_next)
np->m_next = mp;
for (grp = 0, mp = tmpaddrs.m_next; mp; mp = np)
if (mp->m_nohost) { /* also used to test (hdr->flags & HTRY) */
- pp = akvalue (mp->m_mbox);
+ /* The address doesn't include a host, so it might be an alias. */
+ pp = akvalue (mp->m_mbox); /* do mh alias substitution */
qp = akvisible () ? mp->m_mbox : "";
np = mp;
if (np->m_gname)
badadr++;
continue;
}
+
+ if (draft_from_masquerading && ((msgstate == RESENT)
+ ? (hdr->set & MRFM)
+ : (hdr->set & MFRM)))
+ /* The user manually specified a [Resent-]From: address in
+ their draft and the "masquerade:" line in mts.conf
+ doesn't contain "draft_from", so we'll set things up to
+ use the actual email address embedded in the draft
+ [Resent-]From: (after alias substitution, and without the
+ GECOS full name or angle brackets) as the envelope
+ From:. */
+ strncpy(from, auxformat(mp, 0), sizeof(from) - 1);
+
if (hdr->flags & HBCC)
mp->m_bcc++;
if (np->m_ingrp)
mnfree (mp);
}
else {
+ /* Address includes a host, so no alias substitution is needed. */
+ if (draft_from_masquerading && ((msgstate == RESENT)
+ ? (hdr->set & MRFM)
+ : (hdr->set & MFRM)))
+ /* The user manually specified a [Resent-]From: address in
+ their draft and the "masquerade:" line in mts.conf
+ doesn't contain "draft_from", so we'll set things up to
+ use the actual email address embedded in the draft
+ [Resent-]From: (after alias substitution, and without the
+ GECOS full name or angle brackets) as the envelope
+ From:. */
+ strncpy(from, auxformat(mp, 0), sizeof(from) - 1);
+
if (hdr->flags & HBCC)
mp->m_bcc++;
if (mp->m_gname)
fprintf (out, "Date: %s\n", dtime (&tclock, 0));
if (msgid)
fprintf (out, "Message-ID: <%d.%ld@%s>\n",
- (int) getpid (), tclock, LocalName ());
- if (msgflags & MFRM)
- fprintf (out, "Sender: %s\n", from);
+ (int) getpid (), (long) tclock, LocalName ());
+ 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 (whomsw)
break;
fprintf (out, "Resent-Date: %s\n", dtime (&tclock, 0));
if (msgid)
fprintf (out, "Resent-Message-ID: <%d.%ld@%s>\n",
- (int) getpid (), tclock, LocalName ());
- if (msgflags & MRFM)
- fprintf (out, "Resent-Sender: %s\n", from);
+ (int) getpid (), (long) tclock, LocalName ());
+ if (msgflags & MRFM) {
+ /* There was already a Resent-From: in 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, "Resent-Sender: %s\n", from);
+ }
else
+ /* Construct a Resent-From: header. */
fprintf (out, "Resent-From: %s\n", signature);
if (whomsw)
break;
if (mp->m_mbox == NULL || ((flags & HTRY) && !insert (mp)))
return 0;
- if (!fill_in && (flags & (HBCC | HDCC)) || mp->m_ingrp)
+ if ((!fill_in && (flags & (HBCC | HDCC))) || mp->m_ingrp)
return 1;
if (!nameoutput) {
}
len = strlen (cp);
- if (linepos != nameoutput)
+ if (linepos != nameoutput) {
if (len + linepos + 2 > outputlinelen)
fprintf (out, ",\n%*s", linepos = nameoutput, "");
else {
fputs (", ", out);
linepos += 2;
}
+ }
fputs (cp, out);
linepos += len;
cp = fill_in ? group : concat (group, ";", NULL);
len = strlen (cp);
- if (linepos > nameoutput)
+ if (linepos > nameoutput) {
if (len + linepos + 2 > outputlinelen) {
fprintf (out, ",\n%*s", nameoutput, "");
linepos = nameoutput;
fputs (", ", out);
linepos += 2;
}
+ }
fputs (cp, out);
linepos += len;
fprintf (out, "Date: %s\n", dtime (&tclock, 0));
if (msgid)
fprintf (out, "Message-ID: <%d.%ld@%s>\n",
- (int) getpid (), tclock, LocalName ());
+ (int) getpid (), (long) tclock, LocalName ());
fprintf (out, "From: %s\n", signature);
if (subject)
fprintf (out, "Subject: %s", subject);