X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fspost.c;h=476227babdfadbfcae919811a18f80dee707a319;hb=37388292edf9ca9e8236297ed5f777ab4b15b7cc;hp=9b2ffcbc932ba3925180424353dff07486b7f62f;hpb=4cb212cf82fa0c832ee3247da33e733f5cce04d6;p=mmh diff --git a/uip/spost.c b/uip/spost.c index 9b2ffcb..476227b 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 */ @@ -149,19 +152,19 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - done(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); - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case DEBUGSW: debug++; @@ -180,16 +183,16 @@ main(int argc, char **argv) } } if (msg) - adios(NULL, "only one message at a time!"); + adios(EX_USAGE, NULL, "only one message at a time!"); else msg = cp; } if (!msg) - adios(NULL, "usage: %s [switches] file", invo_name); + adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name); if ((in = fopen(msg, "r")) == NULL) - adios(msg, "unable to open"); + adios(EX_IOERR, msg, "unable to open"); if (debug) { verbose++; @@ -206,7 +209,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 +253,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 +265,7 @@ main(int argc, char **argv) if (debug) { /* stop here */ - done(0); + exit(EX_OK); } fclose(out); @@ -277,7 +280,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 +289,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 +303,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; } @@ -430,7 +433,7 @@ finish_headers(FILE *out) fprintf(out, "%sDate: %s\n", resentstr, dtimenow()); } - strncpy(from, getusername(), sizeof(from)); + snprintf(from, sizeof(from), "%s@%s", getusername(), LocalName()); if ((cp = getfullname()) && *cp) { snprintf(signature, sizeof(signature), "%s <%s>", cp, from); } else { @@ -439,15 +442,18 @@ finish_headers(FILE *out) if (!(msgflags & MFRM)) { fprintf(out, "%sFrom: %s\n", resentstr, signature); } else { - /* In case the From: header contains multiple addresses. */ + /* + ** Add a Sender: header because the From: header could + ** be fake or contain multiple addresses. + */ fprintf(out, "%sSender: %s\n", resentstr, from); } if (!(msgflags & MVIS)) { - fprintf(out, "%sBcc: Blind Distribution List: ;\n", resentstr); + 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"); } } @@ -560,7 +566,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++) { @@ -603,7 +609,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, "m_text); unlink(bccdraft);