From fcde9624e6832e0dcdc6f21996b69b7e58745e3d Mon Sep 17 00:00:00 2001 From: markus schnalke Date: Sun, 12 Feb 2012 12:31:01 +0100 Subject: [PATCH] Temporary state of spost rework: Things should work if you don't use Bcc: hdrs. The simple changes: Removed -[no]filter and did some minor refactoring. The complex changes: First steps in reworking the Bcc-related code. Don't use Bcc: headers with this state of code. They simply are ignored. --- uip/spost.c | 237 ++++++++++++++++++++++++----------------------------------- 1 file changed, 96 insertions(+), 141 deletions(-) diff --git a/uip/spost.c b/uip/spost.c index 5afa435..8b4b830 100644 --- a/uip/spost.c +++ b/uip/spost.c @@ -15,42 +15,37 @@ #include #include #include -#include #include #define MAX_SM_FIELD 1476 /* < largest hdr field sendmail will accept */ #define FCCS 10 /* max number of fccs allowed */ struct swit switches[] = { -#define FILTSW 0 - { "filter filterfile", 0 }, -#define NFILTSW 1 - { "nofilter", 0 }, -#define VERBSW 2 +#define VERBSW 0 { "verbose", 0 }, -#define NVERBSW 3 +#define NVERBSW 1 { "noverbose", 0 }, -#define WATCSW 4 +#define WATCSW 2 { "watch", 0 }, -#define NWATCSW 5 +#define NWATCSW 3 { "nowatch", 0 }, -#define ALIASW 6 +#define ALIASW 4 { "alias aliasfile", 0 }, -#define NALIASW 7 +#define NALIASW 5 { "noalias", 0 }, -#define VERSIONSW 8 +#define VERSIONSW 6 { "version", 0 }, -#define HELPSW 9 +#define HELPSW 7 { "help", 0 }, -#define DEBUGSW 10 +#define DEBUGSW 8 { "debug", -5 }, -#define DISTSW 11 +#define DISTSW 9 { "dist", -4 }, /* interface from dist */ -#define PUSHSW 12 /* fork to sendmail then exit */ +#define PUSHSW 10 /* fork to sendmail then exit */ { "push", -4 }, -#define NPUSHSW 13 /* exec sendmail */ +#define NPUSHSW 11 /* exec sendmail */ { "nopush", -6 }, -#define LIBSW 14 +#define LIBSW 12 { "library directory", -7 }, { NULL, 0 } }; @@ -63,11 +58,10 @@ struct swit switches[] = { #define HSUB 0x0004 /* Subject: header */ #define HTRY 0x0008 /* try to send to addrs on header */ #define HBCC 0x0010 /* don't output this header */ -#define HMNG 0x0020 /* mung this header */ -#define HNGR 0x0040 /* no groups allowed in this header */ -#define HFCC 0x0080 /* FCC: type header */ -#define HNIL 0x0100 /* okay for this header not to have addrs */ -#define HIGN 0x0200 /* ignore this header */ +#define HNGR 0x0020 /* no groups allowed in this header */ +#define HFCC 0x0040 /* FCC: type header */ +#define HNIL 0x0080 /* okay for this header not to have addrs */ +#define HIGN 0x0100 /* ignore this header */ /* flags for headers->set */ #define MFRM 0x0001 /* we've seen a From: */ @@ -130,12 +124,13 @@ static enum { normal, resent } msgstate = normal; -static char tmpfil[] = "/tmp/pstXXXXXX"; +static char tmpfil[] = "/tmp/spost-XXXXXX"; +static char bccfil[] = "/tmp/spost-bcc-XXXXXX"; -static char *filter = NULL; /* the filter for BCC'ing */ static char *subject = NULL; /* the subject field for BCC'ing */ static char *fccfold[FCCS]; /* foldernames for FCC'ing */ static short fccind = 0; /* index into fccfold[] */ +struct mailname *bccs = NULL; static struct headers *hdrtab; /* table for the message we're doing */ static FILE *out; /* output (temp) file */ @@ -143,12 +138,6 @@ static FILE *out; /* output (temp) file */ extern char *sendmail; /* -** external prototypes -*/ -extern char *getfullname(void); -extern char *getusername(void); - -/* ** static prototypes */ static void putfmt(char *, char *, FILE *); @@ -158,10 +147,7 @@ static void putadr(char *, struct mailname *); static int putone(char *, int, int); static void insert_fcc(char *, unsigned char *); static void fcc(char *, char *); - -#if 0 -static void make_bcc_file(void); -#endif +static void make_bcc_draft(char *); int @@ -211,15 +197,6 @@ main(int argc, char **argv) msgstate = resent; continue; - case FILTSW: - if (!(filter = *argp++) || *filter == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - continue; - case NFILTSW: - filter = NULL; - continue; - case VERBSW: verbose++; continue; @@ -349,6 +326,11 @@ main(int argc, char **argv) fcc(tmpfil, fccfold[i]); } + /* process Bcc */ + if (bccs) { + make_bcc_draft(tmpfil); + } + /* ** re-open the temp file, unlink it and exec sendmail, giving it ** the msg temp file as std in. @@ -363,11 +345,13 @@ main(int argc, char **argv) *argp++ = "-m"; /* send to me too */ *argp++ = "-t"; /* read msg for recipients */ *argp++ = "-i"; /* don't stop on "." */ - if (watch || verbose) + if (watch || verbose) { *argp++ = "-v"; + pushflg = 0; + } *argp = NULL; - if (pushflg && !(watch || verbose)) { + if (pushflg) { /* fork to a child to run sendmail */ for (i=0; (pid = fork()) == NOTOK && i < 5; i++) sleep(5); @@ -384,6 +368,25 @@ main(int argc, char **argv) exit(0); } } + + if (0 /*bccs*/) { + /* fork to a child to run sendmail */ + for (i=0; (pid = fork()) == NOTOK && i < 5; i++) + sleep(5); + switch (pid) { + case NOTOK: + fprintf(verbose ? stdout : stderr, + "%s: can't fork to %s\n", + invo_name, sendmail); + exit(-1); + case OK: + /* we're the child .. */ + exit(0); + default: + exit(0); + } + } + execv(sendmail, sargv); adios(sendmail, "can't exec"); return 0; /* dead code to satisfy the compiler */ @@ -406,9 +409,9 @@ putfmt(char *name, char *str, FILE *out) fprintf(out, "%s: %s", name, str); return; } - /* one of the interesting headers */ hdr = &hdrtab[i]; + if (hdr->flags & HIGN) { return; } @@ -421,7 +424,7 @@ putfmt(char *name, char *str, FILE *out) if (hdr->flags & HSUB) { if (subject) { - /* append mupliple subject */ + /* concatenate mupliple subject */ char *cp = concat(subject, "\t", str, NULL); free(subject); subject = cp; @@ -442,15 +445,17 @@ putfmt(char *name, char *str, FILE *out) return; } -#ifdef notdef - if (hdr->flags & HBCC) { - insert_bcc(str); - return; - } -#endif /* notdef */ - if (*str != '\n' && *str != '\0') { - if (aliasflg && hdr->flags & HTRY) { + if (hdr->flags & HBCC) { + struct mailname *mp = NULL; + + /* Create list of Bcc adds. */ + while ((cp = getname(str))) { + mp = getm(cp, NULL, 0, AD_HOST, NULL); + mp->m_next = bccs; /* push */ + bccs = mp; + } + } else if (aliasflg && hdr->flags & HTRY) { /* ** this header contains address(es) that we have to do ** alias expansion on. Because of the saved state in @@ -527,11 +532,9 @@ finish_headers(FILE *out) /* In case the From: header contains multiple addresses. */ fprintf(out, "%sSender: %s\n", resentstr, from); } -#ifdef notdef - if (!(msgflags & MVIS)) + if (!(msgflags & MVIS)) { fprintf(out, "%sBcc: Blind Distribution List: ;\n", resentstr); -#endif /* notdef */ - + } if (badmsg) { adios(NULL, "re-format message and try again"); } @@ -564,9 +567,9 @@ get_header(char *header, struct headers *table) static void putadr(char *name, struct mailname *nl) { - register struct mailname *mp, *mp2; - register int linepos; - register char *cp; + struct mailname *mp, *mp2; + int linepos; + char *cp; int namelen; fprintf(out, "%s: ", name); @@ -661,84 +664,6 @@ insert_fcc(char *name, unsigned char *pp) fccfold[fccind++] = getcpy(cp); } -#if 0 -/* BCC GENERATION */ - -static void -make_bcc_file(void) -{ - pid_t child_id; - int fd, i, status; - char *vec[6]; - FILE * in, *out; - -#ifdef HAVE_MKSTEMP - fd = mkstemp(bccfil); - if (fd == -1 || (out = fdopen(fd, "w")) == NULL) - adios(bccfil, "unable to create"); -#else - mktemp(bccfil); - if ((out = fopen(bccfil, "w")) == NULL) - adios(bccfil, "unable to create"); -#endif - chmod(bccfil, 0600); - - fprintf(out, "Date: %s\n", dtimenow(0)); - if (!(msgflags & MFRM)) { - /* Construct a From: header. */ - fprintf(out, "From: %s\n", signature); - } else { - /* Add a Sender: header in case the From: header is fake. */ - fprintf(out, "Sender: %s\n", from); - } - if (subject) - fprintf(out, "Subject: %s", subject); - fprintf(out, "BCC:\n\n------- Blind-Carbon-Copy\n\n"); - fflush(out); - - if (!filter) { - if ((fd = open(tmpfil, O_RDONLY)) == NOTOK) - adios(NULL, "unable to re-open"); - cpydgst(fd, fileno(out), tmpfil, bccfil); - close(fd); - } else { - vec[0] = mhbasename(mhlproc); - - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep(5); - switch (child_id) { - case NOTOK: - adios("fork", "unable to"); - - case OK: - dup2(fileno(out), 1); - - i = 1; - vec[i++] = "-forward"; - vec[i++] = "-form"; - vec[i++] = filter; - vec[i++] = tmpfil; - vec[i] = NULL; - - execvp(mhlproc, vec); - adios(mhlproc, "unable to exec"); - - default: - if (status = pidwait(child_id, OK)) - admonish(NULL, "%s lost (status=0%o)", - vec[0], status); - break; - } - } - - fseek(out, 0L, SEEK_END); - fprintf(out, "\n------- End of Blind-Carbon-Copy\n"); - fclose(out); -} -#endif /* if 0 */ - - -/* FCC INTERACTION */ static void fcc(char *file, char *folder) @@ -788,3 +713,33 @@ fcc(char *file, char *folder) fflush(stdout); } + + +/* BCC GENERATION */ + +static void +make_bcc_draft(char *draft) +{ + int fd; + FILE *out; + +#ifdef HAVE_MKSTEMP + fd = mkstemp(bccfil); + if (fd == -1 || (out = fdopen(fd, "w")) == NULL) + adios(bccfil, "unable to create"); +#else + mktemp(bccfil); + if ((out = fopen(bccfil, "w")) == NULL) + adios(bccfil, "unable to create"); +#endif + chmod(bccfil, 0600); + + if (subject) { + fprintf(out, "Subject: BCC: %s", subject); + } else { + fprintf(out, "Subject: BCC: message without subject"); + } + fprintf(out, "%s: %s\n", attach_hdr, draft); + fprintf(out, "------------\n"); + fclose(out); +} -- 1.7.10.4