Changed some string terminations from NULL to \0.
[mmh] / uip / post.c
index 4602dc0..abc2285 100644 (file)
 #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 },
@@ -87,7 +105,7 @@ static struct swit switches[] = {
 #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
@@ -265,6 +283,8 @@ static char *fill_in = NULL;
 static char *partno = NULL;
 static int queued = 0;
 
+extern boolean  draft_from_masquerading;  /* defined in mts.c */
+
 /*
  * static prototypes
  */
@@ -632,7 +652,7 @@ main (int argc, char **argv)
     if (verbose)
        printf (partno ? "Partial Message #%s Processed\n" : "Message Processed\n",
                partno);
-    done (0);
+    return done (0);
 }
 
 
@@ -690,7 +710,7 @@ putfmt (char *name, char *str, FILE *out)
 
        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);
        }
@@ -704,7 +724,7 @@ putfmt (char *name, char *str, FILE *out)
     }
 
     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;
@@ -736,7 +756,8 @@ putfmt (char *name, char *str, FILE *out)
 
     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)
@@ -746,6 +767,19 @@ putfmt (char *name, char *str, FILE *out)
                    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)
@@ -765,6 +799,19 @@ putfmt (char *name, char *str, FILE *out)
            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)
@@ -844,10 +891,18 @@ finish_headers (FILE *out)
            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;
@@ -875,10 +930,18 @@ finish_headers (FILE *out)
            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;
@@ -916,7 +979,7 @@ putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flag
 
     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) {
@@ -938,13 +1001,14 @@ putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flag
     }
     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;
@@ -972,7 +1036,7 @@ putgrp (char *name, char *group, FILE *out, unsigned int flags)
     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;
@@ -981,6 +1045,7 @@ putgrp (char *name, char *group, FILE *out, unsigned int flags)
            fputs (", ", out);
            linepos += 2;
        }
+    }
 
     fputs (cp, out);
     linepos += len;
@@ -1118,7 +1183,7 @@ make_bcc_file (int dashstuff)
     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);