Removed RFC 1864 (Content-MD5) support. I.e. -check switches.
[mmh] / uip / mhshowsbr.c
index b7452d8..2b69c19 100644 (file)
@@ -9,47 +9,22 @@
 #include <h/mh.h>
 #include <fcntl.h>
 #include <h/signals.h>
-#include <h/md5.h>
 #include <errno.h>
 #include <setjmp.h>
 #include <signal.h>
-#include <h/mts.h>
 #include <h/tws.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
 #include <h/utils.h>
-
-#ifdef HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif
-
-/*
-** Just use sigjmp/longjmp on older machines that
-** don't have sigsetjmp/siglongjmp.
-*/
-#ifndef HAVE_SIGSETJMP
-# define sigjmp_buf jmp_buf
-# define sigsetjmp(env,mask) setjmp(env)
-# define siglongjmp(env,val) longjmp(env,val)
-#endif
+#include <sys/wait.h>
 
 extern int debugsw;
 
-int serialsw = 0;
 int nolist   = 0;
-
-char *progsw = NULL;
-
-/* flags for moreproc/header display */
-int nomore   = 0;
 char *formsw = NULL;
-
 pid_t xpid = 0;
 
 
-/* termsbr.c */
-int SOprintf(char *, ...);
-
 /* mhparse.c */
 int pidcheck(int);
 
@@ -67,23 +42,23 @@ int list_content(CT, int, int, int, int);
 ** prototypes
 */
 void show_all_messages(CT *);
-int show_content_aux(CT, int, int, char *, char *);
+int show_content_aux(CT, int, char *, char *);
 
 /*
 ** static prototypes
 */
 static void show_single_message(CT, char *);
 static void DisplayMsgHeader(CT, char *);
-static int show_switch(CT, int, int);
-static int show_content(CT, int, int);
-static int show_content_aux2(CT, int, int, char *, char *, int, int, int, int);
-static int show_text(CT, int, int);
-static int show_multi(CT, int, int);
-static int show_multi_internal(CT, int, int);
-static int show_multi_aux(CT, int, int, char *);
-static int show_message_rfc822(CT, int, int);
-static int show_partial(CT, int, int);
-static int show_external(CT, int, int);
+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_text(CT, int);
+static int show_multi(CT, int);
+static int show_multi_internal(CT, int);
+static int show_multi_aux(CT, int, char *);
+static int show_message_rfc822(CT, int);
+static int show_partial(CT, int);
+static int show_external(CT, int);
 
 
 /*
@@ -126,12 +101,7 @@ static void
 show_single_message(CT ct, char *form)
 {
        sigset_t set, oset;
-
-#ifdef HAVE_UNION_WAIT
-       union wait status;
-#else
        int status;
-#endif
 
        /*
        ** Allow user executable bit so that temporary directories created by
@@ -149,7 +119,7 @@ show_single_message(CT ct, char *form)
                xpid = 0;
 
        /* Show the body of the message */
-       show_switch(ct, 1, 0);
+       show_switch(ct, 0);
 
        if (ct->c_fp) {
                fclose(ct->c_fp);
@@ -164,19 +134,15 @@ show_single_message(CT ct, char *form)
        sigaddset(&set, SIGINT);
        sigaddset(&set, SIGQUIT);
        sigaddset(&set, SIGTERM);
-       SIGPROCMASK(SIG_BLOCK, &set, &oset);
+       sigprocmask(SIG_BLOCK, &set, &oset);
 
        while (wait(&status) != NOTOK) {
-#ifdef HAVE_UNION_WAIT
-               pidcheck(status.w_status);
-#else
                pidcheck(status);
-#endif
                continue;
        }
 
        /* reset the signal mask */
-       SIGPROCMASK(SIG_SETMASK, &oset, &set);
+       sigprocmask(SIG_SETMASK, &oset, &set);
 
        xpid = 0;
        flush_errors();
@@ -184,49 +150,34 @@ show_single_message(CT ct, char *form)
 
 
 /*
-** Use the mhlproc to show the header fields
+** Use mhl to show the header fields
 */
-
 static void
 DisplayMsgHeader(CT ct, char *form)
 {
        pid_t child_id;
-       int i, vecp;
+       int vecp;
        char *vec[8];
 
        vecp = 0;
-       vec[vecp++] = mhbasename(mhlproc);
+       vec[vecp++] = "mhl";
        vec[vecp++] = "-form";
        vec[vecp++] = form;
        vec[vecp++] = "-nobody";
        vec[vecp++] = ct->c_file;
-
-       /*
-       ** If we've specified -(no)moreproc,
-       ** then just pass that along.
-       */
-       if (nomore) {
-               vec[vecp++] = "-nomoreproc";
-       } else if (progsw) {
-               vec[vecp++] = "-moreproc";
-               vec[vecp++] = progsw;
-       }
        vec[vecp] = NULL;
 
        fflush(stdout);
 
-       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-               sleep(5);
-
-       switch (child_id) {
+       switch (child_id = fork()) {
        case NOTOK:
                adios("fork", "unable to");
                /* NOTREACHED */
 
        case OK:
-               execvp(mhlproc, vec);
+               execvp("mhl", vec);
                fprintf(stderr, "unable to exec ");
-               perror(mhlproc);
+               perror("mhl");
                _exit(-1);
                /* NOTREACHED */
 
@@ -243,40 +194,39 @@ DisplayMsgHeader(CT ct, char *form)
 */
 
 static int
-show_switch(CT ct, int serial, int alternate)
+show_switch(CT ct, int alternate)
 {
        switch (ct->c_type) {
        case CT_MULTIPART:
-               return show_multi(ct, serial, alternate);
+               return show_multi(ct, alternate);
                break;
 
        case CT_MESSAGE:
                switch (ct->c_subtype) {
                        case MESSAGE_PARTIAL:
-                               return show_partial(ct, serial, alternate);
+                               return show_partial(ct, alternate);
                                break;
 
                        case MESSAGE_EXTERNAL:
-                               return show_external(ct, serial, alternate);
+                               return show_external(ct, alternate);
                                break;
 
                        case MESSAGE_RFC822:
                        default:
-                               return show_message_rfc822(ct, serial,
-                                               alternate);
+                               return show_message_rfc822(ct, alternate);
                                break;
                }
                break;
 
        case CT_TEXT:
-               return show_text(ct, serial, alternate);
+               return show_text(ct, alternate);
                break;
 
        case CT_AUDIO:
        case CT_IMAGE:
        case CT_VIDEO:
        case CT_APPLICATION:
-               return show_content(ct, serial, alternate);
+               return show_content(ct, alternate);
                break;
 
        default:
@@ -293,7 +243,7 @@ show_switch(CT ct, int serial, int alternate)
 */
 
 static int
-show_content(CT ct, int serial, int alternate)
+show_content(CT ct, int alternate)
 {
        char *cp, buffer[BUFSIZ];
        CI ci = &ct->c_ctinfo;
@@ -302,15 +252,15 @@ show_content(CT ct, int serial, int alternate)
        snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
                                invo_name, ci->ci_type, ci->ci_subtype);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        /* Check for mhshow-show-type */
        snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        if ((cp = ct->c_showproc))
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        /* complain if we are not a part of a multipart/alternative */
        if (!alternate)
@@ -325,7 +275,7 @@ show_content(CT ct, int serial, int alternate)
 */
 
 int
-show_content_aux(CT ct, int serial, int alternate, char *cp, char *cracked)
+show_content_aux(CT ct, int alternate, char *cp, char *cracked)
 {
        int fd, len, buflen, quoted;
        int xstdin, xlist, xtty;
@@ -496,7 +446,8 @@ raw:
                }
        }
 
-       if (buflen <= 0 || (ct->c_termproc && buflen <= strlen(ct->c_termproc))) {
+       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
@@ -515,7 +466,7 @@ raw:
        }
 
 got_command:
-       return show_content_aux2(ct, serial, alternate, cracked, buffer,
+       return show_content_aux2(ct, alternate, cracked, buffer,
                        fd, xlist, xstdin, xtty);
 }
 
@@ -525,11 +476,10 @@ got_command:
 */
 
 static int
-show_content_aux2(CT ct, int serial, int alternate, char *cracked,
+show_content_aux2(CT ct, int alternate, char *cracked,
        char *buffer, int fd, int xlist, int xstdin, int xtty)
 {
        pid_t child_id;
-       int i;
        char *vec[4], exec[BUFSIZ + sizeof "exec "];
 
        if (debugsw || cracked) {
@@ -569,9 +519,7 @@ show_content_aux2(CT ct, int serial, int alternate, char *cracked,
 
        fflush(stdout);
 
-       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-               sleep(5);
-       switch (child_id) {
+       switch (child_id = fork()) {
        case NOTOK:
                advise("fork", "unable to");
                (*ct->c_ceclosefnx) (ct);
@@ -590,13 +538,7 @@ show_content_aux2(CT ct, int serial, int alternate, char *cracked,
                /* NOTREACHED */
 
        default:
-               if (!serial) {
-                       ct->c_pid = child_id;
-                       if (xtty)
-                               xpid = child_id;
-               } else {
-                       pidcheck(pidXwait(child_id, NULL));
-               }
+               pidcheck(pidXwait(child_id, NULL));
 
                if (fd != NOTOK)
                        (*ct->c_ceclosefnx) (ct);
@@ -610,7 +552,7 @@ show_content_aux2(CT ct, int serial, int alternate, char *cracked,
 */
 
 static int
-show_text(CT ct, int serial, int alternate)
+show_text(CT ct, int alternate)
 {
        char *cp, buffer[BUFSIZ];
        CI ci = &ct->c_ctinfo;
@@ -619,23 +561,21 @@ show_text(CT ct, int serial, int alternate)
        snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
                        invo_name, ci->ci_type, ci->ci_subtype);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        /* Check for mhshow-show-type */
        snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        /*
        ** Use default method if content is text/plain, or if
        ** 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'",
-                               progsw ? progsw : moreproc && *moreproc ?
-                               moreproc : "more");
+               snprintf(buffer, sizeof(buffer), "%%p%s '%%F'", defaultpager);
                cp = (ct->c_showproc = getcpy(buffer));
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
        }
 
        return NOTOK;
@@ -647,7 +587,7 @@ show_text(CT ct, int serial, int alternate)
 */
 
 static int
-show_multi(CT ct, int serial, int alternate)
+show_multi(CT ct, int alternate)
 {
        char *cp, buffer[BUFSIZ];
        CI ci = &ct->c_ctinfo;
@@ -656,15 +596,15 @@ show_multi(CT ct, int serial, int alternate)
        snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
                        invo_name, ci->ci_type, ci->ci_subtype);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_multi_aux(ct, serial, alternate, cp);
+               return show_multi_aux(ct, alternate, cp);
 
        /* Check for mhshow-show-type */
        snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_multi_aux(ct, serial, alternate, cp);
+               return show_multi_aux(ct, alternate, cp);
 
        if ((cp = ct->c_showproc))
-               return show_multi_aux(ct, serial, alternate, cp);
+               return show_multi_aux(ct, alternate, cp);
 
        /*
        ** Use default method to display this multipart content
@@ -672,7 +612,7 @@ show_multi(CT ct, int serial, int alternate)
        ** or if it is one of the known subtypes of multipart.
        */
        if (!alternate || ct->c_subtype != MULTI_UNKNOWN)
-               return show_multi_internal(ct, serial, alternate);
+               return show_multi_internal(ct, alternate);
 
        return NOTOK;
 }
@@ -684,56 +624,43 @@ show_multi(CT ct, int serial, int alternate)
 */
 
 static int
-show_multi_internal(CT ct, int serial, int alternate)
+show_multi_internal(CT ct, int alternate)
 {
-       int alternating, nowalternate, nowserial, result;
+       int alternating, nowalternate, result;
        struct multipart *m = (struct multipart *) ct->c_ctparams;
        struct part *part;
        CT p;
-       sigset_t set, oset;
 
        alternating = 0;
        nowalternate = alternate;
 
-       if (ct->c_subtype == MULTI_PARALLEL) {
-               nowserial = serialsw;
-       } else if (ct->c_subtype == MULTI_ALTERNATE) {
+       if (ct->c_subtype == MULTI_ALTERNATE) {
                nowalternate = 1;
                alternating  = 1;
-               nowserial = serial;
-       } else {
-               /*
-               ** multipart/mixed
-               ** mutlipart/digest
-               ** unknown subtypes of multipart (treat as mixed per rfc2046)
-               */
-               nowserial = serial;
        }
 
-       /* block a few signals */
-       if (!nowserial) {
-               sigemptyset(&set);
-               sigaddset(&set, SIGHUP);
-               sigaddset(&set, SIGINT);
-               sigaddset(&set, SIGQUIT);
-               sigaddset(&set, SIGTERM);
-               SIGPROCMASK(SIG_BLOCK, &set, &oset);
-       }
+       /*
+       ** Other possible multipart types are:
+       ** - multipart/parallel
+       ** - multipart/mixed
+       ** - multipart/digest
+       ** - unknown subtypes of multipart (treat as mixed per rfc2046)
+       */
 
-/*
-** alternate   -> we are a part inside an multipart/alternative
-** alternating -> we are a multipart/alternative
-*/
+       /*
+       ** alternate   -> we are a part inside an multipart/alternative
+       ** alternating -> we are a multipart/alternative
+       */
 
        result = alternate ? NOTOK : OK;
 
        for (part = m->mp_parts; part; part = part->mp_next) {
                p = part->mp_part;
 
-               if (part_ok(p, 0) && type_ok(p, 0)) {
+               if (part_ok(p, 1) && type_ok(p, 1)) {
                        int inneresult;
 
-                       inneresult = show_switch(p, nowserial, nowalternate);
+                       inneresult = show_switch(p, nowalternate);
                        switch (inneresult) {
                        case NOTOK:
                                if (alternate && !alternating) {
@@ -765,55 +692,7 @@ show_multi_internal(CT ct, int serial, int alternate)
                result = NOTOK;
                goto out;
        }
-
-       if (serial && !nowserial) {
-               pid_t pid;
-               int kids;
-#ifdef HAVE_UNION_WAIT
-               union wait status;
-#else
-               int status;
-#endif
-
-               kids = 0;
-               for (part = m->mp_parts; part; part = part->mp_next) {
-                       p = part->mp_part;
-
-                       if (p->c_pid > OK) {
-                               if (kill(p->c_pid, 0) == NOTOK)
-                                       p->c_pid = 0;
-                               else
-                                       kids++;
-                       }
-               }
-
-               while (kids > 0 && (pid = wait(&status)) != NOTOK) {
-#ifdef HAVE_UNION_WAIT
-                       pidcheck(status.w_status);
-#else
-                       pidcheck(status);
-#endif
-
-                       for (part = m->mp_parts; part; part = part->mp_next) {
-                               p = part->mp_part;
-
-                               if (xpid == pid)
-                                       xpid = 0;
-                               if (p->c_pid == pid) {
-                                       p->c_pid = 0;
-                                       kids--;
-                                       break;
-                               }
-                       }
-               }
-       }
-
 out:
-       if (!nowserial) {
-               /* reset the signal mask */
-               SIGPROCMASK(SIG_SETMASK, &oset, &set);
-       }
-
        return result;
 }
 
@@ -824,7 +703,7 @@ out:
 */
 
 static int
-show_multi_aux(CT ct, int serial, int alternate, char *cp)
+show_multi_aux(CT ct, int alternate, char *cp)
 {
        int len, buflen, quoted;
        int xlist, xtty;
@@ -1008,8 +887,8 @@ raw:
                }
        }
 
-       if (buflen <= 0 ||
-                       (ct->c_termproc && buflen <= strlen(ct->c_termproc))) {
+       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
@@ -1027,7 +906,7 @@ raw:
                snprintf(buffer, sizeof(buffer), ct->c_termproc, term);
        }
 
-       return show_content_aux2(ct, serial, alternate, NULL, buffer,
+       return show_content_aux2(ct, alternate, NULL, buffer,
                        NOTOK, xlist, 0, xtty);
 }
 
@@ -1037,7 +916,7 @@ raw:
 */
 
 static int
-show_message_rfc822(CT ct, int serial, int alternate)
+show_message_rfc822(CT ct, int alternate)
 {
        char *cp, buffer[BUFSIZ];
        CI ci = &ct->c_ctinfo;
@@ -1046,20 +925,20 @@ show_message_rfc822(CT ct, int serial, int alternate)
        snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
                                invo_name, ci->ci_type, ci->ci_subtype);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        /* Check for mhshow-show-type */
        snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
        if ((cp = context_find(buffer)) && *cp != '\0')
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        if ((cp = ct->c_showproc))
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
 
        /* default method for message/rfc822 */
        if (ct->c_subtype == MESSAGE_RFC822) {
                cp = (ct->c_showproc = getcpy("%pshow -file '%F'"));
-               return show_content_aux(ct, serial, alternate, cp, NULL);
+               return show_content_aux(ct, alternate, cp, NULL);
        }
 
        /* complain if we are not a part of a multipart/alternative */
@@ -1075,7 +954,7 @@ show_message_rfc822(CT ct, int serial, int alternate)
 */
 
 static int
-show_partial(CT ct, int serial, int alternate)
+show_partial(CT ct, int alternate)
 {
        content_error(NULL, ct,
                "in order to display this message, you must reassemble it");
@@ -1090,7 +969,7 @@ show_partial(CT ct, int serial, int alternate)
 */
 
 static int
-show_external(CT ct, int serial, int alternate)
+show_external(CT ct, int alternate)
 {
        struct exbody *e = (struct exbody *) ct->c_ctparams;
        CT p = e->eb_content;
@@ -1098,7 +977,7 @@ show_external(CT ct, int serial, int alternate)
        if (!type_ok(p, 0))
                return OK;
 
-       return show_switch(p, serial, alternate);
+       return show_switch(p, alternate);
 
 #if 0
        content_error(NULL, p, "don't know how to display content");