#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>
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);
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_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_message_rfc822(CT, int, int);
static int show_partial(CT, int, int);
static int show_external(CT, int, int);
-static RETSIGTYPE intrser(int);
/*
/*
** If form is "mhl.null", suppress display of header.
*/
- if (!strcmp(formsw, "mhl.null"))
+ if (strcmp(formsw, "mhl.null")==0)
formsw = NULL;
for (ctp = cts; *ctp; ctp++) {
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) {
+ /* If we've specified -moreproc, then just pass that along. */
+ if (progsw) {
vec[vecp++] = "-moreproc";
vec[vecp++] = progsw;
}
fflush(stdout);
- for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++)
+ for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
sleep(5);
switch (child_id) {
show_switch(CT ct, int serial, int alternate)
{
switch (ct->c_type) {
- case CT_MULTIPART:
- return show_multi(ct, serial, alternate);
- break;
+ 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 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_EXTERNAL:
+ return show_external(ct, serial, alternate);
+ break;
- case MESSAGE_RFC822:
- default:
- return show_message_rfc822(ct, serial,
- alternate);
- break;
- }
- 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_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;
+ 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;
+ default:
+ adios(NULL, "unknown content type %d", ct->c_type);
+ break;
}
return 0; /* NOT REACHED */
show_content_aux(CT ct, int serial, 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;
file = NULL;
if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK)
return NOTOK;
- if (ct->c_showproc && !strcmp(ct->c_showproc, "true"))
+ if (ct->c_showproc && strcmp(ct->c_showproc, "true")==0)
return (alternate ? DONE : OK);
xlist = 0;
- xpause = 0;
xstdin = 0;
xtty = 0;
switch (*++cp) {
case 'a':
/* insert parameters from Content-Type field */
- {
+ {
char **ap, **ep;
char *s = "";
buflen -= len;
s = " ";
}
- }
- break;
+ }
+ break;
case 'd':
/* insert content description */
break;
case 'p':
- /* %l, and pause prior to displaying content */
- xpause = pausesw;
- /* and fall... */
-
case 'l':
/*
** display listing prior to displaying content
got_command:
return show_content_aux2(ct, serial, alternate, cracked, buffer,
- fd, xlist, xpause, xstdin, xtty);
+ 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)
+ char *buffer, int fd, int xlist, int xstdin, int xtty)
{
pid_t child_id;
int i;
}
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 = vfork()) == NOTOK && i < 5; i++)
+ for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
sleep(5);
switch (child_id) {
- case NOTOK:
- advise("fork", "unable to");
- (*ct->c_ceclosefnx) (ct);
- return NOTOK;
+ 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 */
-
- default:
- if (!serial) {
- ct->c_pid = child_id;
- if (xtty)
- xpid = child_id;
- } else {
- pidcheck(pidXwait(child_id, NULL));
- }
+ 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);
+ if (fd != NOTOK)
+ (*ct->c_ceclosefnx) (ct);
+ return (alternate ? DONE : OK);
}
}
*/
if (!alternate || ct->c_subtype == TEXT_PLAIN) {
snprintf(buffer, sizeof(buffer), "%%p%s '%%F'",
- progsw ? progsw : moreproc && *moreproc ?
- moreproc : "more");
+ progsw ? progsw : moreproc);
cp = (ct->c_showproc = getcpy(buffer));
return show_content_aux(ct, serial, alternate, cp, NULL);
}
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;
+ 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;
}
show_multi_aux(CT ct, int serial, 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;
/* I'm not sure if this is necessary? */
p->c_storage = getcpy(file);
- if (p->c_showproc && !strcmp(p->c_showproc, "true"))
+ if (p->c_showproc && strcmp(p->c_showproc, "true")==0)
return (alternate ? DONE : OK);
(*p->c_ceclosefnx) (p);
}
}
xlist = 0;
- xpause = 0;
xtty = 0;
/* get buffer ready to go */
switch (*++cp) {
case 'a':
/* insert parameters from Content-Type field */
- {
+ {
char **ap, **ep;
char *s = "";
buflen -= len;
s = " ";
}
- }
- break;
+ }
+ break;
case 'd':
/* insert content description */
break;
case 'p':
- /* %l, and pause prior to displaying content */
- xpause = pausesw;
- /* and fall... */
-
case 'l':
/*
** display listing prior to displaying content
}
return show_content_aux2(ct, serial, alternate, NULL, buffer,
- NOTOK, xlist, xpause, 0, xtty);
+ NOTOK, xlist, 0, xtty);
}
return NOTOK;
#endif
}
-
-
-static RETSIGTYPE
-intrser(int i)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL(SIGINT, intrser);
-#endif
-
- putchar('\n');
- siglongjmp(intrenv, DONE);
-}