X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fspost.c;h=b5fac1273907fa208aaaddd011a0cc7d1eae8cc3;hp=bfa8f4bed99e92a9743d02a0bc015e73340f47bf;hb=43c31a90ba57b93a5504c39a28b9ef55a9b6e801;hpb=fede6e42d81ce34fd5c1bbe7fb2757b281c2573a diff --git a/uip/spost.c b/uip/spost.c index bfa8f4b..b5fac12 100644 --- a/uip/spost.c +++ b/uip/spost.c @@ -16,6 +16,9 @@ #include #include #include +#include +#include +#include #define MAX_SM_FIELD 1476 /* < largest hdr field sendmail will accept */ @@ -53,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; @@ -149,19 +153,19 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - exit(1); + exit(EX_USAGE); case UNKWNSW: - adios(NULL, "-%s unknown", cp); + adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] file", invo_name); print_help(buf, switches, 1); - exit(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - exit(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case DEBUGSW: debug++; @@ -179,17 +183,20 @@ main(int argc, char **argv) continue; } } - if (msg) - adios(NULL, "only one message at a time!"); - else + if (msg) { + adios(EX_USAGE, NULL, "only one message at a time!"); + } else { msg = cp; + } } - if (!msg) - adios(NULL, "usage: %s [switches] file", invo_name); + if (!msg) { + adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name); + } - if ((in = fopen(msg, "r")) == NULL) - adios(msg, "unable to open"); + if ((in = fopen(msg, "r")) == NULL) { + adios(EX_IOERR, msg, "unable to open"); + } if (debug) { verbose++; @@ -206,7 +213,7 @@ main(int argc, char **argv) for (ap=brkstring(dp=getcpy(cp), " ", "\n"); ap && *ap; ap++) { if ((state = alias(etcpath(*ap))) != AK_OK) { - adios(NULL, "aliasing error in file %s: %s", + adios(EX_IOERR, NULL, "aliasing error in file %s: %s", *ap, akerror(state)); } } @@ -250,11 +257,11 @@ main(int argc, char **argv) case LENERR: case FMTERR: - adios(NULL, "message format error in component #%d", + adios(EX_DATAERR, NULL, "message format error in component #%d", compnum); default: - adios(NULL, "getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } break; } @@ -262,7 +269,7 @@ main(int argc, char **argv) if (debug) { /* stop here */ - exit(0); + exit(EX_OK); } fclose(out); @@ -277,7 +284,7 @@ main(int argc, char **argv) if (!(msgflags & MVIS)) { /* only Bcc rcpts: we're finished here */ unlink(tmpfil); - exit(0); + exit(EX_OK); } } @@ -286,7 +293,7 @@ main(int argc, char **argv) ** the msg temp file as std in. */ if (!freopen(tmpfil, "r", stdin)) { - adios(tmpfil, "can't reopen for sendmail"); + adios(EX_IOERR, tmpfil, "can't reopen for sendmail"); } unlink(tmpfil); @@ -300,7 +307,7 @@ main(int argc, char **argv) } *argp = NULL; execv(sendmail, sargv); - adios(sendmail, "can't exec"); + adios(EX_OSERR, sendmail, "can't exec"); return -1; } @@ -321,12 +328,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 */ @@ -408,6 +420,20 @@ putfmt(char *name, char *str, FILE *out) ** -- meillo@marmaro.de 2012-02 */ + if (hdr->set & MFRM) { + struct mailname *mp = NULL; + + /* needed because the address parser holds global state */ + ismymbox(NULL); + + while ((cp = getname(str)) != NULL) { + mp = getm(cp, NULL, 0, AD_NAME, NULL); + if (ismymbox(mp)) { + msgflags |= MFMM; + } + } + } + if (hdr->flags & HSUB) { subject = getcpy(str); } @@ -430,11 +456,15 @@ 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 ((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); @@ -443,14 +473,16 @@ 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)) { + fprintf(out, "%sSender: %s\n", resentstr, signature); + } } if (!(msgflags & MVIS)) { fprintf(out, "%sBcc: undisclosed-recipients:;\n", resentstr); } if (badmsg) { unlink(tmpfil); - adios(NULL, "re-format message and try again"); + adios(EX_DATAERR, NULL, "re-format message and try again"); } } @@ -468,7 +500,6 @@ get_header(char *header, struct headers *table) return (h - table); } } - return NOTOK; } @@ -499,7 +530,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 */ @@ -521,7 +552,7 @@ putadr(char *name, struct mailname *nl) } } } 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; @@ -534,13 +565,13 @@ putadr(char *name, struct mailname *nl) 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; @@ -563,7 +594,7 @@ process_fcc(char *str) int state = 0; if (strlen(str)+strlen(fccs) > sizeof fccs /2) { - adios(NULL, "Too much Fcc data"); + adios(EX_DATAERR, NULL, "Too much Fcc data"); } /* todo: better have three states: SEPARATOR, PLUS, WORD */ for (cp=pp=str; *cp; cp++) { @@ -606,7 +637,7 @@ fcc(char *file, char *folders) fflush(stdout); } if (100+strlen(file)+strlen(folders) > sizeof cmd) { - adios(NULL, "Too much Fcc data"); + adios(EX_DATAERR, NULL, "Too much Fcc data"); } /* hack: read from /dev/null and refile(1) won't question us */ snprintf(cmd, sizeof cmd, "