remove dublicated code in uip/spost
[mmh] / uip / spost.c
index 476227b..ee70385 100644 (file)
@@ -56,6 +56,7 @@ static struct swit switches[] = {
 #define MVIS  0x0008  /* we've seen sighted addrs */
 #define MINV  0x0010  /* we've seen blind addrs */
 #define MRDT  0x0020  /* we've seen a Resent-Date: */
+#define MFMM  0x0040  /* The Mail is From a Alternative-Mailbox Addresse */
 
 struct headers {
        char *value;
@@ -114,6 +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 */
@@ -221,13 +223,9 @@ main(int argc, char **argv)
        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);
@@ -411,6 +409,43 @@ putfmt(char *name, char *str, FILE *out)
        ** -- meillo@marmaro.de  2012-02
        */
 
+       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 */
+               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) {
                subject = getcpy(str);
        }
@@ -433,11 +468,17 @@ finish_headers(FILE *out)
                fprintf(out, "%sDate: %s\n", resentstr, dtimenow());
        }
 
-       snprintf(from, sizeof(from), "%s@%s", getusername(), LocalName());
-       if ((cp = getfullname()) && *cp) {
-               snprintf(signature, sizeof(signature), "%s <%s>", cp, from);
+       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(signature, sizeof(signature), "%s", from);
+               snprintf(from, sizeof(from), "%s@%s", getusername(), LocalName());
+               if ((cp = getfullname()) && *cp) {
+                       snprintf(signature, sizeof(signature), "%s <%s>", cp, from);
+               } else {
+                       snprintf(signature, sizeof(signature), "%s", from);
+               }
        }
        if (!(msgflags & MFRM)) {
                fprintf(out, "%sFrom: %s\n", resentstr, signature);
@@ -446,7 +487,9 @@ finish_headers(FILE *out)
                ** Add a Sender: header because the From: header could
                ** be fake or contain multiple addresses.
                */
-               fprintf(out, "%sSender: %s\n", resentstr, from);
+               if (!(msgflags & MFMM) || sender != NULL) {
+                       fprintf(out, "%sSender: %s\n", resentstr, signature);
+               }
        }
        if (!(msgflags & MVIS)) {
                fprintf(out, "%sBcc: undisclosed-recipients:;\n", resentstr);