#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 pausesw = 1;
-int serialsw = 0;
int nolist = 0;
-
-char *progsw = NULL;
-
-/* flags for moreproc/header display */
-int nomore = 0;
char *formsw = NULL;
-
pid_t xpid = 0;
-static sigjmp_buf intrenv;
-
-
-/* termsbr.c */
-int SOprintf(char *, ...);
/* mhparse.c */
int pidcheck(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, 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 RETSIGTYPE intrser(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);
/*
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
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);
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();
/*
-** 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 */
*/
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:
*/
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;
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)
*/
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, xpause, xtty;
+ int xstdin, xlist, xtty;
char *bp, *pp, *file, buffer[BUFSIZ];
CI ci = &ct->c_ctinfo;
return (alternate ? DONE : OK);
xlist = 0;
- xpause = 0;
xstdin = 0;
xtty = 0;
break;
case 'p':
- /* %l, and pause prior to displaying content */
- xpause = pausesw;
- /* and fall... */
-
case 'l':
/*
** display listing prior to displaying content
}
}
- 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
}
got_command:
- return show_content_aux2(ct, serial, alternate, cracked, buffer,
- fd, xlist, xpause, xstdin, xtty);
+ return show_content_aux2(ct, alternate, cracked, buffer,
+ fd, xlist, 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 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) {
}
if (xlist) {
- char prompt[BUFSIZ];
-
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);
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);
/* 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);
*/
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;
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;
*/
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;
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
** 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;
}
*/
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) {
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;
}
*/
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, xpause, xtty;
+ int xlist, xtty;
char *bp, *pp, *file, buffer[BUFSIZ];
struct multipart *m = (struct multipart *) ct->c_ctparams;
struct part *part;
}
xlist = 0;
- xpause = 0;
xtty = 0;
/* get buffer ready to go */
break;
case 'p':
- /* %l, and pause prior to displaying content */
- xpause = pausesw;
- /* and fall... */
-
case 'l':
/*
** display listing prior to displaying content
}
}
- 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
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, alternate, NULL, buffer,
+ NOTOK, xlist, 0, xtty);
}
*/
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;
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 */
*/
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");
*/
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;
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");
return NOTOK;
#endif
}
-
-
-static RETSIGTYPE
-intrser(int i)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL(SIGINT, intrser);
-#endif
-
- putchar('\n');
- siglongjmp(intrenv, DONE);
-}