mhshow: Add header and separation when displaying multiple messages.
[mmh] / uip / mhshowsbr.c
index adb0da7..13a65e4 100644 (file)
@@ -22,7 +22,6 @@ extern int debugsw;
 
 int nolist   = 0;
 char *formsw = NULL;
-pid_t xpid = 0;
 
 
 /* mhparse.c */
@@ -51,7 +50,7 @@ static void show_single_message(CT, char *);
 static void DisplayMsgHeader(CT, char *);
 static int show_switch(CT, int);
 static int show_content(CT, int);
-static int show_content_aux2(CT, int, char *, char *, int, int, int, int);
+static int show_content_aux2(CT, int, char *, char *, int, int, int);
 static int show_text(CT, int);
 static int show_multi(CT, int);
 static int show_multi_internal(CT, int);
@@ -86,9 +85,16 @@ show_all_messages(CT *cts)
        for (ctp = cts; *ctp; ctp++) {
                ct = *ctp;
 
-               /* if top-level type is ok, then display message */
-               if (type_ok(ct, 1))
-                       show_single_message(ct, formsw);
+               if (!type_ok(ct, 1)) {  /* top-level type */
+                       continue;
+               }
+               if (cts[1]) {
+                       if (ctp != cts) {
+                               printf("\n\n");
+                       }
+                       printf(">>> Message %s\n\n", ct->c_file);
+               }
+               show_single_message(ct, formsw);
        }
 }
 
@@ -100,9 +106,6 @@ show_all_messages(CT *cts)
 static void
 show_single_message(CT ct, char *form)
 {
-       sigset_t set, oset;
-       int status;
-
        /*
        ** Allow user executable bit so that temporary directories created by
        ** the viewer (e.g., lynx) are going to be accessible
@@ -115,8 +118,6 @@ show_single_message(CT ct, char *form)
        */
        if (form)
                DisplayMsgHeader(ct, form);
-       else
-               xpid = 0;
 
        /* Show the body of the message */
        show_switch(ct, 0);
@@ -128,23 +129,6 @@ show_single_message(CT ct, char *form)
        if (ct->c_ceclosefnx)
                (*ct->c_ceclosefnx) (ct);
 
-       /* block a few signals */
-       sigemptyset(&set);
-       sigaddset(&set, SIGHUP);
-       sigaddset(&set, SIGINT);
-       sigaddset(&set, SIGQUIT);
-       sigaddset(&set, SIGTERM);
-       sigprocmask(SIG_BLOCK, &set, &oset);
-
-       while (wait(&status) != NOTOK) {
-               pidcheck(status);
-               continue;
-       }
-
-       /* reset the signal mask */
-       sigprocmask(SIG_SETMASK, &oset, &set);
-
-       xpid = 0;
        flush_errors();
 }
 
@@ -182,7 +166,7 @@ DisplayMsgHeader(CT ct, char *form)
                /* NOTREACHED */
 
        default:
-               xpid = -child_id;
+               pidcheck(pidwait(child_id, NOTOK));
                break;
        }
 }
@@ -273,12 +257,11 @@ show_content(CT ct, int alternate)
 /*
 ** Parse the display string for displaying generic content
 */
-
 int
 show_content_aux(CT ct, int alternate, char *cp, char *cracked)
 {
        int fd, len, buflen, quoted;
-       int xstdin, xlist, xtty;
+       int xstdin, xlist;
        char *bp, *pp, *file, buffer[BUFSIZ];
        CI ci = &ct->c_ctinfo;
 
@@ -298,7 +281,6 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked)
 
        xlist  = 0;
        xstdin = 0;
-       xtty   = 0;
 
        if (cracked) {
                strncpy(buffer, cp, sizeof(buffer));
@@ -335,6 +317,12 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked)
                                }
                                break;
 
+                       case 'c':
+                               /* insert charset */
+                               strncpy(bp, ct->c_charset ? ct->c_charset :
+                                               "US-ASCII", buflen);
+                               break;
+
                        case 'd':
                                /* insert content description */
                                if (ct->c_descr) {
@@ -346,15 +334,9 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked)
                                }
                                break;
 
-                       case 'e':
-                               /* exclusive execution */
-                               xtty = 1;
-                               break;
-
                        case 'F':
-                               /* %e, %f, and stdin is terminal not content */
+                               /* %f, and stdin is terminal not content */
                                xstdin = 1;
-                               xtty = 1;
                                /* and fall... */
 
                        case 'f':
@@ -373,7 +355,6 @@ show_content_aux(CT ct, int alternate, char *cp, char *cracked)
                                pp = bp;
                                break;
 
-                       case 'p':
                        case 'l':
                                /*
                                ** display listing prior to displaying content
@@ -446,41 +427,20 @@ raw:
                }
        }
 
-       if (buflen <= 0 || (ct->c_termproc &&
-                       (size_t)buflen <= strlen(ct->c_termproc))) {
-               /*
-               ** content_error would provide a more useful error message
-               ** here, except that if we got overrun, it probably would
-               ** too.
-               */
-               fprintf(stderr, "Buffer overflow constructing show command!\n");
-               return NOTOK;
-       }
-
-       /* use charset string to modify display method */
-       if (ct->c_termproc) {
-               char term[BUFSIZ];
-
-               strncpy(term, buffer, sizeof(term));
-               snprintf(buffer, sizeof(buffer), ct->c_termproc, term);
-       }
-
 got_command:
        return show_content_aux2(ct, alternate, cracked, buffer,
-                       fd, xlist, xstdin, xtty);
+                       fd, xlist, xstdin);
 }
 
 
 /*
 ** Routine to actually display the content
 */
-
 static int
 show_content_aux2(CT ct, int alternate, char *cracked,
-       char *buffer, int fd, int xlist, int xstdin, int xtty)
+       char *buffer, int fd, int xlist, int xstdin)
 {
        pid_t child_id;
-       char *vec[4], exec[BUFSIZ + sizeof "exec "];
 
        if (debugsw || cracked) {
                fflush(stdout);
@@ -496,13 +456,6 @@ show_content_aux2(CT ct, int alternate, char *cracked,
                        fprintf(stderr, " using command %s\n", buffer);
        }
 
-       if (xpid < 0 || (xtty && xpid)) {
-               if (xpid < 0)
-                       xpid = -xpid;
-               pidcheck(pidwait(xpid, NOTOK));
-               xpid = 0;
-       }
-
        if (xlist) {
                if (ct->c_type == CT_MULTIPART)
                        list_content(ct, -1, 1, 0, 0);
@@ -510,13 +463,6 @@ show_content_aux2(CT ct, int alternate, char *cracked,
                        list_switch(ct, -1, 1, 0, 0);
        }
 
-       snprintf(exec, sizeof(exec), "exec %s", buffer);
-
-       vec[0] = "/bin/sh";
-       vec[1] = "-c";
-       vec[2] = exec;
-       vec[3] = NULL;
-
        fflush(stdout);
 
        switch (child_id = fork()) {
@@ -531,7 +477,7 @@ show_content_aux2(CT ct, int alternate, char *cracked,
                if (!xstdin)
                        dup2(fd, 0);
                close(fd);
-               execvp("/bin/sh", vec);
+               execlp("/bin/sh", "/bin/sh", "-c", buffer, NULL);
                fprintf(stderr, "unable to exec ");
                perror("/bin/sh");
                _exit(-1);
@@ -573,7 +519,13 @@ show_text(CT ct, int alternate)
        ** if it is not a text part of a multipart/alternative
        */
        if (!alternate || ct->c_subtype == TEXT_PLAIN) {
-               snprintf(buffer, sizeof(buffer), "%%p%s '%%F'", defaultpager);
+               if (ct->c_charset && !check_charset(ct->c_charset,
+                               strlen(ct->c_charset))) {
+                       snprintf(buffer, sizeof(buffer), "%%liconv -f '%s'",
+                                       ct->c_charset);
+               } else {
+                       snprintf(buffer, sizeof(buffer), "%%lcat");
+               }
                cp = (ct->c_showproc = getcpy(buffer));
                return show_content_aux(ct, alternate, cp, NULL);
        }
@@ -706,7 +658,7 @@ static int
 show_multi_aux(CT ct, int alternate, char *cp)
 {
        int len, buflen, quoted;
-       int xlist, xtty;
+       int xlist;
        char *bp, *pp, *file, buffer[BUFSIZ];
        struct multipart *m = (struct multipart *) ct->c_ctparams;
        struct part *part;
@@ -737,7 +689,6 @@ show_multi_aux(CT ct, int alternate, char *cp)
        }
 
        xlist = 0;
-       xtty = 0;
 
        /* get buffer ready to go */
        bp = buffer;
@@ -768,6 +719,12 @@ show_multi_aux(CT ct, int alternate, char *cp)
                                }
                                break;
 
+                       case 'c':
+                               /* insert charset */
+                               strncpy(bp, ct->c_charset ? ct->c_charset :
+                                               "US-ASCII", buflen);
+                               break;
+
                        case 'd':
                                /* insert content description */
                                if (ct->c_descr) {
@@ -779,16 +736,7 @@ show_multi_aux(CT ct, int alternate, char *cp)
                                }
                                break;
 
-                       case 'e':
-                               /* exclusive execution */
-                               xtty = 1;
-                               break;
-
                        case 'F':
-                               /* %e and %f */
-                               xtty = 1;
-                               /* and fall... */
-
                        case 'f':
                                /* insert filename(s) containing content */
                        {
@@ -814,7 +762,6 @@ show_multi_aux(CT ct, int alternate, char *cp)
                        }
                        break;
 
-                       case 'p':
                        case 'l':
                                /*
                                ** display listing prior to displaying content
@@ -887,27 +834,8 @@ raw:
                }
        }
 
-       if (buflen <= 0 || (ct->c_termproc &&
-                       (size_t)buflen <= strlen(ct->c_termproc))) {
-               /*
-               ** content_error would provide a more useful error message
-               ** here, except that if we got overrun, it probably would
-               ** too.
-               */
-               fprintf(stderr, "Buffer overflow constructing show command!\n");
-               return NOTOK;
-       }
-
-       /* use charset string to modify display method */
-       if (ct->c_termproc) {
-               char term[BUFSIZ];
-
-               strncpy(term, buffer, sizeof(term));
-               snprintf(buffer, sizeof(buffer), ct->c_termproc, term);
-       }
-
        return show_content_aux2(ct, alternate, NULL, buffer,
-                       NOTOK, xlist, 0, xtty);
+                       NOTOK, xlist, 0);
 }
 
 
@@ -937,7 +865,7 @@ show_message_rfc822(CT ct, int alternate)
 
        /* default method for message/rfc822 */
        if (ct->c_subtype == MESSAGE_RFC822) {
-               cp = (ct->c_showproc = getcpy("%pshow -file '%F'"));
+               cp = (ct->c_showproc = getcpy("%lshow -file %F"));
                return show_content_aux(ct, alternate, cp, NULL);
        }