X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhlsbr.c;h=5625fa18dd90926afa70e4838f48c0ab6a52ce15;hp=2cd7c8fbc05bb6e4b95b2a29e2ca173b599e3c60;hb=41f62fc47ef6f2d223b7584b3bb912e65a630445;hpb=f12a3e5036a986f579b80861f4421bcb86f84cee diff --git a/uip/mhlsbr.c b/uip/mhlsbr.c index 2cd7c8f..5625fa1 100644 --- a/uip/mhlsbr.c +++ b/uip/mhlsbr.c @@ -49,43 +49,35 @@ static struct swit mhlswitches[] = { { "clear", 0 }, #define NCLRSW 3 { "noclear", 0 }, -#define FACESW 4 - { "faceproc program", 0 }, -#define NFACESW 5 - { "nofaceproc", 0 }, -#define FOLDSW 6 +#define FOLDSW 4 { "folder +folder", 0 }, -#define FORMSW 7 +#define FORMSW 5 { "form formfile", 0 }, -#define PROGSW 8 +#define PROGSW 6 { "moreproc program", 0 }, -#define NPROGSW 9 +#define NPROGSW 7 { "nomoreproc", 0 }, -#define LENSW 10 +#define LENSW 8 { "length lines", 0 }, -#define WIDTHSW 11 +#define WIDTHSW 9 { "width columns", 0 }, -#define SLEEPSW 12 +#define SLEEPSW 10 { "sleep seconds", 0 }, -#define BITSTUFFSW 13 - { "dashstuffing", -12 }, /* interface from forw */ -#define NBITSTUFFSW 14 - { "nodashstuffing", -14 }, /* interface from forw */ -#define VERSIONSW 15 +#define VERSIONSW 11 { "version", 0 }, -#define HELPSW 16 +#define HELPSW 12 { "help", 0 }, -#define FORW1SW 17 - { "forward", -7 }, /* interface from forw */ -#define FORW2SW 18 - { "forwall", -7 }, /* interface from forw */ -#define DGSTSW 19 +#define FORW1SW 13 + { "forward", -7 }, +#define FORW2SW 14 + { "forwall", -7 }, +#define DGSTSW 15 { "digest list", -6 }, -#define VOLUMSW 20 +#define VOLUMSW 16 { "volume number", -6 }, -#define ISSUESW 21 +#define ISSUESW 17 { "issue number", -5 }, -#define NBODYSW 22 +#define NBODYSW 18 { "nobody", -6 }, { NULL, 0 } }; @@ -104,11 +96,9 @@ static struct swit mhlswitches[] = { #define DATEFMT 0x000800 /* contains dates */ #define FORMAT 0x001000 /* parse address/date/RFC-2047 field */ #define INIT 0x002000 /* initialize component */ -#define FACEFMT 0x004000 /* contains face */ -#define FACEDFLT 0x008000 /* default for face */ -#define SPLIT 0x010000 /* split headers (don't concatenate) */ -#define NONEWLINE 0x020000 /* don't write trailing newline */ -#define LBITS "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07CLEARSCR\010LEFTADJUST\011COMPRESS\012ADDRFMT\013BELL\014DATEFMT\015FORMAT\016INIT\017FACEFMT\020FACEDFLT\021SPLIT\022NONEWLINE" +#define SPLIT 0x004000 /* split headers (don't concatenate) */ +#define NONEWLINE 0x008000 /* don't write trailing newline */ +#define LBITS "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07CLEARSCR\010LEFTADJUST\011COMPRESS\012ADDRFMT\013BELL\014DATEFMT\015FORMAT\016INIT\017SPLIT\020NONEWLINE" #define GFLAGS (NOCOMPONENT | UPPERCASE | CENTER | LEFTADJUST | COMPRESS | SPLIT) struct mcomp { @@ -117,7 +107,6 @@ struct mcomp { char *c_ovtxt; /* text overflow indicator */ char *c_nfs; /* iff FORMAT */ struct format *c_fmt; /* .. */ - char *c_face; /* face designator */ int c_offset; /* left margin indentation */ int c_ovoff; /* overflow indentation */ int c_width; /* width of field */ @@ -147,11 +136,11 @@ struct pair { static struct pair pairs[] = { { "Date", DATEFMT }, - { "From", ADDRFMT|FACEDFLT }, + { "From", ADDRFMT }, { "Sender", ADDRFMT }, { "Reply-To", ADDRFMT }, { "To", ADDRFMT }, - { "cc", ADDRFMT }, + { "Cc", ADDRFMT }, { "Bcc", ADDRFMT }, { "Resent-Date", DATEFMT }, { "Resent-From", ADDRFMT }, @@ -160,7 +149,6 @@ static struct pair pairs[] = { { "Resent-To", ADDRFMT }, { "Resent-Cc", ADDRFMT }, { "Resent-Bcc", ADDRFMT }, - { "Face", FACEFMT }, { NULL, 0 } }; @@ -197,7 +185,6 @@ static struct triple triples[] = { static int bellflg = 0; static int clearflg = 0; -static int dashstuff = 0; static int dobody = 1; static int forwflg = 0; static int forwall = 0; @@ -237,8 +224,8 @@ static char *ignores[MAXARGS]; static jmp_buf env; static jmp_buf mhlenv; -static char delim3[] = /* from forw.c */ - "\n----------------------------------------------------------------------\n\n"; +static char delim3[] = +"\n----------------------------------------------------------------------\n\n"; static char delim4[] = "\n------------------------------\n\n"; static FILE *(*mhl_action) () = (FILE *(*) ()) 0; @@ -274,8 +261,6 @@ static void putch(char); static RETSIGTYPE intrser(int); static RETSIGTYPE pipeser(int); static RETSIGTYPE quitser(int); -static void face_format(struct mcomp *); -static int doface(struct mcomp *); static void mhladios(char *, char *, ...); static void mhldone(int); static void m_popen(char *); @@ -311,119 +296,114 @@ mhl(int argc, char **argv) if ((cp = getenv("MHLDEBUG")) && *cp) mhldebug++; - if ((cp = getenv("FACEPROC"))) - faceproc = cp; - while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, mhlswitches)) { - case AMBIGSW: - ambigsw(cp, mhlswitches); - done(1); - case UNKWNSW: - adios(NULL, "-%s unknown\n", cp); - - case HELPSW: - snprintf(buf, sizeof(buf), "%s [switches] [files ...]", invo_name); - print_help(buf, mhlswitches, 1); - done(1); - case VERSIONSW: - print_version(invo_name); - done(1); - - case BELLSW: - bellflg = 1; - continue; - case NBELLSW: - bellflg = -1; - continue; - - case CLRSW: - clearflg = 1; - continue; - case NCLRSW: - clearflg = -1; - continue; + case AMBIGSW: + ambigsw(cp, mhlswitches); + done(1); + case UNKWNSW: + adios(NULL, "-%s unknown\n", cp); + + case HELPSW: + snprintf(buf, sizeof(buf), "%s [switches] [files ...]", invo_name); + print_help(buf, mhlswitches, 1); + done(1); + case VERSIONSW: + print_version(invo_name); + done(1); + + case BELLSW: + bellflg = 1; + continue; + case NBELLSW: + bellflg = -1; + continue; - case FOLDSW: - if (!(folder = *argp++) || - *folder == '-') - adios(NULL, "missing argument to %s", argp[-2]); - continue; - case FORMSW: - if (!(form = *argp++) || *form == '-') - adios(NULL, "missing argument to %s", argp[-2]); - continue; + case CLRSW: + clearflg = 1; + continue; + case NCLRSW: + clearflg = -1; + continue; - case FACESW: - if (!(faceproc = *argp++) || *faceproc == '-') - adios(NULL, "missing argument to %s", argp[-2]); - continue; - case NFACESW: - faceproc = NULL; - continue; - case SLEEPSW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", argp[-2]); - sleepsw = atoi(cp); /* ZERO ok! */ - continue; + case FOLDSW: + if (!(folder = *argp++) || *folder == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case FORMSW: + if (!(form = *argp++) || *form == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + continue; - case PROGSW: - if (!(moreproc = *argp++) || *moreproc == '-') - adios(NULL, "missing argument to %s", argp[-2]); - continue; - case NPROGSW: - nomore++; - continue; + case SLEEPSW: + if (!(cp = *argp++) || *cp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + sleepsw = atoi(cp); /* ZERO ok! */ + continue; - case LENSW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", argp[-2]); - if ((length = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", argp[-2], cp); - continue; - case WIDTHSW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", argp[-2]); - if ((width = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", argp[-2], cp); - continue; + case PROGSW: + if (!(moreproc = *argp++) || *moreproc == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case NPROGSW: + nomore++; + continue; - case DGSTSW: - if (!(digest = *argp++) || - *digest == '-') - adios(NULL, "missing argument to %s", argp[-2]); - continue; - case ISSUESW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", argp[-2]); - if ((issue = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", argp[-2], cp); - continue; - case VOLUMSW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", argp[-2]); - if ((volume = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", argp[-2], cp); - continue; + case LENSW: + if (!(cp = *argp++) || *cp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + if ((length = atoi(cp)) < 1) + adios(NULL, "bad argument %s %s", + argp[-2], cp); + continue; + case WIDTHSW: + if (!(cp = *argp++) || *cp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + if ((width = atoi(cp)) < 1) + adios(NULL, "bad argument %s %s", + argp[-2], cp); + continue; - case FORW2SW: - forwall++; /* fall */ - case FORW1SW: - forwflg++; - clearflg = -1;/* XXX */ - continue; + case DGSTSW: + if (!(digest = *argp++) || + *digest == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case ISSUESW: + if (!(cp = *argp++) || *cp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + if ((issue = atoi(cp)) < 1) + adios(NULL, "bad argument %s %s", + argp[-2], cp); + continue; + case VOLUMSW: + if (!(cp = *argp++) || *cp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + if ((volume = atoi(cp)) < 1) + adios(NULL, "bad argument %s %s", + argp[-2], cp); + continue; - case BITSTUFFSW: - dashstuff = 1; /* trinary logic */ - continue; - case NBITSTUFFSW: - dashstuff = -1; /* trinary logic */ - continue; + case FORW2SW: + forwall++; /* fall */ + case FORW1SW: + forwflg++; + clearflg = -1;/* XXX */ + continue; - case NBODYSW: - dobody = 0; - continue; + case NBODYSW: + dobody = 0; + continue; } } files[vecp++] = cp; @@ -555,69 +535,64 @@ mhl_format(char *file, int length, int width) parptr = bp; strncpy(name, parse(), sizeof(name)); switch(*parptr) { - case '\0': - case ',': - case '=': + case '\0': + case ',': + case '=': + /* + ** Split this list of fields to ignore, and copy + ** it to the end of the current "ignores" list. + */ + if (!mh_strcasecmp(name, "ignores")) { + char **tmparray, **p; + int n = 0; + + /* split the fields */ + tmparray = brkstring(getcpy(++parptr), ",", + NULL); + + /* count number of fields split */ + p = tmparray; + while (*p++) + n++; + /* - ** Split this list of fields to ignore, - ** and copy it to the end of the current - ** "ignores" list. + ** copy pointers to split fields + ** to ignores array */ - if (!mh_strcasecmp(name, "ignores")) { - char **tmparray, **p; - int n = 0; - - /* split the fields */ - tmparray = brkstring(getcpy(++parptr), - ",", NULL); - - /* count number of fields split */ - p = tmparray; - while (*p++) - n++; - - /* - ** copy pointers to split fields - ** to ignores array - */ - ip = copyip(tmparray, ip, - MAXARGS - num_ignores); - num_ignores += n; - continue; - } - parptr = bp; - while (*parptr) { - if (evalvar(&global)) - adios(NULL, "format file syntax error: %s", bp); - if (*parptr) - parptr++; - } + ip = copyip(tmparray, ip, + MAXARGS - num_ignores); + num_ignores += n; continue; - - case ':': - c1 = add_queue(&fmthd, &fmttl, name, NULL, - INIT); - while (*parptr == ':' || *parptr == ',') { + } + parptr = bp; + while (*parptr) { + if (evalvar(&global)) + adios(NULL, "format file syntax error: %s", bp); + if (*parptr) parptr++; - if (evalvar(c1)) - adios(NULL, "format file syntax error: %s", bp); - } - if (!c1->c_nfs && global.c_nfs) { - if (c1->c_flags & DATEFMT) { - if (global.c_flags & DATEFMT) - c1->c_nfs = getcpy(global.c_nfs); - } - else - if (c1->c_flags & ADDRFMT) { - if (global.c_flags & ADDRFMT) - c1->c_nfs = getcpy(global.c_nfs); - } + } + continue; + + case ':': + c1 = add_queue(&fmthd, &fmttl, name, NULL, INIT); + while (*parptr == ':' || *parptr == ',') { + parptr++; + if (evalvar(c1)) + adios(NULL, "format file syntax error: %s", bp); + } + if (!c1->c_nfs && global.c_nfs) { + if ((c1->c_flags & DATEFMT) && + (global.c_flags & DATEFMT)) { + c1->c_nfs = getcpy(global.c_nfs); + } else if ((c1->c_flags & ADDRFMT) && + (global.c_flags & ADDRFMT)) { + c1->c_nfs = getcpy(global.c_nfs); } - continue; + } + continue; - default: - adios(NULL, "format file syntax error: %s", - bp); + default: + adios(NULL, "format file syntax error: %s", bp); } } fclose(fp); @@ -640,12 +615,12 @@ out: } switch (bellflg) { /* command line may override format file */ - case 1: - global.c_flags |= BELL; - break; - case -1: - global.c_flags &= ~BELL; - break; + case 1: + global.c_flags |= BELL; + break; + case -1: + global.c_flags &= ~BELL; + break; } if (length) @@ -684,7 +659,9 @@ evalvar(struct mcomp *c1) if (ptos(name, &cp)) return 1; - nfs = new_fs(NULL, NULL, cp); + cp = concat("=", cp, NULL); + nfs = new_fs(cp, NULL); + free(cp); c1->c_nfs = getcpy(nfs); c1->c_flags |= FORMAT; return 0; @@ -693,7 +670,7 @@ evalvar(struct mcomp *c1) if (!mh_strcasecmp(name, "decode")) { char *nfs; - nfs = new_fs(NULL, NULL, "%(decode{text})"); + nfs = new_fs("=%(decode{text})", NULL); c1->c_nfs = getcpy(nfs); c1->c_flags |= FORMAT; return 0; @@ -709,8 +686,6 @@ evalvar(struct mcomp *c1) return ptoi(name, &c1->c_cwidth); if (!mh_strcasecmp(name, "length")) return ptoi(name, &c1->c_length); - if (!mh_strcasecmp(name, "nodashstuffing")) - return (dashstuff = -1); for (ap = triples; ap->t_name; ap++) if (!mh_strcasecmp(ap->t_name, name)) { @@ -800,39 +775,38 @@ process(char *folder, char *fname, int ofilen, int ofilec) struct mcomp *c1; switch (setjmp(env)) { - case OK: - if (fname) { - fp = mhl_action ? (*mhl_action) (fname) : - fopen(fname, "r"); - if (fp == NULL) { - advise(fname, "unable to open"); - exitstat++; - return; - } - } else { - fname = "(stdin)"; - fp = stdin; + case OK: + if (fname) { + fp = mhl_action ? (*mhl_action) (fname) : + fopen(fname, "r"); + if (fp == NULL) { + advise(fname, "unable to open"); + exitstat++; + return; } - cp = folder ? concat(folder, ":", fname, NULL) : - getcpy(fname); - if (ontty != PITTY) - SIGNAL(SIGINT, intrser); - mhlfile(fp, cp, ofilen, ofilec); /* FALL THROUGH! */ + } else { + fname = "(stdin)"; + fp = stdin; + } + cp = folder ? concat(folder, ":", fname, NULL) : getcpy(fname); + if (ontty != PITTY) + SIGNAL(SIGINT, intrser); + mhlfile(fp, cp, ofilen, ofilec); /* FALL THROUGH! */ - default: - if (ontty != PITTY) - SIGNAL(SIGINT, SIG_IGN); - if (mhl_action == NULL && fp != stdin) - fclose(fp); - free(cp); - if (holder.c_text) { - free(holder.c_text); - holder.c_text = NULL; - } - free_queue(&msghd, &msgtl); - for (c1 = fmthd; c1; c1 = c1->c_next) - c1->c_flags &= ~HDROUTPUT; - break; + default: + if (ontty != PITTY) + SIGNAL(SIGINT, SIG_IGN); + if (mhl_action == NULL && fp != stdin) + fclose(fp); + free(cp); + if (holder.c_text) { + free(holder.c_text); + holder.c_text = NULL; + } + free_queue(&msghd, &msgtl); + for (c1 = fmthd; c1; c1 = c1->c_next) + c1->c_flags &= ~HDROUTPUT; + break; } } @@ -858,146 +832,136 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) } } else { switch (ontty) { - case PITTY: - if (ofilec > 1) { - if (ofilen > 1) { - if ((global.c_flags & CLEARSCR)) - clear_screen(); - else - printf("\n\n\n"); - } - printf(">>> %s\n\n", mname); - } - break; - - case ISTTY: - strncpy(buf, "\n", sizeof(buf)); - if (ofilec > 1) { - if (SOprintf("Press to list \"%s\"...", mname)) { - if (ofilen > 1) - printf("\n\n\n"); - printf("Press to list \"%s\"...", mname); - } - fflush(stdout); - buf[0] = 0; - read(fileno(stdout), buf, sizeof(buf)); - } - if (strchr(buf, '\n')) { + case PITTY: + if (ofilec > 1) { + if (ofilen > 1) { if ((global.c_flags & CLEARSCR)) clear_screen(); + else + printf("\n\n\n"); } - else - printf("\n"); - break; + printf(">>> %s\n\n", mname); + } + break; - default: - if (ofilec > 1) { - if (ofilen > 1) { + case ISTTY: + strncpy(buf, "\n", sizeof(buf)); + if (ofilec > 1) { + if (SOprintf("Press to list \"%s\"...", mname)) { + if (ofilen > 1) printf("\n\n\n"); - if (clearflg > 0) - clear_screen(); - } - printf(">>> %s\n\n", mname); + printf("Press to list \"%s\"...", mname); } - break; + fflush(stdout); + buf[0] = 0; + read(fileno(stdout), buf, sizeof(buf)); + } + if (strchr(buf, '\n')) { + if ((global.c_flags & CLEARSCR)) + clear_screen(); + } else + printf("\n"); + break; + + default: + if (ofilec > 1) { + if (ofilen > 1) { + printf("\n\n\n"); + if (clearflg > 0) + clear_screen(); + } + printf(">>> %s\n\n", mname); + } + break; } } for (state = FLD;;) { switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) { - case FLD: - case FLDPLUS: - for (ip = ignores; *ip; ip++) - if (!mh_strcasecmp(name, *ip)) { - while (state == FLDPLUS) - state = m_getfld(state, name, buf, sizeof(buf), fp); - break; - } - if (*ip) - continue; - - for (c2 = fmthd; c2; c2 = c2->c_next) - if (!mh_strcasecmp(c2->c_name, name)) - break; - c1 = NULL; - if (!((c3 = c2 ? c2 : &global)->c_flags & SPLIT)) - for (c1 = msghd; c1; c1 = c1->c_next) - if (!mh_strcasecmp(c1->c_name, c3->c_name)) { - c1->c_text = mcomp_add (c1->c_flags, buf, c1->c_text); - break; - } - if (c1 == NULL) - c1 = add_queue(&msghd, &msgtl, name, buf, 0); - while (state == FLDPLUS) { - state = m_getfld(state, name, buf, sizeof(buf), fp); - c1->c_text = add(buf, c1->c_text); + case FLD: + case FLDPLUS: + for (ip = ignores; *ip; ip++) + if (!mh_strcasecmp(name, *ip)) { + while (state == FLDPLUS) + state = m_getfld(state, name, buf, sizeof(buf), fp); + break; } - if (c2 == NULL) - c1->c_flags |= EXTRA; + if (*ip) continue; - case BODY: - case FILEEOF: - row = column = 0; - for (c1 = fmthd; c1; c1 = c1->c_next) { - if (c1->c_flags & CLEARTEXT) { - putcomp(c1, c1, ONECOMP); - continue; - } - if (!mh_strcasecmp(c1->c_name, "messagename")) { - holder.c_text = concat("(Message ", mname, ")\n", - NULL); - putcomp(c1, &holder, ONECOMP); - free(holder.c_text); - holder.c_text = NULL; - continue; - } - if (!mh_strcasecmp(c1->c_name, "extras")) { - for (c2 = msghd; c2; c2 = c2->c_next) - if (c2->c_flags & EXTRA) - putcomp(c1, c2, TWOCOMP); - continue; - } - if (dobody && !mh_strcasecmp(c1->c_name, "body")) { - holder.c_text = mh_xmalloc(sizeof(buf)); - strncpy(holder.c_text, buf, sizeof(buf)); - while (state == BODY) { - putcomp(c1, &holder, BODYCOMP); - state = m_getfld(state, name, holder.c_text, sizeof(buf), fp); - } - free(holder.c_text); - holder.c_text = NULL; - continue; + for (c2 = fmthd; c2; c2 = c2->c_next) + if (!mh_strcasecmp(c2->c_name, name)) + break; + c1 = NULL; + if (!((c3 = c2 ? c2 : &global)->c_flags & SPLIT)) + for (c1 = msghd; c1; c1 = c1->c_next) + if (!mh_strcasecmp(c1->c_name, + c3->c_name)) { + c1->c_text = mcomp_add(c1->c_flags, buf, c1->c_text); + break; } + if (c1 == NULL) + c1 = add_queue(&msghd, &msgtl, name, buf, 0); + while (state == FLDPLUS) { + state = m_getfld(state, name, buf, + sizeof(buf), fp); + c1->c_text = add(buf, c1->c_text); + } + if (c2 == NULL) + c1->c_flags |= EXTRA; + continue; + + case BODY: + case FILEEOF: + row = column = 0; + for (c1 = fmthd; c1; c1 = c1->c_next) { + if (c1->c_flags & CLEARTEXT) { + putcomp(c1, c1, ONECOMP); + continue; + } + if (!mh_strcasecmp(c1->c_name, "messagename")) { + holder.c_text = concat("(Message ", + mname, ")\n", NULL); + putcomp(c1, &holder, ONECOMP); + free(holder.c_text); + holder.c_text = NULL; + continue; + } + if (!mh_strcasecmp(c1->c_name, "extras")) { for (c2 = msghd; c2; c2 = c2->c_next) - if (!mh_strcasecmp(c2->c_name, c1->c_name)) { - putcomp(c1, c2, ONECOMP); - if (!(c1->c_flags & SPLIT)) - break; - } - if (faceproc && c2 == NULL && (c1->c_flags & FACEFMT)) - for (c2 = msghd; c2; c2 = c2->c_next) - if (c2->c_flags & FACEDFLT) { - if (c2->c_face == NULL) - face_format(c2); - if ((holder.c_text = c2->c_face)) { - putcomp(c1, &holder, ONECOMP); - holder.c_text = NULL; - } - break; - } + if (c2->c_flags & EXTRA) + putcomp(c1, c2, TWOCOMP); + continue; } - return; + if (dobody && !mh_strcasecmp(c1->c_name, "body")) { + holder.c_text = mh_xmalloc(sizeof(buf)); + strncpy(holder.c_text, buf, sizeof(buf)); + while (state == BODY) { + putcomp(c1, &holder, BODYCOMP); + state = m_getfld(state, name, holder.c_text, sizeof(buf), fp); + } + free(holder.c_text); + holder.c_text = NULL; + continue; + } + for (c2 = msghd; c2; c2 = c2->c_next) + if (!mh_strcasecmp(c2->c_name, + c1->c_name)) { + putcomp(c1, c2, ONECOMP); + if (!(c1->c_flags & SPLIT)) + break; + } + } + return; - case LENERR: - case FMTERR: - advise(NULL, "format error in message %s", - mname); - exitstat++; - return; + case LENERR: + case FMTERR: + advise(NULL, "format error in message %s", mname); + exitstat++; + return; - default: - adios(NULL, "getfld() returned %d", state); + default: + adios(NULL, "getfld() returned %d", state); } } } @@ -1084,15 +1048,6 @@ mcomp_format(struct mcomp *c1, struct mcomp *c2) p->pq_text = getcpy(cp); p->pq_error = getcpy(error); } else { - if ((c1->c_flags & FACEDFLT) && c2->c_face == NULL) { - char *h, *o; - if ((h = mp->m_host) == NULL) - h = LocalName(); - if ((o = OfficialName(h))) - h = o; - c2->c_face = concat("address ", h, " ", - mp->m_mbox, NULL); - } p->pq_text = getcpy(mp->m_text); mnfree(mp); } @@ -1177,8 +1132,6 @@ free_queue(struct mcomp **head, struct mcomp **tail) free(c1->c_nfs); if (c1->c_fmt) free((char *) c1->c_fmt); - if (c1->c_face) - free(c1->c_face); free((char *) c1); } @@ -1210,16 +1163,6 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) return; } - if (c1->c_flags & FACEFMT) - switch (doface(c2)) { - case NOTOK: /* error */ - case OK: /* async faceproc */ - return; - - default: /* sync faceproc */ - break; - } - if (c1->c_nfs && (c1->c_flags & (ADDRFMT | DATEFMT | FORMAT))) mcomp_format(c1, c2); @@ -1384,53 +1327,53 @@ putch(char ch) return; switch (ch) { - case '\n': - if (llim > 0) - llim--; - column = 0; - row++; - if (ontty != ISTTY || row != global.c_length) - break; - if (global.c_flags & BELL) - putchar('\007'); - fflush(stdout); - buf[0] = 0; - read(fileno(stdout), buf, sizeof(buf)); - if (strchr(buf, '\n')) { - if (global.c_flags & CLEARSCR) - clear_screen(); - row = 0; - } else { - putchar('\n'); - row = global.c_length / 3; - } - return; - - case '\t': - column |= 07; - column++; - break; - - case '\b': - column--; - break; - - case '\r': - column = 0; + case '\n': + if (llim > 0) + llim--; + column = 0; + row++; + if (ontty != ISTTY || row != global.c_length) break; + if (global.c_flags & BELL) + putchar('\007'); + fflush(stdout); + buf[0] = 0; + read(fileno(stdout), buf, sizeof(buf)); + if (strchr(buf, '\n')) { + if (global.c_flags & CLEARSCR) + clear_screen(); + row = 0; + } else { + putchar('\n'); + row = global.c_length / 3; + } + return; - default: - /* - ** If we are forwarding this message, and the first - ** column contains a dash, then add a dash and a space. - */ - if (column == 0 && forwflg && (dashstuff >= 0) && ch == '-') { - putchar('-'); - putchar(' '); - } - if (ch >= ' ') - column++; - break; + case '\t': + column |= 07; + column++; + break; + + case '\b': + column--; + break; + + case '\r': + column = 0; + break; + + default: + /* + ** If we are forwarding this message, and the first + ** column contains a dash, then add a dash and a space. + */ + if (column == 0 && forwflg && ch == '-') { + putchar('-'); + putchar(' '); + } + if (ch >= ' ') + column++; + break; } if (column >= wid) { @@ -1483,211 +1426,6 @@ quitser(int i) } -static void -face_format(struct mcomp *c1) -{ - char *cp; - struct mailname *mp; - - if ((cp = c1->c_text) == NULL) - return; - - if ((cp = getname(cp))) { - if ((mp = getm(cp, NULL, 0, AD_NAME, NULL))) { - char *h, *o; - if ((h = mp->m_host) == NULL) - h = LocalName(); - if ((o = OfficialName(h))) - h = o; - c1->c_face = concat("address ", h, " ", mp->m_mbox, - NULL); - } - - while ((cp = getname(cp))) - continue; - } -} - - -/* -** faceproc is two elements defining the image agent's location: -** Internet host -** UDP port -*/ - -#include -#include -#include - -#ifdef HAVE_ARPA_INET_H -# include -#endif - -static int -doface(struct mcomp *c1) -{ - int result, sd; - static int inited = OK; - static struct sockaddr_storage ss; - static socklen_t socklen; - static int socktype; - static int protocol; - - if (inited == OK) { - char *cp; - char **ap = brkstring(cp = getcpy(faceproc), " ", "\n"); - struct addrinfo hints, *res; - - if (ap[0] == NULL || ap[1] == NULL) { -bad_faceproc: ; - free(cp); - return (inited = NOTOK); - } - - memset(&hints, 0, sizeof(hints)); -#ifdef AI_ADDRCONFIG - hints.ai_flags = AI_ADDRCONFIG; -#endif - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - - if (getaddrinfo(ap[0], ap[1], &hints, &res) != 0) - goto bad_faceproc; - - memcpy(&ss, res->ai_addr, res->ai_addrlen); - socklen = res->ai_addrlen; - socktype = res->ai_socktype; - protocol = res->ai_protocol; - freeaddrinfo(res); - - inited = DONE; - } - if (inited == NOTOK) - return NOTOK; - - if ((sd = socket(ss.ss_family, socktype, protocol)) == NOTOK) - return NOTOK; - - result = sendto(sd, c1->c_text, strlen(c1->c_text), 0, - (struct sockaddr *) &ss, socklen); - - close(sd); - - return (result != NOTOK ? OK : NOTOK); -} - -/* -** COMMENTED OUT -** This version doesn't use sockets -*/ -#if 0 - -static int -doface(struct mcomp *c1) -{ - int i, len, vecp; - pid_t child_id; - int result, pdi[2], pdo[2]; - char *bp, *cp; - char buffer[BUFSIZ], *vec[10]; - - if (pipe(pdi) == NOTOK) - return NOTOK; - if (pipe(pdo) == NOTOK) { - close(pdi[0]); - close(pdi[1]); - return NOTOK; - } - - for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++) - sleep(5); - - switch (child_id) { - case NOTOK: - /* oops... fork error */ - return NOTOK; - - case OK: - /* child process */ - SIGNAL(SIGINT, SIG_IGN); - SIGNAL(SIGQUIT, SIG_IGN); - if (pdi[0] != fileno(stdin)) { - dup2(pdi[0], fileno(stdin)); - close(pdi[0]); - } - close(pdi[1]); - close(pdo[0]); - if (pdo[1] != fileno(stdout)) { - dup2(pdo[1], fileno(stdout)); - close(pdo[1]); - } - vecp = 0; - vec[vecp++] = mhbasename(faceproc); - vec[vecp++] = "-e"; - if (sleepsw != NOTOK) { - vec[vecp++] = "-s"; - snprintf(buffer, sizeof(buffer), "%d", - sleepsw); - vec[vecp++] = buffer; - } - vec[vecp] = NULL; - execvp(faceproc, vec); - fprintf(stderr, "unable to exec "); - perror(faceproc); - _exit(-1); /* NOTREACHED */ - - default: - /* parent process */ - close(pdi[0]); - i = strlen(c1->c_text); - if (write(pdi[1], c1->c_text, i) != i) - adios("pipe", "error writing to"); - free(c1->c_text), c1->c_text = NULL; - close(pdi[1]); - - close(pdo[1]); - cp = NULL, len = 0; - result = DONE; - while ((i=read(pdo[0], buffer, strlen(buffer))) > 0) { - if (cp) { - int j; - char *dp; - dp = mh_xrealloc(cp, (unsigned) (j = len + i)); - memcpy(dp + len, buffer, i); - cp = dp, len = j; - } else { - cp = mh_xmalloc((unsigned) i); - memcpy(cp, buffer, i); - len = i; - } - if (result == DONE) - for (bp = buffer + i - 1; bp >= buffer; bp--) - if (!isascii(*bp) || - iscntrl(*bp)) { - result = OK; - break; - } - } - close(pdo[0]); - -/* no waiting for child... */ - - if (result == OK) { /* binary */ - if (write(1, cp, len) != len) - adios("writing", "error"); - free(cp); - } - else /* empty */ - if ((c1->c_text = cp) == NULL) - result = OK; - break; - } - - return result; -} -#endif /* COMMENTED OUT */ - - int mhlsbr(int argc, char **argv, FILE *(*action)()) { @@ -1696,44 +1434,44 @@ mhlsbr(int argc, char **argv, FILE *(*action)()) struct mcomp *c1; switch (setjmp(mhlenv)) { - case OK: - cp = invo_name; - sleepsw = 0; /* XXX */ - bellflg = clearflg = forwflg = forwall = exitstat = 0; - digest = NULL; - ontty = NOTTY; - mhl_action = action; - - /* - ** If signal is at default action, then start ignoring - ** it, else let it set to its current action. - */ - if ((istat = SIGNAL(SIGINT, SIG_IGN)) != SIG_DFL) - SIGNAL(SIGINT, istat); - if ((qstat = SIGNAL(SIGQUIT, SIG_IGN)) != SIG_DFL) - SIGNAL(SIGQUIT, qstat); - pstat = SIGNAL(SIGPIPE, pipeser); - mhl(argc, argv); /* FALL THROUGH! */ + case OK: + cp = invo_name; + sleepsw = 0; /* XXX */ + bellflg = clearflg = forwflg = forwall = exitstat = 0; + digest = NULL; + ontty = NOTTY; + mhl_action = action; - default: + /* + ** If signal is at default action, then start ignoring + ** it, else let it set to its current action. + */ + if ((istat = SIGNAL(SIGINT, SIG_IGN)) != SIG_DFL) SIGNAL(SIGINT, istat); + if ((qstat = SIGNAL(SIGQUIT, SIG_IGN)) != SIG_DFL) SIGNAL(SIGQUIT, qstat); - SIGNAL(SIGPIPE, SIG_IGN); /* - ** should probably change to block - ** instead - */ - if (ontty == PITTY) - m_pclose(); - SIGNAL(SIGPIPE, pstat); - invo_name = cp; - if (holder.c_text) { - free(holder.c_text); - holder.c_text = NULL; - } - free_queue(&msghd, &msgtl); - for (c1 = fmthd; c1; c1 = c1->c_next) - c1->c_flags &= ~HDROUTPUT; - return exitstat; + pstat = SIGNAL(SIGPIPE, pipeser); + mhl(argc, argv); /* FALL THROUGH! */ + + default: + SIGNAL(SIGINT, istat); + SIGNAL(SIGQUIT, qstat); + SIGNAL(SIGPIPE, SIG_IGN); /* + ** should probably change to block + ** instead + */ + if (ontty == PITTY) + m_pclose(); + SIGNAL(SIGPIPE, pstat); + invo_name = cp; + if (holder.c_text) { + free(holder.c_text); + holder.c_text = NULL; + } + free_queue(&msghd, &msgtl); + for (c1 = fmthd; c1; c1 = c1->c_next) + c1->c_flags &= ~HDROUTPUT; + return exitstat; } } @@ -1777,30 +1515,30 @@ m_popen(char *name) if (pipe(pd) == NOTOK) adios("pipe", "unable to"); - switch (m_pid = vfork()) { - case NOTOK: - adios("fork", "unable to"); - - case OK: - SIGNAL(SIGINT, SIG_DFL); - SIGNAL(SIGQUIT, SIG_DFL); + switch (m_pid = fork()) { + case NOTOK: + adios("fork", "unable to"); - close(pd[1]); - if (pd[0] != fileno(stdin)) { - dup2(pd[0], fileno(stdin)); - close(pd[0]); - } - execlp(name, mhbasename(name), NULL); - fprintf(stderr, "unable to exec "); - perror(name); - _exit(-1); + case OK: + SIGNAL(SIGINT, SIG_DFL); + SIGNAL(SIGQUIT, SIG_DFL); - default: + close(pd[1]); + if (pd[0] != fileno(stdin)) { + dup2(pd[0], fileno(stdin)); close(pd[0]); - if (pd[1] != fileno(stdout)) { - dup2(pd[1], fileno(stdout)); - close(pd[1]); - } + } + execlp(name, mhbasename(name), NULL); + fprintf(stderr, "unable to exec "); + perror(name); + _exit(-1); + + default: + close(pd[0]); + if (pd[1] != fileno(stdout)) { + dup2(pd[1], fileno(stdout)); + close(pd[1]); + } } }