* uip/mhlistsbr.c, uip/mhlsbr.c, uip/picksbr.c: cast
[mmh] / uip / mhshowsbr.c
index 9745504..9317def 100644 (file)
@@ -3,6 +3,10 @@
  * mhshowsbr.c -- routines to display the contents of MIME messages
  *
  * $Id$
+ *
+ * This code is Copyright (c) 2002, by the authors of nmh.  See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
  */
 
 #include <h/mh.h>
 #include <errno.h>
 #include <setjmp.h>
 #include <signal.h>
-#include <zotnet/mts/mts.h>
-#include <zotnet/tws/tws.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>
@@ -31,7 +36,6 @@
 # define siglongjmp(env,val) longjmp(env,val)
 #endif
 
-extern int errno;
 extern int debugsw;
 
 int pausesw  = 1;
@@ -115,7 +119,7 @@ show_all_messages (CT *cts)
        ct = *ctp;
 
        /* if top-level type is ok, then display message */
-       if (type_ok (ct, 0))
+       if (type_ok (ct, 1))
            show_single_message (ct, formsw);
     }
 }
@@ -130,13 +134,15 @@ show_single_message (CT ct, char *form)
 {
     sigset_t set, oset;
 
-#ifdef WAITINT
-    int status;
-#else
+#ifdef HAVE_UNION_WAIT
     union wait status;
+#else
+    int status;
 #endif
 
-    umask (ct->c_umask);
+    /* Allow user executable bit so that temporary directories created by
+     * the viewer (e.g., lynx) are going to be accessible */
+    umask (ct->c_umask & ~(0100));
 
     /*
      * If you have a format file, then display
@@ -166,10 +172,10 @@ show_single_message (CT ct, char *form)
     SIGPROCMASK (SIG_BLOCK, &set, &oset);
 
     while (wait (&status) != NOTOK) {
-#ifdef WAITINT
-       pidcheck (status);
-#else
+#ifdef HAVE_UNION_WAIT
        pidcheck (status.w_status);
+#else
+       pidcheck (status);
 #endif
        continue;
     }
@@ -405,7 +411,16 @@ show_content_aux (CT ct, int serial, int alternate, char *cp, char *cracked)
 
            case 'f':
                /* insert filename containing content */
-               snprintf (bp, buflen, "%s", file);
+               snprintf (bp, buflen, "'%s'", file);
+               /* since we've quoted the file argument, set things up
+                * to look past it, to avoid problems with the quoting
+                * logic below.  (I know, I should figure out what's
+                * broken with the quoting logic, but..)
+                */
+               len = strlen(bp);
+               buflen -= len;
+               bp += len;
+               pp = bp;
                break;
 
            case 'p':
@@ -770,10 +785,10 @@ show_multi_internal (CT ct, int serial, int alternate)
     if (serial && !nowserial) {
        pid_t pid;
        int kids;
-#ifdef WAITINT
-       int status;
-#else
+#ifdef HAVE_UNION_WAIT
        union wait status;
+#else
+       int status;
 #endif
 
        kids = 0;
@@ -789,10 +804,10 @@ show_multi_internal (CT ct, int serial, int alternate)
        }
 
        while (kids > 0 && (pid = wait (&status)) != NOTOK) {
-#ifdef WAITINT
-           pidcheck (status);
-#else
+#ifdef HAVE_UNION_WAIT
            pidcheck (status.w_status);
+#else
+           pidcheck (status);
 #endif
 
            for (part = m->mp_parts; part; part = part->mp_next) {
@@ -869,8 +884,9 @@ show_multi_aux (CT ct, int serial, int alternate, char *cp)
     quoted = 0;
 
     /* Now parse display string */
-    for ( ; *cp; cp++) {
+    for ( ; *cp && buflen > 0; cp++) {
        if (*cp == '%') {
+           pp = bp;
            switch (*++cp) {
            case 'a':
                /* insert parameters from Content-Type field */
@@ -923,6 +939,10 @@ show_multi_aux (CT ct, int serial, int alternate, char *cp)
                    buflen -= len;
                    s = " ";
                }
+               /* set our starting pointer back to bp, to avoid
+                * requoting the filenames we just added
+                */
+               pp = bp;
            }
            break;