Merge remote-tracking branch 'origin/master'
authormarkus schnalke <meillo@marmaro.de>
Sat, 29 Aug 2015 08:47:56 +0000 (10:47 +0200)
committermarkus schnalke <meillo@marmaro.de>
Sat, 29 Aug 2015 08:47:56 +0000 (10:47 +0200)
1  2 
uip/spost.c

diff --combined uip/spost.c
@@@ -115,6 -115,7 +115,7 @@@ static char *tmpfil
  static char *subject = NULL;  /* the subject field for BCC'ing */
  static char fccs[BUFSIZ] = "";
  struct mailname *bccs = NULL;  /* list of the bcc recipients */
+ struct mailname *sender = NULL;
  
  static struct headers *hdrtab;  /* table for the message we're doing */
  static FILE *out;  /* output (temp) file */
@@@ -183,20 -184,17 +184,20 @@@ main(int argc, char **argv
                                continue;
                        }
                }
 -              if (msg)
 +              if (msg) {
                        adios(EX_USAGE, NULL, "only one message at a time!");
 -              else
 +              } else {
                        msg = cp;
 +              }
        }
  
 -      if (!msg)
 +      if (!msg) {
                adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name);
 +      }
  
 -      if ((in = fopen(msg, "r")) == NULL)
 +      if ((in = fopen(msg, "r")) == NULL) {
                adios(EX_IOERR, msg, "unable to open");
 +      }
  
        if (debug) {
                verbose++;
        for (compnum = 1, state = FLD;;) {
                switch (state = m_getfld(state, name, buf, sizeof(buf), in)) {
                case FLD:
-                       compnum++;
-                       putfmt(name, buf, out);
-                       continue;
                case FLDPLUS:
                        compnum++;
-                       cp = add(buf, cp);
+                       cp = getcpy(buf);
                        while (state == FLDPLUS) {
                                state = m_getfld(state, name, buf,
                                                sizeof(buf), in);
@@@ -328,17 -322,12 +325,17 @@@ putfmt(char *name, char *str, FILE *out
  
        if ((i = get_header(name, hdrtab)) == NOTOK) {
                /* no header we would care for */
 -              if (mh_strcasecmp(name, attach_hdr)!=0 &&
 -                              mh_strcasecmp(name, sign_hdr)!=0 &&
 -                              mh_strcasecmp(name, enc_hdr)!=0) {
 -                      /* push it through */
 -                      fprintf(out, "%s: %s", name, str);
 +              if (mh_strcasecmp(name, attach_hdr)==0) {
 +                      return;
                }
 +              if (mh_strcasecmp(name, sign_hdr)==0) {
 +                      return;
 +              }
 +              if (mh_strcasecmp(name, enc_hdr)==0) {
 +                      return;
 +              }
 +              /* push it through */
 +              fprintf(out, "%s: %s", name, str);
                return;
        }
        /* it's one of the interesting headers */
        */
  
        if (hdr->set & MFRM) {
 -
                struct mailname *mp = NULL;
+               struct mailname *my = NULL;
+               unsigned int fromcnt = 0;
  
 -              /* This is need because the addresse parser hold global state */
 +              /* needed because the address parser holds global state */
                ismymbox(NULL);
  
                while ((cp = getname(str)) != NULL) {
+                       fromcnt++;
                        mp = getm(cp, NULL, 0, AD_NAME, NULL);
                        if (ismymbox(mp)) {
                                msgflags |= MFMM;
+                               if (my == NULL) {
+                                       my = mp;
+                               } else {
+                                       mnfree(mp);
+                                       mp = NULL;
+                               }
+                       } else {
+                               mnfree(mp);
+                               mp = NULL;
                        }
                }
+               if (fromcnt > 1) {
+                       sender = my;
+               } else {
+                       mnfree(my);
+               }
+               free(cp);
+               cp = NULL;
        }
  
        if (hdr->flags & HSUB) {
@@@ -456,7 -468,9 +475,9 @@@ finish_headers(FILE *out
                fprintf(out, "%sDate: %s\n", resentstr, dtimenow());
        }
  
-       if ((cp = context_find("Default-From")) != NULL) {
+       if (sender != NULL) {
+               snprintf(signature, sizeof(signature), "%s", sender->m_text);
+       } else if ((cp = context_find("Default-From")) != NULL) {
                snprintf(signature, sizeof(signature), "%s", cp);
        } else {
                snprintf(from, sizeof(from), "%s@%s", getusername(), LocalName());
                ** Add a Sender: header because the From: header could
                ** be fake or contain multiple addresses.
                */
-               if (!(msgflags & MFMM)) {
+               if (!(msgflags & MFMM) || sender != NULL) {
                        fprintf(out, "%sSender: %s\n", resentstr, signature);
                }
        }
@@@ -500,6 -514,7 +521,6 @@@ get_header(char *header, struct header
                        return (h - table);
                }
        }
 -
        return NOTOK;
  }
  
@@@ -530,7 -545,7 +551,7 @@@ putadr(char *name, struct mailname *nl
                        /* a local name - see if it's an alias */
                        cp = akvalue(mp->m_mbox);
                        if (cp == mp->m_mbox) {
 -                              /* wasn't an alias - use what the user typed */
 +                              /* wasn't an alias - use it unchanged */
                                linepos = putone(mp->m_text, linepos, namelen);
                        } else {
                                /* an alias - expand it */
                                }
                        }
                } else {
 -                      /* not a local name - use what the user typed */
 +                      /* not a local name - use it unchanged */
                        linepos = putone(mp->m_text, linepos, namelen);
                }
                mp2 = mp;
  static int
  putone(char *adr, int pos, int indent)
  {
 -      register int len;
 +      int len;
        static int linepos;
  
        len = strlen(adr);
 -      if (pos == indent)
 +      if (pos == indent) {
                linepos = pos;
 -      else if (linepos+len > OUTPUTLINELEN) {
 +      } else if (linepos+len > OUTPUTLINELEN) {
                fprintf(out, ",\n%*s", indent, "");
                linepos = indent;
                pos += indent + 2;