#include <lib-lib/buffer.h>
#include <lib-lib/date.h>
-#include <lib-crypt/crypt.h>
-
#include "recvattach.h"
-#include "mx.h"
#include "url.h"
#include "lib/debug.h"
*/
time_t mutt_parse_date(const char *s, HEADER *h)
{
- int count = 0;
- char *p;
- struct tm tm;
- int tz_offset = 0;
int zhours = 0, zminutes = 0, zoccident = 0;
- const char *ptz;
- char tzstr[SHORT_STRING];
char scratch[SHORT_STRING];
+ struct tm tm;
+ int count = 0;
+ char *p;
/* Don't modify our argument. Fixed-size buffer is ok here since
the date format imposes a natural limit. */
p_clear(&tm, 1);
while ((p = strtok (p, " \t")) != NULL) {
+ char tzstr[SHORT_STRING];
+ const char *ptz;
+
switch (count) {
case 0: /* day of the month */
if (!isdigit((unsigned char)*p))
}
}
}
-
- tz_offset = zhours * 3600 + zminutes * 60;
- if (!zoccident)
- tz_offset = -tz_offset;
break;
}
count++;
h->zoccident = zoccident;
}
- return mutt_mktime(&tm, 0) + tz_offset;
+ return mutt_mktime(&tm, 0) + (zoccident ? 1 : -1) * (zhours * 3600 + zminutes * 60);
}
-/*** XXX: MC READ MARK ***/
+#include "rfc822hdrs.h"
-/* extract the first substring that looks like a message-id */
-static char *extract_message_id(const char *s)
+LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
+ short weed, short do_2047, LIST **user_hdrs)
{
- const char *p;
+ switch (rfc822_well_known(line)) {
+ case HDR_APPARENTLY_FROM:
+ e->from = rfc822_parse_adrlist (e->from, p);
+ break;
- if ((s = strchr(s, '<')) == NULL || (p = strchr(s, '>')) == NULL)
- return NULL;
- return p_dupstr(s, (p - s) + 1);
-}
+ case HDR_APPARENTLY_TO:
+ e->to = rfc822_parse_adrlist (e->to, p);
+ break;
-void mutt_parse_mime_message (CONTEXT * ctx, HEADER * cur)
-{
- MESSAGE *msg;
- int flags = 0;
+ case HDR_BCC:
+ e->bcc = rfc822_parse_adrlist (e->bcc, p);
+ break;
- do {
- if (cur->content->type != TYPEMESSAGE
- && cur->content->type != TYPEMULTIPART)
- break; /* nothing to do */
+ case HDR_CC:
+ e->cc = rfc822_parse_adrlist (e->cc, p);
+ break;
- if (cur->content->parts)
- break; /* The message was parsed earlier. */
+ case HDR_CONTENT_DESCRIPTION:
+ if (hdr) {
+ m_strreplace(&hdr->content->description, p);
+ rfc2047_decode(&hdr->content->description);
+ }
+ break;
- if ((msg = mx_open_message (ctx, cur->msgno))) {
- mutt_parse_part (msg->fp, cur->content);
+ case HDR_CONTENT_DISPOSITION:
+ if (hdr)
+ parse_content_disposition(p, hdr->content);
+ break;
- cur->security = crypt_query (cur->content);
+ case HDR_CONTENT_LENGTH:
+ if (hdr) {
+ if ((hdr->content->length = atoi(p)) < 0)
+ hdr->content->length = -1;
+ }
+ break;
- mx_close_message (&msg);
- }
- } while (0);
- mutt_count_body_parts (cur, flags | M_PARTS_RECOUNT);
-}
+ case HDR_CONTENT_TRANSFER_ENCODING:
+ if (hdr)
+ hdr->content->encoding = mutt_check_encoding(p);
+ break;
-int mutt_parse_rfc822_line (ENVELOPE * e, HEADER * hdr, char *line, char *p,
- short user_hdrs, short weed, short do_2047,
- LIST ** lastp)
-{
- int matched = 0;
- LIST *last = NULL;
+ case HDR_CONTENT_TYPE:
+ if (hdr)
+ mutt_parse_content_type (p, hdr->content);
+ break;
- if (lastp)
- last = *lastp;
+ case HDR_DATE:
+ m_strreplace(&e->date, p);
+ if (hdr)
+ hdr->date_sent = mutt_parse_date (p, hdr);
+ break;
- switch (ascii_tolower (line[0])) {
- case 'a':
- if (ascii_strcasecmp (line + 1, "pparently-to") == 0) {
- e->to = rfc822_parse_adrlist (e->to, p);
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 1, "pparently-from") == 0) {
- e->from = rfc822_parse_adrlist (e->from, p);
- matched = 1;
- }
- break;
+ case HDR_EXPIRES:
+ if (hdr && mutt_parse_date (p, NULL) < time (NULL))
+ hdr->expired = 1;
+ break;
- case 'b':
- if (ascii_strcasecmp (line + 1, "cc") == 0) {
- e->bcc = rfc822_parse_adrlist (e->bcc, p);
- matched = 1;
- }
- break;
+#ifdef USE_NNTP
+ case HDR_FOLLOWUP_TO:
+ if (!e->followup_to) {
+ m_strrtrim(p);
+ e->followup_to = m_strdup(skipspaces(p));
+ }
+ break;
+#endif
- case 'c':
- if (ascii_strcasecmp (line + 1, "c") == 0) {
- e->cc = rfc822_parse_adrlist (e->cc, p);
- matched = 1;
- }
- else if (ascii_strncasecmp (line + 1, "ontent-", 7) == 0) {
- if (ascii_strcasecmp (line + 8, "type") == 0) {
- if (hdr)
- mutt_parse_content_type (p, hdr->content);
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 8, "transfer-encoding") == 0) {
- if (hdr)
- hdr->content->encoding = mutt_check_encoding (p);
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 8, "length") == 0) {
- if (hdr) {
- if ((hdr->content->length = atoi (p)) < 0)
- hdr->content->length = -1;
+ case HDR_FROM:
+ e->from = rfc822_parse_adrlist(e->from, p);
+ /* don't leave from info NULL if there's an invalid address (or
+ * whatever) in From: field; mutt would just display it as empty
+ * and mark mail/(esp.) news article as your own. aaargh! this
+ * bothered me for _years_ */
+ if (!e->from) {
+ e->from = address_new();
+ e->from->personal = m_strdup(p);
}
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 8, "description") == 0) {
+ break;
+
+ case HDR_IN_REPLY_TO:
+ mutt_free_list(&e->in_reply_to);
+ e->in_reply_to = mutt_parse_references(p, 1);
+ break;
+
+ case HDR_LINES:
if (hdr) {
- m_strreplace(&hdr->content->description, p);
- rfc2047_decode (&hdr->content->description);
+ /* HACK - mutt has, for a very short time, produced negative
+ Lines header values. Ignore them. */
+ hdr->lines = MAX(0, atoi(p));
}
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 8, "disposition") == 0) {
+ break;
+
+ case HDR_LIST_POST:
+ /* RFC 2369. FIXME: We should ignore whitespace, but don't. */
+ if (strncmp(p, "NO", 2)) {
+ char *beg, *end;
+
+ for (beg = strchr (p, '<'); beg; beg = strchr (end, ',')) {
+ ++beg;
+ if (!(end = strchr (beg, '>')))
+ break;
+
+ /* Take the first mailto URL */
+ if (url_check_scheme (beg) == U_MAILTO) {
+ p_delete(&e->list_post);
+ e->list_post = p_dupstr(beg, end - beg);
+ break;
+ }
+ }
+ }
+ break;
+
+ case HDR_MAIL_FOLLOWUP_TO:
+ e->mail_followup_to = rfc822_parse_adrlist(e->mail_followup_to, p);
+ break;
+
+ case HDR_MAIL_REPLY_TO:
+ address_delete (&e->reply_to);
+ e->reply_to = rfc822_parse_adrlist(e->reply_to, p);
+ break;
+
+ case HDR_MESSAGE_ID:
+ {
+ const char *beg, *end;
+
+ /* We add a new "Message-ID:" when building a message */
+ p_delete(&e->message_id);
+
+ if ((beg = strchr(p, '<')) && (end = strchr(beg, '>')))
+ e->message_id = p_dupstr(beg, (end - beg) + 1);
+ }
+ break;
+
+ case HDR_MIME_VERSION:
if (hdr)
- parse_content_disposition (p, hdr->content);
- matched = 1;
- }
- }
- break;
-
- case 'd':
- if (!ascii_strcasecmp ("ate", line + 1)) {
- m_strreplace(&e->date, p);
- if (hdr)
- hdr->date_sent = mutt_parse_date (p, hdr);
- matched = 1;
- }
- break;
-
- case 'e':
- if (!ascii_strcasecmp ("xpires", line + 1) &&
- hdr && mutt_parse_date (p, NULL) < time (NULL))
- hdr->expired = 1;
- break;
-
- case 'f':
- if (!ascii_strcasecmp ("rom", line + 1)) {
- e->from = rfc822_parse_adrlist (e->from, p);
- /* don't leave from info NULL if there's an invalid address (or
- * whatever) in From: field; mutt would just display it as empty
- * and mark mail/(esp.) news article as your own. aaargh! this
- * bothered me for _years_ */
- if (!e->from) {
- e->from = address_new ();
- e->from->personal = m_strdup(p);
- }
- matched = 1;
- }
+ hdr->mime = 1;
+ break;
+
#ifdef USE_NNTP
- else if (!m_strcasecmp(line + 1, "ollowup-to")) {
- if (!e->followup_to) {
+ case HDR_NEWSGROUPS:
+ p_delete(&e->newsgroups);
m_strrtrim(p);
- e->followup_to = m_strdup(skipspaces(p));
- }
- matched = 1;
- }
+ e->newsgroups = m_strdup(skipspaces(p));
+ break;
#endif
- break;
- case 'i':
- if (!ascii_strcasecmp (line + 1, "n-reply-to")) {
- mutt_free_list (&e->in_reply_to);
- e->in_reply_to = mutt_parse_references (p, 1);
- matched = 1;
- }
- break;
+ case HDR_ORGANIZATION:
+ if (!e->organization && m_strcasecmp(p, "unknown"))
+ e->organization = m_strdup(p);
+ break;
- case 'l':
- if (!ascii_strcasecmp (line + 1, "ines")) {
- if (hdr) {
- hdr->lines = atoi (p);
+ case HDR_RECEIVED:
+ if (hdr && !hdr->received) {
+ char *d = strchr(p, ';');
+ if (d)
+ hdr->received = mutt_parse_date(d + 1, NULL);
+ }
+ break;
- /*
- * HACK - mutt has, for a very short time, produced negative
- * Lines header values. Ignore them.
- */
- if (hdr->lines < 0)
- hdr->lines = 0;
- }
+ case HDR_REFERENCES:
+ mutt_free_list(&e->references);
+ e->references = mutt_parse_references(p, 0);
+ break;
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 1, "ist-Post")) {
- /* RFC 2369. FIXME: We should ignore whitespace, but don't. */
- if (strncmp (p, "NO", 2)) {
- char *beg, *end;
-
- for (beg = strchr (p, '<'); beg; beg = strchr (end, ',')) {
- ++beg;
- if (!(end = strchr (beg, '>')))
- break;
+ case HDR_REPLY_TO:
+ e->reply_to = rfc822_parse_adrlist(e->reply_to, p);
+ break;
- /* Take the first mailto URL */
- if (url_check_scheme (beg) == U_MAILTO) {
- p_delete(&e->list_post);
- e->list_post = p_dupstr(beg, end - beg);
- break;
- }
+ case HDR_RETURN_PATH:
+ e->return_path = rfc822_parse_adrlist(e->return_path, p);
+ break;
+
+ case HDR_SENDER:
+ e->sender = rfc822_parse_adrlist (e->sender, p);
+ break;
+
+ case HDR_STATUS:
+ if (hdr) {
+ while (*p) {
+ switch (*p) {
+ case 'r':
+ hdr->replied = 1;
+ break;
+ case 'O':
+ hdr->old = 1;
+ break;
+ case 'R':
+ hdr->read = 1;
+ break;
+ }
+ p++;
+ }
}
- }
- matched = 1;
- }
- break;
+ break;
- case 'm':
- if (!ascii_strcasecmp (line + 1, "ime-version")) {
- if (hdr)
- hdr->mime = 1;
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 1, "essage-id")) {
- /* We add a new "Message-ID:" when building a message */
- p_delete(&e->message_id);
- e->message_id = extract_message_id (p);
- matched = 1;
- }
- else if (!ascii_strncasecmp (line + 1, "ail-", 4)) {
- if (!ascii_strcasecmp (line + 5, "reply-to")) {
- /* override the Reply-To: field */
- address_delete (&e->reply_to);
- e->reply_to = rfc822_parse_adrlist (e->reply_to, p);
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 5, "followup-to")) {
- e->mail_followup_to = rfc822_parse_adrlist (e->mail_followup_to, p);
- matched = 1;
- }
- }
- break;
+ case HDR_SUBJECT:
+ if (!e->subject)
+ e->subject = m_strdup(p);
+ break;
-#ifdef USE_NNTP
- case 'n':
- if (!m_strcasecmp(line + 1, "ewsgroups")) {
- p_delete(&e->newsgroups);
- m_strrtrim(p);
- e->newsgroups = m_strdup(skipspaces(p));
- matched = 1;
- }
- break;
-#endif
+ case HDR_SUPERCEDES:
+ case HDR_SUPERSEDES:
+ if (hdr)
+ e->supersedes = m_strdup(p);
+ break;
- case 'o':
- /* field `Organization:' saves only for pager! */
- if (!m_strcasecmp(line + 1, "rganization")) {
- if (!e->organization && m_strcasecmp(p, "unknown"))
- e->organization = m_strdup(p);
- }
- break;
+ case HDR_TO:
+ e->to = rfc822_parse_adrlist(e->to, p);
+ break;
- case 'r':
- if (!ascii_strcasecmp (line + 1, "eferences")) {
- mutt_free_list (&e->references);
- e->references = mutt_parse_references (p, 0);
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 1, "eply-to")) {
- e->reply_to = rfc822_parse_adrlist (e->reply_to, p);
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 1, "eturn-path")) {
- e->return_path = rfc822_parse_adrlist (e->return_path, p);
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 1, "eceived")) {
- if (hdr && !hdr->received) {
- char *d = strchr (p, ';');
+#ifdef USE_NNTP
+ case HDR_X_COMMENT_TO:
+ if (!e->x_comment_to)
+ e->x_comment_to = m_strdup(p);
+ break;
+#endif
- if (d)
- hdr->received = mutt_parse_date (d + 1, NULL);
- }
- }
- break;
+ case HDR_X_LABEL:
+ e->x_label = m_strdup(p);
+ break;
- case 's':
- if (!ascii_strcasecmp (line + 1, "ubject")) {
- if (!e->subject)
- e->subject = m_strdup(p);
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 1, "ender")) {
- e->sender = rfc822_parse_adrlist (e->sender, p);
- matched = 1;
- }
- else if (!ascii_strcasecmp (line + 1, "tatus")) {
- if (hdr) {
- while (*p) {
- switch (*p) {
- case 'r':
- hdr->replied = 1;
- break;
- case 'O':
- hdr->old = 1;
- break;
- case 'R':
- hdr->read = 1;
- break;
- }
- p++;
- }
- }
- matched = 1;
- }
- else if ((!ascii_strcasecmp ("upersedes", line + 1) ||
- !ascii_strcasecmp ("upercedes", line + 1)) && hdr)
- e->supersedes = m_strdup(p);
- break;
-
- case 't':
- if (ascii_strcasecmp (line + 1, "o") == 0) {
- e->to = rfc822_parse_adrlist (e->to, p);
- matched = 1;
- }
- break;
-
- case 'x':
- if (ascii_strcasecmp (line + 1, "-status") == 0) {
- if (hdr) {
- while (*p) {
- switch (*p) {
- case 'A':
- hdr->replied = 1;
- break;
- case 'D':
- hdr->deleted = 1;
- break;
- case 'F':
- hdr->flagged = 1;
- break;
- default:
- break;
- }
- p++;
- }
- }
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 1, "-label") == 0) {
- e->x_label = m_strdup(p);
- matched = 1;
- }
#ifdef USE_NNTP
- else if (!m_strcasecmp(line + 1, "-comment-to")) {
- if (!e->x_comment_to)
- e->x_comment_to = m_strdup(p);
- matched = 1;
- }
- else if (!m_strcasecmp(line + 1, "ref")) {
- if (!e->xref)
- e->xref = m_strdup(p);
- matched = 1;
- }
+ case HDR_XREF:
+ if (!e->xref)
+ e->xref = m_strdup(p);
+ break;
#endif
- default:
- break;
- }
+ case HDR_X_STATUS:
+ if (hdr) {
+ while (*p) {
+ switch (*p) {
+ case 'A':
+ hdr->replied = 1;
+ break;
+ case 'D':
+ hdr->deleted = 1;
+ break;
+ case 'F':
+ hdr->flagged = 1;
+ break;
+ default:
+ break;
+ }
+ p++;
+ }
+ }
+ break;
- /* Keep track of the user-defined headers */
- if (!matched && user_hdrs) {
- /* restore the original line */
- line[m_strlen(line)] = ':';
+ default:
+ if (!user_hdrs)
+ break;
- if (weed && option (OPTWEED) && mutt_matches_ignore (line, Ignore)
- && !mutt_matches_ignore (line, UnIgnore))
- goto done;
+ /* restore the original line */
+ line[m_strlen(line)] = ':';
- if (last) {
- last->next = mutt_new_list ();
- last = last->next;
- }
- else
- last = e->userhdrs = mutt_new_list ();
- last->data = m_strdup(line);
- if (do_2047)
- rfc2047_decode (&last->data);
- }
+ if (weed && option(OPTWEED) && mutt_matches_ignore(line, Ignore)
+ && !mutt_matches_ignore(line, UnIgnore)) {
+ break;
+ }
-done:
+ *user_hdrs = mutt_new_list();
+ (*user_hdrs)->data = m_strdup(line);
+ if (do_2047)
+ rfc2047_decode(&(*user_hdrs)->data);
+ (*user_hdrs)->next = mutt_new_list();
+ return &(*user_hdrs)->next;
+ }
- *lastp = last;
- return matched;
+ return user_hdrs;
}
-
/* mutt_read_rfc822_header() -- parses a RFC822 header
*
* Args:
* Returns: newly allocated envelope structure. You should free it by
* envelope_delete() when envelope stay unneeded.
*/
-ENVELOPE *mutt_read_rfc822_header (FILE * f, HEADER * hdr, short user_hdrs,
- short weed)
+ENVELOPE *
+mutt_read_rfc822_header(FILE *f, HEADER *hdr, short user_hdrs, short weed)
{
- ENVELOPE *e = envelope_new();
- LIST *last = NULL;
- char *line = p_new(char, LONG_STRING);
- char *p;
- off_t loc;
- int matched;
- ssize_t linelen = LONG_STRING;
- char buf[LONG_STRING + 1];
-
- if (hdr) {
- if (hdr->content == NULL) {
- hdr->content = mutt_new_body ();
-
- /* set the defaults from RFC1521 */
- hdr->content->type = TYPETEXT;
- hdr->content->subtype = m_strdup("plain");
- hdr->content->encoding = ENC7BIT;
- hdr->content->length = -1;
-
- /* RFC 2183 says this is arbitrary */
- hdr->content->disposition = DISPINLINE;
- }
- }
+ ENVELOPE *e = envelope_new();
+ LIST **last = user_hdrs ? &e->userhdrs : NULL;
- while ((loc = ftello (f)),
- mutt_read_rfc822_line (f, &line, &linelen))
- {
- matched = 0;
-
- if ((p = strpbrk (line, ": \t")) == NULL || *p != ':') {
- char return_path[LONG_STRING];
- time_t t;
-
- /* some bogus MTAs will quote the original "From " line */
- if (m_strncmp(">From ", line, 6) == 0)
- continue; /* just ignore */
- else if (is_from (line, return_path, sizeof (return_path), &t)) {
- /* MH somtimes has the From_ line in the middle of the header! */
- if (hdr && !hdr->received)
- hdr->received = t - mutt_local_tz (t);
- continue;
- }
+ char *line = p_new(char, LONG_STRING);
+ ssize_t linelen = LONG_STRING;
+ off_t loc;
+
+ if (hdr && !hdr->content) {
+ hdr->content = mutt_new_body ();
+
+ /* set the defaults from RFC1521 */
+ hdr->content->type = TYPETEXT;
+ hdr->content->subtype = m_strdup("plain");
+ hdr->content->encoding = ENC7BIT;
+ hdr->content->length = -1;
- fseeko (f, loc, 0);
- break; /* end of header */
+ /* RFC 2183 says this is arbitrary */
+ hdr->content->disposition = DISPINLINE;
}
- *buf = '\0';
-
- if (mutt_match_spam_list (line, SpamList, buf, sizeof (buf))) {
- if (!rx_list_match (NoSpamList, line)) {
-
- /* if spam tag already exists, figure out how to amend it */
- if (e->spam && *buf) {
- /* If SpamSep defined, append with separator */
- if (SpamSep) {
- mutt_buffer_addstr (e->spam, SpamSep);
- mutt_buffer_addstr (e->spam, buf);
- }
-
- /* else overwrite */
- else {
- e->spam->dptr = e->spam->data;
- *e->spam->dptr = '\0';
- mutt_buffer_addstr (e->spam, buf);
- }
- }
+ while ((loc = ftello(f)),
+ mutt_read_rfc822_line(f, &line, &linelen))
+ {
+ char buf[LONG_STRING + 1] = "";
+ char *p;
+
+ p = strpbrk(line, ": \t");
+ if (!p || *p != ':') {
+ char return_path[LONG_STRING];
+ time_t t;
+
+ /* some bogus MTAs will quote the original "From " line */
+ if (!m_strncmp(">From ", line, 6))
+ continue; /* just ignore */
+
+ if (is_from(line, return_path, sizeof(return_path), &t)) {
+ /* MH somtimes has the From_ line in the middle of the header! */
+ if (hdr && !hdr->received)
+ hdr->received = t - mutt_local_tz(t);
+ continue;
+ }
- /* spam tag is new, and match expr is non-empty; copy */
- else if (!e->spam && *buf) {
- e->spam = mutt_buffer_from (NULL, buf);
+ fseeko(f, loc, 0);
+ break; /* end of header */
}
- /* match expr is empty; plug in null string if no existing tag */
- else if (!e->spam) {
- e->spam = mutt_buffer_from (NULL, "");
+ if (mutt_match_spam_list(line, SpamList, buf, sizeof(buf))) {
+ if (!rx_list_match(NoSpamList, line)) {
+ /* if spam tag already exists, figure out how to amend it */
+ if (e->spam && *buf) {
+ if (SpamSep) {
+ /* If SpamSep defined, append with separator */
+ mutt_buffer_addstr(e->spam, SpamSep);
+ mutt_buffer_addstr(e->spam, buf);
+ } else {
+ /* else overwrite */
+ mutt_buffer_reset(e->spam);
+ mutt_buffer_addstr(e->spam, buf);
+ }
+ }
+ else if (!e->spam && *buf) {
+ /* spam tag is new, and match expr is non-empty; copy */
+ e->spam = mutt_buffer_from(NULL, buf);
+ }
+ else if (!e->spam) {
+ /* match expr is empty; plug in null string if no existing tag */
+ e->spam = mutt_buffer_from(NULL, "");
+ }
+ }
}
- if (e->spam && e->spam->data)
- debug_print (5, ("spam = %s\n", e->spam->data));
- }
- }
-
- *p++ = 0;
- p = vskipspaces(p);
- if (!*p)
- continue; /* skip empty header fields */
-
- matched =
- mutt_parse_rfc822_line (e, hdr, line, p, user_hdrs, weed, 1, &last);
+ *p++ = '\0';
+ p = vskipspaces(p);
+ if (!*p)
+ continue; /* skip empty header fields */
- }
-
- p_delete(&line);
-
- if (hdr) {
- hdr->content->hdr_offset = hdr->offset;
- hdr->content->offset = ftello (f);
- rfc2047_decode_envelope(e);
- /* check for missing or invalid date */
- if (hdr->date_sent <= 0) {
- debug_print (1, ("no date found, using received "
- "time from msg separator\n"));
- hdr->date_sent = hdr->received;
+ last = mutt_parse_rfc822_line(e, hdr, line, p, weed, 1, last);
}
- }
- return (e);
-}
+ p_delete(&line);
-address_t *mutt_parse_adrlist (address_t * p, const char *s)
-{
- const char *q;
-
- /* check for a simple whitespace separated list of addresses */
- if ((q = strpbrk (s, "\"<>():;,\\")) == NULL) {
- char tmp[HUGE_STRING];
- char *r;
-
- m_strcpy(tmp, sizeof(tmp), s);
- r = tmp;
- while ((r = strtok (r, " \t")) != NULL) {
- p = rfc822_parse_adrlist (p, r);
- r = NULL;
+ if (hdr) {
+ hdr->content->hdr_offset = hdr->offset;
+ hdr->content->offset = ftello(f);
+ rfc2047_decode_envelope(e);
+ /* check for missing or invalid date */
+ if (hdr->date_sent <= 0) {
+ debug_print(1, ("no date found, using received "
+ "time from msg separator\n"));
+ hdr->date_sent = hdr->received;
+ }
}
- }
- else
- p = rfc822_parse_adrlist (p, s);
- return p;
+ return e;
}
+/* -------------------- XXX: MC READ MARK ------------- */
/* Compares mime types to the ok and except lists */
-int count_body_parts_check(LIST **checklist, BODY *b, int dflt) {
- LIST *type;
- ATTACH_MATCH *a;
-
- /* If list is null, use default behavior. */
- if (! *checklist) {
- /*return dflt;*/
- return 0;
- }
-
- for (type = *checklist; type; type = type->next) {
- a = (ATTACH_MATCH *)type->data;
- debug_print(5, ("cbpc: %s %d/%s ?? %s/%s [%d]... ",
- dflt ? "[OK] " : "[EXCL] ",
- b->type, b->subtype, a->major, a->minor, a->major_int));
- if ((a->major_int == TYPEANY || a->major_int == b->type) &&
- !regexec(&a->minor_rx, b->subtype, 0, NULL, 0)) {
- debug_print(5, ("yes\n"));
- return 1;
- } else {
- debug_print(5, ("no\n"));
+static int count_body_parts_check(LIST **checklist, BODY *b, int dflt)
+{
+ LIST *type;
+ ATTACH_MATCH *a;
+
+ /* If list is null, use default behavior. */
+ if (!*checklist)
+ return 0;
+
+ for (type = *checklist; type; type = type->next) {
+ a = (ATTACH_MATCH *)type->data;
+ debug_print(5, ("cbpc: %s %d/%s ?? %s/%s [%d]... ",
+ dflt ? "[OK] " : "[EXCL] ",
+ b->type, b->subtype, a->major, a->minor, a->major_int));
+ if ((a->major_int == TYPEANY || a->major_int == b->type) &&
+ !regexec(&a->minor_rx, b->subtype, 0, NULL, 0)) {
+ debug_print(5, ("yes\n"));
+ return 1;
+ } else {
+ debug_print(5, ("no\n"));
+ }
}
- }
- return 0;
+ return 0;
}
#define AT_COUNT(why) { shallcount = 1; }