From 7b4682fe054f605f05e6d38033188b5961aac096 Mon Sep 17 00:00:00 2001 From: markus schnalke Date: Wed, 11 Apr 2012 11:07:59 +0200 Subject: [PATCH] show: Fixed -checkmime for msgs. Only check for MIME-Version header from now on. --- uip/show.c | 180 ++++++++---------------------------------------------------- 1 file changed, 22 insertions(+), 158 deletions(-) diff --git a/uip/show.c b/uip/show.c index a0178fe..34fa826 100644 --- a/uip/show.c +++ b/uip/show.c @@ -37,7 +37,7 @@ static struct swit switches[] = { /* ** static prototypes */ -static int is_nontext(char *); +static int is_mime(char *); #define SHOW 0 #define NEXT 1 @@ -228,22 +228,22 @@ go_to_it: ; /* check if any messages are non-text MIME messages */ if (checkmime) { if (file) { - /* check the file for MIME */ - if (is_nontext(vec[vecp - 1])) { + if (is_mime(vec[vecp - 1])) { mime = 1; } } else { - /* - ** 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))) { + msgnum++) { + if (!is_selected(mp, msgnum)) { + continue; + } + snprintf(buf, sizeof buf, "%s/%d", + toabsdir(folder), msgnum); + if (is_mime(buf)) { mime = 1; break; } + } } } @@ -279,174 +279,38 @@ go_to_it: ; } /* -** 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 = 1; - char c; - - cp = getcpy(buf); - while (state == FLDPLUS) { - state = m_getfld(state, name, buf, - sizeof(buf), fp); - cp = add(buf, cp); - } - bp = cp; - -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, "text") != 0))) { - *dp = c; - bp = dp; - passno = 2; - goto again; - } - } else { - 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)); - } -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; } -- 1.7.10.4