{ "noheader", 0 },
#define FORMSW 4
{ "form formfile", 0 },
-#define PROGSW 5
- { "moreproc program", 0 },
-#define NPROGSW 6
- { "nomoreproc", 0 },
-#define LENSW 7
- { "length lines", 0 },
-#define WIDTHSW 8
- { "width columns", 0 },
-#define SHOWSW 9
+#define SHOWSW 5
{ "showproc program", 0 },
-#define SHOWMIMESW 10
+#define SHOWMIMESW 6
{ "showmimeproc program", 0 },
-#define NSHOWSW 11
- { "noshowproc", 0 },
-#define FILESW 12
- { "file file", -4 }, /* interface from showfile */
-#define VERSIONSW 13
+#define FILESW 7
+ { "file file", -4 }, /* interface from whatnow (listproc) */
+#define VERSIONSW 8
{ "version", 0 },
-#define HELPSW 14
+#define HELPSW 9
{ "help", 0 },
{ NULL, 0 }
};
/*
** static prototypes
*/
-static int is_nontext(char *);
-
-/* prototype from mhlsbr.c */
-int mhl(int, char **);
+static int is_mime(char *);
#define SHOW 0
#define NEXT 1
#define PREV 2
+char *showproc = "mhl";
+char *showmimeproc = "mhshow";
int
main(int argc, char **argv)
{
int headersw = 1, msgp = 0;
- int nshow = 0, checkmime = 1, mime;
+ int checkmime = 1, mime;
int vecp = 1, procp = 1, mode = SHOW, msgnum;
- char *cp, *maildir, *file = NULL, *folder = NULL, *proc;
+ char *cp, *file = NULL, *folder = NULL, *proc;
char buf[BUFSIZ], **argp, **arguments;
char *msgs[MAXARGS], *vec[MAXARGS];
struct msgs *mp = NULL;
while ((cp = *argp++)) {
if (*cp == '-') {
switch (smatch(++cp, switches)) {
- case AMBIGSW:
- ambigsw(cp, switches);
- done(1);
- case UNKWNSW:
- case NPROGSW:
- vec[vecp++] = --cp;
- continue;
-
- case HELPSW:
- snprintf(buf, sizeof(buf), "%s [+folder] %s[switches] [switches for showproc]", invo_name, mode == SHOW ? "[msgs] ": "");
- print_help(buf, switches, 1);
- done(1);
- case VERSIONSW:
- print_version(invo_name);
- done(1);
-
- case FILESW:
- if (mode != SHOW)
+ case AMBIGSW:
+ ambigsw(cp, switches);
+ done(1);
+ case UNKWNSW:
+ vec[vecp++] = --cp;
+ continue;
+
+ case HELPSW:
+ snprintf(buf, sizeof(buf), "%s [+folder] %s[switches] [switches for showproc]", invo_name, mode == SHOW ? "[msgs] ": "");
+ print_help(buf, switches, 1);
+ done(1);
+ case VERSIONSW:
+ print_version(invo_name);
+ done(1);
+
+ case FILESW:
+ if (mode != SHOW)
usage:
- adios(NULL, "usage: %s [+folder] [switches] [switches for showproc]", invo_name);
-
- if (file)
- adios(NULL, "only one file at a time!");
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s", argp[-2]);
- file = getcpy(expanddir(cp));
- continue;
-
- case HEADSW:
- headersw++;
- continue;
- case NHEADSW:
- headersw = 0;
- continue;
-
- case FORMSW:
- vec[vecp++] = --cp;
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s", argp[-2]);
- vec[vecp++] = getcpy(etcpath(cp));
- continue;
-
- case PROGSW:
- case LENSW:
- case WIDTHSW:
- vec[vecp++] = --cp;
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s", argp[-2]);
- vec[vecp++] = cp;
- continue;
-
- case SHOWSW:
- if (!(showproc = *argp++) || *showproc == '-')
- adios(NULL, "missing argument to %s", argp[-2]);
- nshow = 0;
- continue;
- case NSHOWSW:
- nshow++;
- continue;
-
- case SHOWMIMESW:
- if (!(showmimeproc = *argp++) || *showmimeproc == '-')
- adios(NULL, "missing argument to %s", argp[-2]);
- nshow = 0;
- continue;
- case CHECKMIMESW:
- checkmime++;
- continue;
- case NOCHECKMIMESW:
- checkmime = 0;
- continue;
+ adios(NULL, "usage: %s [+folder] [switches] [switches for showproc]", invo_name);
+
+ if (file)
+ adios(NULL, "only one file at a time!");
+ if (!(cp = *argp++) || *cp == '-')
+ adios(NULL, "missing argument to %s", argp[-2]);
+ file = getcpy(expanddir(cp));
+ continue;
+
+ case HEADSW:
+ headersw++;
+ continue;
+ case NHEADSW:
+ headersw = 0;
+ continue;
+
+ case FORMSW:
+ vec[vecp++] = --cp;
+ if (!(cp = *argp++) || *cp == '-')
+ adios(NULL, "missing argument to %s",
+ argp[-2]);
+ vec[vecp++] = getcpy(etcpath(cp));
+ continue;
+
+ case SHOWSW:
+ if (!(showproc = *argp++) || *showproc == '-')
+ adios(NULL, "missing argument to %s",
+ argp[-2]);
+ continue;
+
+ case SHOWMIMESW:
+ if (!(showmimeproc = *argp++) ||
+ *showmimeproc == '-')
+ adios(NULL, "missing argument to %s",
+ argp[-2]);
+ continue;
+ case CHECKMIMESW:
+ checkmime++;
+ continue;
+ case NOCHECKMIMESW:
+ checkmime = 0;
+ continue;
}
}
if (*cp == '+' || *cp == '@') {
goto go_to_it;
}
-#ifdef WHATNOW
- if (!msgp && !folder && mode == SHOW &&
- (cp = getenv("mhdraft")) && *cp) {
- vec[vecp++] = cp;
- goto go_to_it;
- }
-#endif /* WHATNOW */
-
if (!msgp) {
switch (mode) {
- case NEXT:
- msgs[msgp++] = "next";
- break;
- case PREV:
- msgs[msgp++] = "prev";
- break;
- default:
- msgs[msgp++] = "cur";
- break;
+ case NEXT:
+ msgs[msgp++] = seq_next;
+ break;
+ case PREV:
+ msgs[msgp++] = seq_prev;
+ break;
+ default:
+ msgs[msgp++] = seq_cur;
+ break;
}
}
if (!folder)
folder = getcurfol();
- maildir = toabsdir(folder);
-
- if (chdir(maildir) == NOTOK)
- adios(maildir, "unable to change directory to");
/* read folder and create message structure */
if (!(mp = folder_read(folder)))
set_unseen(mp, msgnum);
seq_setprev(mp); /* set the Previous-Sequence */
- seq_setunseen(mp, 1); /* unset the Unseen-Sequence */
+ seq_setunseen(mp, 0); /* unset unseen seqs for shown msgs */
if (mp->numsel > MAXARGS - 2)
adios(NULL, "more than %d messages for show exec",
** Decide which "proc" to use
*/
mime = 0;
- if (nshow) {
- proc = catproc;
- } else {
- /* check if any messages are non-text MIME messages */
- if (checkmime && !getenv("NOMHNPROC")) {
- if (!file) {
- /*
- ** loop through selected messages
- ** and check for MIME
- */
- for (msgnum = mp->lowsel;
- msgnum <= mp->hghsel;
- msgnum++)
- if (is_selected(mp, msgnum) && is_nontext(m_name(msgnum))) {
- mime = 1;
- break;
- }
- } else {
- /* check the file for MIME */
- if (is_nontext(vec[vecp - 1]))
+ /* check if any messages are non-text MIME messages */
+ if (checkmime) {
+ if (file) {
+ if (is_mime(vec[vecp - 1])) {
+ mime = 1;
+ }
+ } else {
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel;
+ msgnum++) {
+ if (!is_selected(mp, msgnum)) {
+ continue;
+ }
+ snprintf(buf, sizeof buf, "%s/%d",
+ toabsdir(folder), msgnum);
+ if (is_mime(buf)) {
mime = 1;
+ break;
+ }
}
}
-
- /* Set the "proc" */
- if (mime)
- proc = showmimeproc;
- else
- proc = showproc;
}
- if (folder && !file)
- m_putenv("mhfolder", folder);
+ /* Set the "proc" */
+ proc = (mime) ? showmimeproc : showproc;
- /*
- ** For backward compatibility, if the "proc" is mhn,
- ** then add "-show" option. Add "-file" if showing
- ** file.
- */
- if (strcmp(mhbasename(proc), "mhn") == 0) {
+ /* Special-cased because mhshow takes msg not files args. */
+ if (strcmp(mhbasename(proc), "mhshow")==0) {
if (file) {
vec[vecp] = vec[vecp - 1];
vec[vecp - 1] = "-file";
- vecp++;
+ vec[++vecp] = NULL;
}
- vec[vecp++] = "-show";
+ vec[vecp++] = concat("+", folder, NULL);
vec[vecp] = NULL;
+ vec[0] = mhbasename(proc);
+ execvp(proc, vec);
+ adios(proc, "unable to exec");
}
- /* If the "proc" is "mhshow", add "-file" if showing file. */
- if (strcmp(mhbasename(proc), "mhshow") == 0 && file ) {
- vec[vecp] = vec[vecp - 1];
- vec[vecp - 1] = "-file";
- vec[++vecp] = NULL;
- }
-
- /*
- ** If "proc" is mhl, then run it internally
- ** rather than exec'ing it.
- */
- if (strcmp(mhbasename(proc), "mhl") == 0) {
- vec[0] = "mhl";
- mhl(vecp, vec);
- done(0);
- }
-
- /*
- ** If you are not using a nmh command as your "proc", then
- ** add the path to the message names. Currently, we are just
- ** checking for mhn here, since we've already taken care of mhl.
- */
- if (!strcmp(mhbasename(proc), "mhl")
- && !file
- && chdir(maildir =
- concat(toabsdir("+"), "/", NULL)) != NOTOK) {
- mp->foldpath = concat(mp->foldpath, "/", NULL);
- cp = isprefix(maildir, mp->foldpath)
- ? mp->foldpath + strlen(maildir)
- : mp->foldpath;
- for (msgnum = procp; msgnum < vecp; msgnum++)
- vec[msgnum] = concat(cp, vec[msgnum], NULL);
+ /* Add the path to the message names. */
+ if (!file) {
+ for (msgnum = procp; msgnum < vecp; msgnum++) {
+ vec[msgnum] = concat(mp->foldpath, "/",
+ vec[msgnum], NULL);
+ }
}
vec[0] = mhbasename(proc);
}
/*
-** Check if a message or file contains any non-text parts
+** Check if a message or file contains MIME.
*/
static int
-is_nontext(char *msgnam)
+is_mime(char *msgnam)
{
- int result, state;
- unsigned char *bp, *dp;
- char *cp;
+ int state = FLD;
char buf[BUFSIZ], name[NAMESZ];
FILE *fp;
if ((fp = fopen(msgnam, "r")) == NULL)
return 0;
- for (state = FLD;;) {
+ while (1) {
switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) {
case FLD:
case FLDPLUS:
case FLDEOF:
- /*
- ** Check Content-Type field
- */
- if (!mh_strcasecmp(name, TYPE_FIELD)) {
- int passno;
- char c;
-
- cp = getcpy(buf);
- while (state == FLDPLUS) {
- state = m_getfld(state, name, buf,
- sizeof(buf), fp);
- cp = add(buf, cp);
- }
- bp = cp;
- passno = 1;
-
-again:
- for (; isspace(*bp); bp++)
- continue;
- if (*bp == '(') {
- int i;
-
- for (bp++, i = 0;;) {
- switch (*bp++) {
- case '\0':
-invalid:
- result = 0;
- goto out;
- case '\\':
- if (*bp++ == '\0')
- goto invalid;
- continue;
- case '(':
- i++;
- /* and fall... */
- default:
- continue;
- case ')':
- if (--i < 0)
- break;
- continue;
- }
- break;
- }
- }
- if (passno == 2) {
- if (*bp != '/')
- goto invalid;
- bp++;
- passno = 3;
- goto again;
- }
- for (dp = bp; istoken(*dp); dp++)
- continue;
- c = *dp;
- *dp = '\0';
- if (!*bp)
- goto invalid;
- if (passno > 1) {
- if ((result = (mh_strcasecmp(bp,
- "plain") != 0)))
- goto out;
- *dp = c;
- for (dp++; isspace(*dp); dp++)
- continue;
- if (*dp) {
- if ((result = !uprf(dp,
- "charset")))
- goto out;
- dp += sizeof("charset") - 1;
- while (isspace(*dp))
- dp++;
- if (*dp++ != '=')
- goto invalid;
- while (isspace(*dp))
- dp++;
- if (*dp == '"') {
- if ((bp = strchr(++dp, '"')))
- *bp = '\0';
- } else {
- for (bp = dp; *bp; bp++)
- if (!istoken(*bp)) {
- *bp = '\0';
- break;
- }
- }
- } else {
- /* Default character set */
- dp = "US-ASCII";
- }
- /* Check the character set */
- result = !check_charset(dp, strlen(dp));
- } else {
- if (!(result = (mh_strcasecmp(bp, "text") != 0))) {
- *dp = c;
- bp = dp;
- passno = 2;
- goto again;
- }
- }
-out:
- free(cp);
- if (result) {
- fclose(fp);
- return result;
- }
- break;
+ /* Does it have a Mime-Version header? */
+ if (mh_strcasecmp(name, VRSN_FIELD)==0) {
+ fclose(fp);
+ return 1;
}
- /*
- ** Check Content-Transfer-Encoding field
- */
- if (!mh_strcasecmp(name, ENCODING_FIELD)) {
- cp = getcpy(buf);
- while (state == FLDPLUS) {
- state = m_getfld(state, name, buf,
- sizeof(buf), fp);
- cp = add(buf, cp);
- }
- for (bp = cp; isspace(*bp); bp++)
- continue;
- for (dp = bp; istoken(*dp); dp++)
- continue;
- *dp = '\0';
- result = (mh_strcasecmp(bp, "7bit")
- && mh_strcasecmp(bp, "8bit")
- && mh_strcasecmp(bp, "binary"));
-
- free(cp);
- if (result) {
- fclose(fp);
- return result;
- }
- break;
- }
-
- /*
- ** Just skip the rest of this header
- ** field and go to next one.
- */
- while (state == FLDPLUS)
+ /* else skip the rest of this header field and go on */
+ while (state == FLDPLUS) {
state = m_getfld(state, name, buf, sizeof(buf),
fp);
+ }
break;
- /*
- ** We've passed the message header,
- ** so message is just text.
- */
default:
+ /* We've passed the header, so message is just text */
fclose(fp);
return 0;
}