-
/*
* 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>
# define siglongjmp(env,val) longjmp(env,val)
#endif
-extern int errno;
extern int debugsw;
int pausesw = 1;
void
show_all_messages (CT *cts)
{
- CT ct, *ctp;
-
- /*
- * If form is not specified, then get default form
- * for showing headers of MIME messages.
- */
- if (!formsw)
- formsw = getcpy (etcpath ("mhl.headers"));
-
- /*
- * If form is "mhl.null", suppress display of header.
- */
- if (!strcmp (formsw, "mhl.null"))
- formsw = NULL;
-
- for (ctp = cts; *ctp; ctp++) {
- ct = *ctp;
-
- /* if top-level type is ok, then display message */
- if (type_ok (ct, 0))
- show_single_message (ct, formsw);
- }
+ CT ct, *ctp;
+
+ /*
+ * If form is not specified, then get default form
+ * for showing headers of MIME messages.
+ */
+ if (!formsw)
+ formsw = getcpy (etcpath ("mhl.headers"));
+
+ /*
+ * If form is "mhl.null", suppress display of header.
+ */
+ if (!strcmp (formsw, "mhl.null"))
+ formsw = NULL;
+
+ 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);
+ }
}
static void
show_single_message (CT ct, char *form)
{
- sigset_t set, oset;
+ sigset_t set, oset;
-#ifdef WAITINT
- int status;
+#ifdef HAVE_UNION_WAIT
+ union wait status;
#else
- union wait status;
+ 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
- * the message headers.
- */
- if (form)
- DisplayMsgHeader(ct, form);
- else
- xpid = 0;
+ /*
+ * If you have a format file, then display
+ * the message headers.
+ */
+ if (form)
+ DisplayMsgHeader(ct, form);
+ else
+ xpid = 0;
+
+ /* Show the body of the message */
+ show_switch (ct, 1, 0);
+
+ if (ct->c_fp) {
+ fclose (ct->c_fp);
+ ct->c_fp = NULL;
+ }
+ 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);
- /* Show the body of the message */
- show_switch (ct, 1, 0);
-
- if (ct->c_fp) {
- fclose (ct->c_fp);
- ct->c_fp = NULL;
- }
- 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) {
-#ifdef WAITINT
- pidcheck (status);
+ while (wait (&status) != NOTOK) {
+#ifdef HAVE_UNION_WAIT
+ pidcheck (status.w_status);
#else
- pidcheck (status.w_status);
+ pidcheck (status);
#endif
- continue;
- }
+ continue;
+ }
- /* reset the signal mask */
- SIGPROCMASK (SIG_SETMASK, &oset, &set);
+ /* reset the signal mask */
+ SIGPROCMASK (SIG_SETMASK, &oset, &set);
- xpid = 0;
- flush_errors ();
+ xpid = 0;
+ flush_errors ();
}
static void
DisplayMsgHeader (CT ct, char *form)
{
- pid_t child_id;
- int i, vecp;
- char *vec[8];
-
- vecp = 0;
- vec[vecp++] = r1bindex (mhlproc, '/');
- 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 = vfork()) == NOTOK && i < 5; i++)
- sleep (5);
-
- switch (child_id) {
- case NOTOK:
- adios ("fork", "unable to");
- /* NOTREACHED */
-
- case OK:
- execvp (mhlproc, vec);
- fprintf (stderr, "unable to exec ");
- perror (mhlproc);
- _exit (-1);
- /* NOTREACHED */
-
- default:
- xpid = -child_id;
- break;
- }
+ pid_t child_id;
+ int i, vecp;
+ char *vec[8];
+
+ vecp = 0;
+ vec[vecp++] = r1bindex (mhlproc, '/');
+ 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 = vfork()) == NOTOK && i < 5; i++)
+ sleep (5);
+
+ switch (child_id) {
+ case NOTOK:
+ adios ("fork", "unable to");
+ /* NOTREACHED */
+
+ case OK:
+ execvp (mhlproc, vec);
+ fprintf (stderr, "unable to exec ");
+ perror (mhlproc);
+ _exit (-1);
+ /* NOTREACHED */
+
+ default:
+ xpid = -child_id;
+ break;
+ }
}
static int
show_switch (CT ct, int serial, int alternate)
{
- switch (ct->c_type) {
- case CT_MULTIPART:
- return show_multi (ct, serial, alternate);
- break;
-
- case CT_MESSAGE:
- switch (ct->c_subtype) {
- case MESSAGE_PARTIAL:
- return show_partial (ct, serial, alternate);
- break;
-
- case MESSAGE_EXTERNAL:
- return show_external (ct, serial, alternate);
- break;
-
- case MESSAGE_RFC822:
- default:
- return show_message_rfc822 (ct, serial, alternate);
- break;
- }
- break;
-
- case CT_TEXT:
- return show_text (ct, serial, alternate);
- break;
-
- case CT_AUDIO:
- case CT_IMAGE:
- case CT_VIDEO:
- case CT_APPLICATION:
- return show_content (ct, serial, alternate);
- break;
+ switch (ct->c_type) {
+ case CT_MULTIPART:
+ return show_multi (ct, serial, alternate);
+ break;
- default:
- adios (NULL, "unknown content type %d", ct->c_type);
- break;
- }
+ case CT_MESSAGE:
+ switch (ct->c_subtype) {
+ case MESSAGE_PARTIAL:
+ return show_partial (ct, serial, alternate);
+ break;
+
+ case MESSAGE_EXTERNAL:
+ return show_external (ct, serial, alternate);
+ break;
+
+ case MESSAGE_RFC822:
+ default:
+ return show_message_rfc822 (ct, serial, alternate);
+ break;
+ }
+ break;
- return 0; /* NOT REACHED */
+ case CT_TEXT:
+ return show_text (ct, serial, alternate);
+ break;
+
+ case CT_AUDIO:
+ case CT_IMAGE:
+ case CT_VIDEO:
+ case CT_APPLICATION:
+ return show_content (ct, serial, alternate);
+ break;
+
+ default:
+ adios (NULL, "unknown content type %d", ct->c_type);
+ break;
+ }
+
+ return 0; /* NOT REACHED */
}
static int
show_content (CT ct, int serial, int alternate)
{
- char *cp, buffer[BUFSIZ];
- CI ci = &ct->c_ctinfo;
+ char *cp, buffer[BUFSIZ];
+ CI ci = &ct->c_ctinfo;
- /* Check for mhn-show-type/subtype */
- 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);
+ /* Check for mhshow-show-type/subtype */
+ 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);
- /* Check for mhn-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);
+ /* 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);
- if ((cp = ct->c_showproc))
- return show_content_aux (ct, serial, alternate, cp, NULL);
+ if ((cp = ct->c_showproc))
+ return show_content_aux (ct, serial, alternate, cp, NULL);
- /* complain if we are not a part of a multipart/alternative */
- if (!alternate)
- content_error (NULL, ct, "don't know how to display content");
+ /* complain if we are not a part of a multipart/alternative */
+ if (!alternate)
+ content_error (NULL, ct, "don't know how to display content");
- return NOTOK;
+ return NOTOK;
}
int
show_content_aux (CT ct, int serial, int alternate, char *cp, char *cracked)
{
- int fd, len, buflen, quoted;
- int xstdin, xlist, xpause, xtty;
- char *bp, *pp, *file, buffer[BUFSIZ];
- CI ci = &ct->c_ctinfo;
-
- if (!ct->c_ceopenfnx) {
- if (!alternate)
- content_error (NULL, ct, "don't know how to decode content");
-
- return NOTOK;
- }
-
- file = NULL;
- if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK)
- return NOTOK;
- if (ct->c_showproc && !strcmp (ct->c_showproc, "true"))
- return (alternate ? DONE : OK);
-
- xlist = 0;
- xpause = 0;
- xstdin = 0;
- xtty = 0;
-
- if (cracked) {
- strncpy (buffer, cp, sizeof(buffer));
- goto got_command;
- }
-
- /* get buffer ready to go */
- bp = buffer;
- buflen = sizeof(buffer) - 1;
- bp[0] = bp[buflen] = '\0';
- quoted = 0;
-
- /* Now parse display string */
- for ( ; *cp && buflen > 0; cp++) {
- if (*cp == '%') {
- pp = bp;
-
- switch (*++cp) {
- case 'a':
- /* insert parameters from Content-Type field */
- {
- char **ap, **ep;
- char *s = "";
-
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- snprintf (bp, buflen, "%s%s=\"%s\"", s, *ap, *ep);
- len = strlen (bp);
- bp += len;
- buflen -= len;
- s = " ";
- }
- }
- break;
+ int fd, len, buflen, quoted;
+ int xstdin, xlist, xpause, xtty;
+ char *bp, *pp, *file, buffer[BUFSIZ];
+ CI ci = &ct->c_ctinfo;
- case 'd':
- /* insert content description */
- if (ct->c_descr) {
- char *s;
-
- s = trimcpy (ct->c_descr);
- strncpy (bp, s, buflen);
- free (s);
- }
- break;
+ if (!ct->c_ceopenfnx) {
+ if (!alternate)
+ content_error (NULL, ct, "don't know how to decode content");
- case 'e':
- /* exclusive execution */
- xtty = 1;
- break;
-
- case 'F':
- /* %e, %f, and stdin is terminal not content */
- xstdin = 1;
- xtty = 1;
- /* and fall... */
-
- case 'f':
- /* insert filename containing content */
- snprintf (bp, buflen, "%s", file);
- break;
+ return NOTOK;
+ }
- case 'p':
- /* %l, and pause prior to displaying content */
- xpause = pausesw;
- /* and fall... */
+ file = NULL;
+ if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK)
+ return NOTOK;
+ if (ct->c_showproc && !strcmp (ct->c_showproc, "true"))
+ return (alternate ? DONE : OK);
- case 'l':
- /* display listing prior to displaying content */
- xlist = !nolist;
- break;
+ xlist = 0;
+ xpause = 0;
+ xstdin = 0;
+ xtty = 0;
- case 's':
- /* insert subtype of content */
- strncpy (bp, ci->ci_subtype, buflen);
- break;
+ if (cracked) {
+ strncpy (buffer, cp, sizeof(buffer));
+ goto got_command;
+ }
- case '%':
- /* insert character % */
- goto raw;
+ /* get buffer ready to go */
+ bp = buffer;
+ buflen = sizeof(buffer) - 1;
+ bp[0] = bp[buflen] = '\0';
+ quoted = 0;
+
+ /* Now parse display string */
+ for ( ; *cp && buflen > 0; cp++) {
+ if (*cp == '%') {
+ pp = bp;
+
+ switch (*++cp) {
+ case 'a':
+ /* insert parameters from Content-Type field */
+ {
+ char **ap, **ep;
+ char *s = "";
+
+ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
+ snprintf (bp, buflen, "%s%s=\"%s\"", s, *ap, *ep);
+ len = strlen (bp);
+ bp += len;
+ buflen -= len;
+ s = " ";
+ }
+ }
+ break;
- default:
- *bp++ = *--cp;
- *bp = '\0';
- buflen--;
- continue;
- }
- len = strlen (bp);
- bp += len;
- buflen -= len;
-
- /* Did we actually insert something? */
- if (bp != pp) {
- /* Insert single quote if not inside quotes already */
- if (!quoted && buflen) {
- len = strlen (pp);
- memmove (pp + 1, pp, len);
- *pp++ = '\'';
- buflen--;
- bp++;
- }
- /* Escape existing quotes */
- while ((pp = strchr (pp, '\'')) && buflen > 3) {
- len = strlen (pp++);
- memmove (pp + 3, pp, len);
- *pp++ = '\\';
- *pp++ = '\'';
- *pp++ = '\'';
- buflen -= 3;
- bp += 3;
- }
- /* If pp is still set, that means we ran out of space. */
- if (pp)
- buflen = 0;
- if (!quoted && buflen) {
- *bp++ = '\'';
- *bp = '\0';
- buflen--;
- }
- }
- } else {
+ case 'd':
+ /* insert content description */
+ if (ct->c_descr) {
+ char *s;
+
+ s = trimcpy (ct->c_descr);
+ strncpy (bp, s, buflen);
+ free (s);
+ }
+ break;
+
+ case 'e':
+ /* exclusive execution */
+ xtty = 1;
+ break;
+
+ case 'F':
+ /* %e, %f, and stdin is terminal not content */
+ xstdin = 1;
+ xtty = 1;
+ /* and fall... */
+
+ case 'f':
+ /* insert filename containing content */
+ 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':
+ /* %l, and pause prior to displaying content */
+ xpause = pausesw;
+ /* and fall... */
+
+ case 'l':
+ /* display listing prior to displaying content */
+ xlist = !nolist;
+ break;
+
+ case 's':
+ /* insert subtype of content */
+ strncpy (bp, ci->ci_subtype, buflen);
+ break;
+
+ case '%':
+ /* insert character % */
+ goto raw;
+
+ default:
+ *bp++ = *--cp;
+ *bp = '\0';
+ buflen--;
+ continue;
+ }
+ len = strlen (bp);
+ bp += len;
+ buflen -= len;
+
+ /* Did we actually insert something? */
+ if (bp != pp) {
+ /* Insert single quote if not inside quotes already */
+ if (!quoted && buflen) {
+ len = strlen (pp);
+ memmove (pp + 1, pp, len);
+ *pp++ = '\'';
+ buflen--;
+ bp++;
+ }
+ /* Escape existing quotes */
+ while ((pp = strchr (pp, '\'')) && buflen > 3) {
+ len = strlen (pp++);
+ memmove (pp + 3, pp, len);
+ *pp++ = '\\';
+ *pp++ = '\'';
+ *pp++ = '\'';
+ buflen -= 3;
+ bp += 3;
+ }
+ /* If pp is still set, that means we ran out of space. */
+ if (pp)
+ buflen = 0;
+ if (!quoted && buflen) {
+ *bp++ = '\'';
+ *bp = '\0';
+ buflen--;
+ }
+ }
+ } else {
raw:
- *bp++ = *cp;
- *bp = '\0';
- buflen--;
+ *bp++ = *cp;
+ *bp = '\0';
+ buflen--;
- if (*cp == '\'')
- quoted = !quoted;
+ if (*cp == '\'')
+ quoted = !quoted;
+ }
}
- }
- if (buflen <= 0 || (ct->c_termproc && 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;
- }
+ if (buflen <= 0 || (ct->c_termproc && 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];
+ /* 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);
- }
+ strncpy (term, buffer, sizeof(term));
+ snprintf (buffer, sizeof(buffer), ct->c_termproc, term);
+ }
got_command:
- return show_content_aux2 (ct, serial, alternate, cracked, buffer,
- fd, xlist, xpause, xstdin, xtty);
+ return show_content_aux2 (ct, serial, alternate, cracked, buffer,
+ fd, xlist, xpause, xstdin, xtty);
}
*/
static int
-show_content_aux2 (CT ct, int serial, int alternate, char *cracked, char *buffer,
- int fd, int xlist, int xpause, int xstdin, int xtty)
+show_content_aux2 (CT ct, int serial, int alternate, char *cracked,
+ char *buffer, int fd, int xlist, int xpause, int xstdin, int xtty)
{
- pid_t child_id;
- int i;
- char *vec[4], exec[BUFSIZ + sizeof "exec "];
-
- if (debugsw || cracked) {
- fflush (stdout);
-
- fprintf (stderr, "%s msg %s", cracked ? "storing" : "show",
- ct->c_file);
- if (ct->c_partno)
- fprintf (stderr, " part %s", ct->c_partno);
- if (cracked)
- fprintf (stderr, " using command (cd %s; %s)\n", cracked, buffer);
- else
- fprintf (stderr, " using command %s\n", buffer);
- }
+ pid_t child_id;
+ int i;
+ char *vec[4], exec[BUFSIZ + sizeof "exec "];
- if (xpid < 0 || (xtty && xpid)) {
- if (xpid < 0)
- xpid = -xpid;
- pidcheck(pidwait (xpid, NOTOK));
- xpid = 0;
- }
-
- if (xlist) {
- char prompt[BUFSIZ];
+ if (debugsw || cracked) {
+ fflush (stdout);
- if (ct->c_type == CT_MULTIPART)
- list_content (ct, -1, 1, 0, 0);
- else
- list_switch (ct, -1, 1, 0, 0);
+ fprintf (stderr, "%s msg %s", cracked ? "storing" : "show",
+ ct->c_file);
+ if (ct->c_partno)
+ fprintf (stderr, " part %s", ct->c_partno);
+ if (cracked)
+ fprintf (stderr, " using command (cd %s; %s)\n", cracked, buffer);
+ else
+ fprintf (stderr, " using command %s\n", buffer);
+ }
- if (xpause && SOprintf ("Press <return> to show content..."))
- printf ("Press <return> to show content...");
+ if (xpid < 0 || (xtty && xpid)) {
+ if (xpid < 0)
+ xpid = -xpid;
+ pidcheck(pidwait (xpid, NOTOK));
+ xpid = 0;
+ }
- if (xpause) {
- int intr;
- SIGNAL_HANDLER istat;
+ if (xlist) {
+ char prompt[BUFSIZ];
- istat = SIGNAL (SIGINT, intrser);
- if ((intr = sigsetjmp (intrenv, 1)) == OK) {
- fflush (stdout);
- prompt[0] = 0;
- read (fileno (stdout), prompt, sizeof(prompt));
- }
- SIGNAL (SIGINT, istat);
- if (intr != OK || prompt[0] == 'n') {
- (*ct->c_ceclosefnx) (ct);
- return (alternate ? DONE : NOTOK);
- }
- if (prompt[0] == 'q') done(OK);
+ if (ct->c_type == CT_MULTIPART)
+ list_content (ct, -1, 1, 0, 0);
+ else
+ list_switch (ct, -1, 1, 0, 0);
+
+ if (xpause && SOprintf ("Press <return> to show content..."))
+ printf ("Press <return> to show content...");
+
+ if (xpause) {
+ int intr;
+ SIGNAL_HANDLER istat;
+
+ istat = SIGNAL (SIGINT, intrser);
+ if ((intr = sigsetjmp (intrenv, 1)) == OK) {
+ fflush (stdout);
+ prompt[0] = 0;
+ read (fileno (stdout), prompt, sizeof(prompt));
+ }
+ SIGNAL (SIGINT, istat);
+ if (intr != OK || prompt[0] == 'n') {
+ (*ct->c_ceclosefnx) (ct);
+ return (alternate ? DONE : NOTOK);
+ }
+ if (prompt[0] == 'q') done(OK);
+ }
}
- }
- snprintf (exec, sizeof(exec), "exec %s", buffer);
+ snprintf (exec, sizeof(exec), "exec %s", buffer);
- vec[0] = "/bin/sh";
- vec[1] = "-c";
- vec[2] = exec;
- vec[3] = NULL;
+ vec[0] = "/bin/sh";
+ vec[1] = "-c";
+ vec[2] = exec;
+ vec[3] = NULL;
- fflush (stdout);
+ fflush (stdout);
- for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
- sleep (5);
- switch (child_id) {
- case NOTOK:
- advise ("fork", "unable to");
- (*ct->c_ceclosefnx) (ct);
- return NOTOK;
+ for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
+ sleep (5);
+ switch (child_id) {
+ case NOTOK:
+ advise ("fork", "unable to");
+ (*ct->c_ceclosefnx) (ct);
+ return NOTOK;
- case OK:
- if (cracked)
- chdir (cracked);
- if (!xstdin)
- dup2 (fd, 0);
- close (fd);
- execvp ("/bin/sh", vec);
- fprintf (stderr, "unable to exec ");
- perror ("/bin/sh");
- _exit (-1);
- /* NOTREACHED */
+ case OK:
+ if (cracked)
+ chdir (cracked);
+ if (!xstdin)
+ dup2 (fd, 0);
+ close (fd);
+ execvp ("/bin/sh", vec);
+ fprintf (stderr, "unable to exec ");
+ perror ("/bin/sh");
+ _exit (-1);
+ /* NOTREACHED */
- default:
- if (!serial) {
- ct->c_pid = child_id;
- if (xtty)
- xpid = child_id;
- } else {
- pidcheck (pidXwait (child_id, NULL));
- }
-
- if (fd != NOTOK)
- (*ct->c_ceclosefnx) (ct);
- return (alternate ? DONE : OK);
- }
+ default:
+ if (!serial) {
+ ct->c_pid = child_id;
+ if (xtty)
+ xpid = child_id;
+ } else {
+ pidcheck (pidXwait (child_id, NULL));
+ }
+
+ if (fd != NOTOK)
+ (*ct->c_ceclosefnx) (ct);
+ return (alternate ? DONE : OK);
+ }
}
static int
show_text (CT ct, int serial, int alternate)
{
- char *cp, buffer[BUFSIZ];
- CI ci = &ct->c_ctinfo;
+ char *cp, buffer[BUFSIZ];
+ CI ci = &ct->c_ctinfo;
- /* Check for mhn-show-type/subtype */
- snprintf (buffer, sizeof(buffer), "%s-show-%s/%s",
+ /* Check for mhshow-show-type/subtype */
+ 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);
-
- /* Check for mhn-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);
-
- /*
- * 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");
- cp = (ct->c_showproc = add (buffer, NULL));
- return show_content_aux (ct, serial, alternate, cp, NULL);
- }
-
- return NOTOK;
+ if ((cp = context_find (buffer)) && *cp != '\0')
+ return show_content_aux (ct, serial, 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);
+
+ /*
+ * 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");
+ cp = (ct->c_showproc = add (buffer, NULL));
+ return show_content_aux (ct, serial, alternate, cp, NULL);
+ }
+
+ return NOTOK;
}
static int
show_multi (CT ct, int serial, int alternate)
{
- char *cp, buffer[BUFSIZ];
- CI ci = &ct->c_ctinfo;
+ char *cp, buffer[BUFSIZ];
+ CI ci = &ct->c_ctinfo;
- /* Check for mhn-show-type/subtype */
- snprintf (buffer, sizeof(buffer), "%s-show-%s/%s",
+ /* Check for mhshow-show-type/subtype */
+ 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);
-
- /* Check for mhn-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);
-
- if ((cp = ct->c_showproc))
- return show_multi_aux (ct, serial, alternate, cp);
-
- /*
- * Use default method to display this multipart content
- * if it is not a (nested) part of a multipart/alternative,
- * 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 NOTOK;
+ if ((cp = context_find (buffer)) && *cp != '\0')
+ return show_multi_aux (ct, serial, 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);
+
+ if ((cp = ct->c_showproc))
+ return show_multi_aux (ct, serial, alternate, cp);
+
+ /*
+ * Use default method to display this multipart content
+ * if it is not a (nested) part of a multipart/alternative,
+ * 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 NOTOK;
}
static int
show_multi_internal (CT ct, int serial, int alternate)
{
- int alternating, nowalternate, nowserial, 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) {
- nowalternate = 1;
- alternating = 1;
- nowserial = serial;
- } else {
- /*
- * multipart/mixed
- * mutlipart/digest
- * unknown subtypes of multipart (treat as mixed per rfc2046)
- */
- nowserial = serial;
- }
+ int alternating, nowalternate, nowserial, 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) {
+ 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);
- }
+ /* 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);
+ }
/*
* alternate -> we are a part inside an multipart/alternative
- * alternating -> we are a multipart/alternative
+ * alternating -> we are a multipart/alternative
*/
- result = alternate ? NOTOK : OK;
+ 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)) {
- int inneresult;
-
- inneresult = show_switch (p, nowserial, nowalternate);
- switch (inneresult) {
- case NOTOK:
- if (alternate && !alternating) {
- result = NOTOK;
- goto out;
- }
- continue;
+ for (part = m->mp_parts; part; part = part->mp_next) {
+ p = part->mp_part;
- case OK:
- case DONE:
- if (alternating) {
- result = DONE;
+ if (part_ok (p, 0) && type_ok (p, 0)) {
+ int inneresult;
+
+ inneresult = show_switch (p, nowserial, nowalternate);
+ switch (inneresult) {
+ case NOTOK:
+ if (alternate && !alternating) {
+ result = NOTOK;
+ goto out;
+ }
+ continue;
+
+ case OK:
+ case DONE:
+ if (alternating) {
+ result = DONE;
+ break;
+ }
+ if (alternate) {
+ alternate = nowalternate = 0;
+ if (result == NOTOK)
+ result = inneresult;
+ }
+ continue;
+ }
break;
- }
- if (alternate) {
- alternate = nowalternate = 0;
- if (result == NOTOK)
- result = inneresult;
- }
- continue;
- }
- break;
+ }
}
- }
- if (alternating && !part) {
- if (!alternate)
- content_error (NULL, ct, "don't know how to display any of the contents");
- result = NOTOK;
- goto out;
- }
-
- if (serial && !nowserial) {
- pid_t pid;
- int kids;
-#ifdef WAITINT
- int status;
+ if (alternating && !part) {
+ if (!alternate)
+ content_error (NULL, ct, "don't know how to display any of the contents");
+ result = NOTOK;
+ goto out;
+ }
+
+ if (serial && !nowserial) {
+ pid_t pid;
+ int kids;
+#ifdef HAVE_UNION_WAIT
+ union wait status;
#else
- union wait status;
+ 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++;
- }
- }
+ 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 WAITINT
- pidcheck (status);
+ while (kids > 0 && (pid = wait (&status)) != NOTOK) {
+#ifdef HAVE_UNION_WAIT
+ pidcheck (status.w_status);
#else
- pidcheck (status.w_status);
+ 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;
+ 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);
- }
+ if (!nowserial) {
+ /* reset the signal mask */
+ SIGPROCMASK (SIG_SETMASK, &oset, &set);
+ }
- return result;
+ return result;
}
static int
show_multi_aux (CT ct, int serial, int alternate, char *cp)
{
- int len, buflen, quoted;
- int xlist, xpause, xtty;
- char *bp, *pp, *file, buffer[BUFSIZ];
- struct multipart *m = (struct multipart *) ct->c_ctparams;
- struct part *part;
- CI ci = &ct->c_ctinfo;
- CT p;
-
- for (part = m->mp_parts; part; part = part->mp_next) {
- p = part->mp_part;
-
- if (!p->c_ceopenfnx) {
- if (!alternate)
- content_error (NULL, p, "don't know how to decode content");
- return NOTOK;
- }
-
- if (p->c_storage == NULL) {
- file = NULL;
- if ((*p->c_ceopenfnx) (p, &file) == NOTOK)
- return NOTOK;
+ int len, buflen, quoted;
+ int xlist, xpause, xtty;
+ char *bp, *pp, *file, buffer[BUFSIZ];
+ struct multipart *m = (struct multipart *) ct->c_ctparams;
+ struct part *part;
+ CI ci = &ct->c_ctinfo;
+ CT p;
- /* I'm not sure if this is necessary? */
- p->c_storage = add (file, NULL);
+ for (part = m->mp_parts; part; part = part->mp_next) {
+ p = part->mp_part;
- if (p->c_showproc && !strcmp (p->c_showproc, "true"))
- return (alternate ? DONE : OK);
- (*p->c_ceclosefnx) (p);
- }
- }
-
- xlist = 0;
- xpause = 0;
- xtty = 0;
-
- /* get buffer ready to go */
- bp = buffer;
- buflen = sizeof(buffer) - 1;
- bp[0] = bp[buflen] = '\0';
- quoted = 0;
-
- /* Now parse display string */
- for ( ; *cp; cp++) {
- if (*cp == '%') {
- switch (*++cp) {
- case 'a':
- /* insert parameters from Content-Type field */
- {
- char **ap, **ep;
- char *s = "";
-
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- snprintf (bp, buflen, "%s%s=\"%s\"", s, *ap, *ep);
- len = strlen (bp);
- bp += len;
- buflen -= len;
- s = " ";
+ if (!p->c_ceopenfnx) {
+ if (!alternate)
+ content_error (NULL, p, "don't know how to decode content");
+ return NOTOK;
}
- }
- break;
- case 'd':
- /* insert content description */
- if (ct->c_descr) {
- char *s;
+ if (p->c_storage == NULL) {
+ file = NULL;
+ if ((*p->c_ceopenfnx) (p, &file) == NOTOK)
+ return NOTOK;
- s = trimcpy (ct->c_descr);
- strncpy (bp, s, buflen);
- free (s);
- }
- break;
+ /* I'm not sure if this is necessary? */
+ p->c_storage = add (file, NULL);
- case 'e':
- /* exclusive execution */
- xtty = 1;
- break;
-
- case 'F':
- /* %e and %f */
- xtty = 1;
- /* and fall... */
-
- case 'f':
- /* insert filename(s) containing content */
- {
- char *s = "";
-
- for (part = m->mp_parts; part; part = part->mp_next) {
- p = part->mp_part;
-
- snprintf (bp, buflen, "%s'%s'", s, p->c_storage);
- len = strlen (bp);
- bp += len;
- buflen -= len;
- s = " ";
+ if (p->c_showproc && !strcmp (p->c_showproc, "true"))
+ return (alternate ? DONE : OK);
+ (*p->c_ceclosefnx) (p);
}
- }
- break;
-
- case 'p':
- /* %l, and pause prior to displaying content */
- xpause = pausesw;
- /* and fall... */
-
- case 'l':
- /* display listing prior to displaying content */
- xlist = !nolist;
- break;
+ }
- case 's':
- /* insert subtype of content */
- strncpy (bp, ci->ci_subtype, buflen);
- break;
+ xlist = 0;
+ xpause = 0;
+ xtty = 0;
+
+ /* get buffer ready to go */
+ bp = buffer;
+ buflen = sizeof(buffer) - 1;
+ bp[0] = bp[buflen] = '\0';
+ quoted = 0;
+
+ /* Now parse display string */
+ for ( ; *cp && buflen > 0; cp++) {
+ if (*cp == '%') {
+ pp = bp;
+ switch (*++cp) {
+ case 'a':
+ /* insert parameters from Content-Type field */
+ {
+ char **ap, **ep;
+ char *s = "";
+
+ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
+ snprintf (bp, buflen, "%s%s=\"%s\"", s, *ap, *ep);
+ len = strlen (bp);
+ bp += len;
+ buflen -= len;
+ s = " ";
+ }
+ }
+ break;
- case '%':
- /* insert character % */
- goto raw;
+ case 'd':
+ /* insert content description */
+ if (ct->c_descr) {
+ char *s;
+
+ s = trimcpy (ct->c_descr);
+ strncpy (bp, s, buflen);
+ free (s);
+ }
+ break;
+
+ case 'e':
+ /* exclusive execution */
+ xtty = 1;
+ break;
+
+ case 'F':
+ /* %e and %f */
+ xtty = 1;
+ /* and fall... */
+
+ case 'f':
+ /* insert filename(s) containing content */
+ {
+ char *s = "";
+
+ for (part = m->mp_parts; part; part = part->mp_next) {
+ p = part->mp_part;
+
+ snprintf (bp, buflen, "%s'%s'", s, p->c_storage);
+ len = strlen (bp);
+ bp += len;
+ buflen -= len;
+ s = " ";
+ }
+ /* set our starting pointer back to bp, to avoid
+ * requoting the filenames we just added
+ */
+ pp = bp;
+ }
+ break;
- default:
- *bp++ = *--cp;
- *bp = '\0';
- buflen--;
- continue;
- }
- len = strlen (bp);
- bp += len;
- buflen -= len;
-
- /* Did we actually insert something? */
- if (bp != pp) {
- /* Insert single quote if not inside quotes already */
- if (!quoted && buflen) {
- len = strlen (pp);
- memmove (pp + 1, pp, len);
- *pp++ = '\'';
- buflen--;
- bp++;
- }
- /* Escape existing quotes */
- while ((pp = strchr (pp, '\'')) && buflen > 3) {
- len = strlen (pp++);
- memmove (pp + 3, pp, len);
- *pp++ = '\\';
- *pp++ = '\'';
- *pp++ = '\'';
- buflen -= 3;
- bp += 3;
- }
- /* If pp is still set, that means we ran out of space. */
- if (pp)
- buflen = 0;
- if (!quoted && buflen) {
- *bp++ = '\'';
- *bp = '\0';
- buflen--;
- }
- }
- } else {
+ case 'p':
+ /* %l, and pause prior to displaying content */
+ xpause = pausesw;
+ /* and fall... */
+
+ case 'l':
+ /* display listing prior to displaying content */
+ xlist = !nolist;
+ break;
+
+ case 's':
+ /* insert subtype of content */
+ strncpy (bp, ci->ci_subtype, buflen);
+ break;
+
+ case '%':
+ /* insert character % */
+ goto raw;
+
+ default:
+ *bp++ = *--cp;
+ *bp = '\0';
+ buflen--;
+ continue;
+ }
+ len = strlen (bp);
+ bp += len;
+ buflen -= len;
+
+ /* Did we actually insert something? */
+ if (bp != pp) {
+ /* Insert single quote if not inside quotes already */
+ if (!quoted && buflen) {
+ len = strlen (pp);
+ memmove (pp + 1, pp, len);
+ *pp++ = '\'';
+ buflen--;
+ bp++;
+ }
+ /* Escape existing quotes */
+ while ((pp = strchr (pp, '\'')) && buflen > 3) {
+ len = strlen (pp++);
+ memmove (pp + 3, pp, len);
+ *pp++ = '\\';
+ *pp++ = '\'';
+ *pp++ = '\'';
+ buflen -= 3;
+ bp += 3;
+ }
+ /* If pp is still set, that means we ran out of space. */
+ if (pp)
+ buflen = 0;
+ if (!quoted && buflen) {
+ *bp++ = '\'';
+ *bp = '\0';
+ buflen--;
+ }
+ }
+ } else {
raw:
- *bp++ = *cp;
- *bp = '\0';
- buflen--;
+ *bp++ = *cp;
+ *bp = '\0';
+ buflen--;
- if (*cp == '\'')
- quoted = !quoted;
+ if (*cp == '\'')
+ quoted = !quoted;
+ }
}
- }
- if (buflen <= 0 || (ct->c_termproc && 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;
- }
+ if (buflen <= 0 || (ct->c_termproc && 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];
+ /* 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);
- }
+ strncpy (term, buffer, sizeof(term));
+ snprintf (buffer, sizeof(buffer), ct->c_termproc, term);
+ }
- return show_content_aux2 (ct, serial, alternate, NULL, buffer,
- NOTOK, xlist, xpause, 0, xtty);
+ return show_content_aux2 (ct, serial, alternate, NULL, buffer,
+ NOTOK, xlist, xpause, 0, xtty);
}
static int
show_message_rfc822 (CT ct, int serial, int alternate)
{
- char *cp, buffer[BUFSIZ];
- CI ci = &ct->c_ctinfo;
-
- /* Check for mhn-show-type/subtype */
- 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);
-
- /* Check for mhn-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);
-
- if ((cp = ct->c_showproc))
- return show_content_aux (ct, serial, alternate, cp, NULL);
-
- /* default method for message/rfc822 */
- if (ct->c_subtype == MESSAGE_RFC822) {
- cp = (ct->c_showproc = add ("%pshow -file '%F'", NULL));
- return show_content_aux (ct, serial, alternate, cp, NULL);
- }
+ char *cp, buffer[BUFSIZ];
+ CI ci = &ct->c_ctinfo;
+
+ /* Check for mhshow-show-type/subtype */
+ 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);
+
+ /* 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);
+
+ if ((cp = ct->c_showproc))
+ return show_content_aux (ct, serial, alternate, cp, NULL);
+
+ /* default method for message/rfc822 */
+ if (ct->c_subtype == MESSAGE_RFC822) {
+ cp = (ct->c_showproc = add ("%pshow -file '%F'", NULL));
+ return show_content_aux (ct, serial, alternate, cp, NULL);
+ }
- /* complain if we are not a part of a multipart/alternative */
- if (!alternate)
- content_error (NULL, ct, "don't know how to display content");
+ /* complain if we are not a part of a multipart/alternative */
+ if (!alternate)
+ content_error (NULL, ct, "don't know how to display content");
- return NOTOK;
+ return NOTOK;
}
static int
show_partial (CT ct, int serial, int alternate)
{
- content_error (NULL, ct,
- "in order to display this message, you must reassemble it");
- return NOTOK;
+ content_error (NULL, ct,
+ "in order to display this message, you must reassemble it");
+ return NOTOK;
}
static int
show_external (CT ct, int serial, int alternate)
{
- struct exbody *e = (struct exbody *) ct->c_ctparams;
- CT p = e->eb_content;
+ struct exbody *e = (struct exbody *) ct->c_ctparams;
+ CT p = e->eb_content;
- if (!type_ok (p, 0))
- return OK;
+ if (!type_ok (p, 0))
+ return OK;
- return show_switch (p, serial, alternate);
+ return show_switch (p, serial, alternate);
#if 0
- content_error (NULL, p, "don't know how to display content");
- return NOTOK;
+ content_error (NULL, p, "don't know how to display content");
+ return NOTOK;
#endif
}
intrser (int i)
{
#ifndef RELIABLE_SIGNALS
- SIGNAL (SIGINT, intrser);
+ SIGNAL (SIGINT, intrser);
#endif
- putchar ('\n');
- siglongjmp (intrenv, DONE);
+ putchar ('\n');
+ siglongjmp (intrenv, DONE);
}