#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"
* This routine assumes that `h' has been initialized to 0. the `timezone'
* field is optional, defaulting to +0000 if missing.
*/
-time_t mutt_parse_date (const char *s, HEADER * h)
+time_t mutt_parse_date(const char *s, HEADER *h)
{
- int count = 0;
- char *t;
- int hour, min, sec;
- struct tm tm;
- int i;
- int tz_offset = 0;
- int zhours = 0;
- int zminutes = 0;
- int zoccident = 0;
- const char *ptz;
- char tzstr[SHORT_STRING];
- char scratch[SHORT_STRING];
-
- /* Don't modify our argument. Fixed-size buffer is ok here since
- * the date format imposes a natural limit.
- */
-
- m_strcpy(scratch, sizeof(scratch), s);
-
- /* kill the day of the week, if it exists. */
- if ((t = strchr (scratch, ',')))
- t++;
- else
- t = scratch;
- t = vskipspaces(t);
-
- p_clear(&tm, 1);
-
- while ((t = strtok (t, " \t")) != NULL) {
- switch (count) {
- case 0: /* day of the month */
- if (!isdigit ((unsigned char) *t))
- return (-1);
- tm.tm_mday = atoi (t);
- if (tm.tm_mday > 31)
- return (-1);
- break;
-
- case 1: /* month of the year */
- if ((i = mutt_check_month (t)) < 0)
- return (-1);
- tm.tm_mon = i;
- break;
-
- case 2: /* year */
- tm.tm_year = atoi (t);
- if (tm.tm_year < 50)
- tm.tm_year += 100;
- else if (tm.tm_year >= 1900)
- tm.tm_year -= 1900;
- break;
-
- case 3: /* time of day */
- if (sscanf (t, "%d:%d:%d", &hour, &min, &sec) == 3);
- else if (sscanf (t, "%d:%d", &hour, &min) == 2)
- sec = 0;
- else {
- debug_print (1, ("could not process time format: %s\n", t));
- return (-1);
- }
- tm.tm_hour = hour;
- tm.tm_min = min;
- tm.tm_sec = sec;
- break;
-
- case 4: /* timezone */
- /* sometimes we see things like (MST) or (-0700) so attempt to
- * compensate by uncommenting the string if non-RFC822 compliant
- */
- ptz = uncomment_timezone (tzstr, sizeof (tzstr), t);
-
- if (*ptz == '+' || *ptz == '-') {
- if (ptz[1] && ptz[2] && ptz[3] && ptz[4]
- && isdigit ((unsigned char) ptz[1])
- && isdigit ((unsigned char) ptz[2])
- && isdigit ((unsigned char) ptz[3])
- && isdigit ((unsigned char) ptz[4])) {
- zhours = (ptz[1] - '0') * 10 + (ptz[2] - '0');
- zminutes = (ptz[3] - '0') * 10 + (ptz[4] - '0');
-
- if (ptz[0] == '-')
- zoccident = 1;
- }
- }
- else {
- struct tz_t *tz;
-
- tz = bsearch (ptz, TimeZones, sizeof TimeZones / sizeof (struct tz_t),
- sizeof (struct tz_t),
- (int (*)(const void *, const void *)) ascii_strcasecmp
- /* This is safe to do: A pointer to a struct equals
- * a pointer to its first element*/ );
-
- if (tz) {
- zhours = tz->zhours;
- zminutes = tz->zminutes;
- zoccident = tz->zoccident;
- }
+ int zhours = 0, zminutes = 0, zoccident = 0;
+ char scratch[SHORT_STRING];
+ struct tm tm;
+ int count = 0;
+ char *p;
- /* ad hoc support for the European MET (now officially CET) TZ */
- if (ascii_strcasecmp (t, "MET") == 0) {
- if ((t = strtok (NULL, " \t")) != NULL) {
- if (!ascii_strcasecmp (t, "DST"))
- zhours++;
- }
- }
- }
- tz_offset = zhours * 3600 + zminutes * 60;
- if (!zoccident)
- tz_offset = -tz_offset;
- break;
- }
- count++;
- t = 0;
- }
+ /* Don't modify our argument. Fixed-size buffer is ok here since
+ the date format imposes a natural limit. */
- if (count < 4) { /* don't check for missing timezone */
- debug_print (1, ("error parsing date format, using received time\n"));
- return (-1);
- }
+ m_strcpy(scratch, sizeof(scratch), s);
- if (h) {
- h->zhours = zhours;
- h->zminutes = zminutes;
- h->zoccident = zoccident;
- }
+ /* kill the day of the week, if it exists. */
+ p = strchr(scratch, ',');
+ p = vskipspaces(p ? p + 1 : scratch);
- return (mutt_mktime (&tm, 0) + tz_offset);
-}
+ p_clear(&tm, 1);
-/* extract the first substring that looks like a message-id */
-static char *extract_message_id(const char *s)
-{
- const char *p;
+ while ((p = strtok (p, " \t")) != NULL) {
+ char tzstr[SHORT_STRING];
+ const char *ptz;
- if ((s = strchr(s, '<')) == NULL || (p = strchr(s, '>')) == NULL)
- return NULL;
- return p_dupstr(s, (p - s) + 1);
-}
+ switch (count) {
+ case 0: /* day of the month */
+ if (!isdigit((unsigned char)*p))
+ return -1;
+ tm.tm_mday = atoi(p);
+ if (tm.tm_mday > 31)
+ return -1;
+ break;
-void mutt_parse_mime_message (CONTEXT * ctx, HEADER * cur)
-{
- MESSAGE *msg;
- int flags = 0;
+ case 1: /* month of the year */
+ tm.tm_mon = mutt_check_month(p);
+ if (tm.tm_mon < 0)
+ return -1;
+ break;
+
+ case 2: /* year */
+ tm.tm_year = atoi(p);
+ if (tm.tm_year < 50)
+ tm.tm_year += 100;
+ else if (tm.tm_year >= 1900)
+ tm.tm_year -= 1900;
+ break;
+
+ case 3: /* time of day */
+ tm.tm_hour = strtol(p, &p, 10);
+ if (*p++ != ':')
+ return -1;
+ tm.tm_min = strtol(p, &p, 10);
+ if (*p++ == ':') {
+ tm.tm_sec = strtol(p, &p, 10);
+ } else {
+ tm.tm_sec = 0;
+ }
+ break;
- do {
- if (cur->content->type != TYPEMESSAGE
- && cur->content->type != TYPEMULTIPART)
- break; /* nothing to do */
+ case 4: /* timezone */
+ /* sometimes we see things like (MST) or (-0700) so attempt to
+ * compensate by uncommenting the string if non-RFC822 compliant
+ */
+ ptz = uncomment_timezone(tzstr, sizeof(tzstr), p);
+
+ if (*ptz == '+' || *ptz == '-') {
+ if (isdigit((unsigned char)ptz[1])
+ && isdigit((unsigned char)ptz[2])
+ && isdigit((unsigned char)ptz[3])
+ && isdigit((unsigned char)ptz[4]))
+ {
+ zoccident = ptz[0] == '-';
+ zhours = (ptz[1] - '0') * 10 + (ptz[2] - '0');
+ zminutes = (ptz[3] - '0') * 10 + (ptz[4] - '0');
+ }
+ } else {
+ struct tz_t *tz;
+
+ /* This is safe to do: A pointer to a struct equals a pointer to its
+ * first element*/
+ tz = bsearch(ptz, TimeZones, countof(TimeZones), sizeof(TimeZones[0]),
+ (int (*)(const void *, const void *))ascii_strcasecmp);
- if (cur->content->parts)
- break; /* The message was parsed earlier. */
+ if (tz) {
+ zhours = tz->zhours;
+ zminutes = tz->zminutes;
+ zoccident = tz->zoccident;
+ }
- if ((msg = mx_open_message (ctx, cur->msgno))) {
- mutt_parse_part (msg->fp, cur->content);
+ /* ad hoc support for the European MET (now officially CET) TZ */
+ if (ascii_strcasecmp(p, "MET") == 0) {
+ if ((p = strtok (NULL, " \t")) && !ascii_strcasecmp(p, "DST")) {
+ zhours++;
+ }
+ }
+ }
+ break;
+ }
+ count++;
+ p = NULL;
+ }
- cur->security = crypt_query (cur->content);
+ if (count < 4) { /* don't check for missing timezone */
+ debug_print (1, ("error parsing date format, using received time\n"));
+ return -1;
+ }
- mx_close_message (&msg);
+ if (h) {
+ h->zhours = zhours;
+ h->zminutes = zminutes;
+ h->zoccident = zoccident;
}
- } while (0);
- mutt_count_body_parts (cur, flags | M_PARTS_RECOUNT);
+
+ return mutt_mktime(&tm, 0) + (zoccident ? 1 : -1) * (zhours * 3600 + zminutes * 60);
}
-int mutt_parse_rfc822_line (ENVELOPE * e, HEADER * hdr, char *line, char *p,
+#include "rfc822hdrs.h"
+
+void mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
short user_hdrs, short weed, short do_2047,
- LIST ** lastp)
+ LIST **lastp)
{
- int matched = 0;
- LIST *last = NULL;
+ switch (rfc822_well_known(line)) {
+ case HDR_APPARENTLY_FROM:
+ e->from = rfc822_parse_adrlist (e->from, p);
+ break;
- if (lastp)
- last = *lastp;
+ case HDR_APPARENTLY_TO:
+ e->to = rfc822_parse_adrlist (e->to, p);
+ 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_BCC:
+ e->bcc = rfc822_parse_adrlist (e->bcc, p);
+ break;
- case 'b':
- if (ascii_strcasecmp (line + 1, "cc") == 0) {
- e->bcc = rfc822_parse_adrlist (e->bcc, p);
- matched = 1;
- }
- break;
+ case HDR_CC:
+ e->cc = rfc822_parse_adrlist (e->cc, p);
+ break;
- 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) {
+ case HDR_CONTENT_DESCRIPTION:
if (hdr) {
- if ((hdr->content->length = atoi (p)) < 0)
- hdr->content->length = -1;
+ m_strreplace(&hdr->content->description, p);
+ rfc2047_decode(&hdr->content->description);
}
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 8, "description") == 0) {
+ break;
+
+ case HDR_CONTENT_DISPOSITION:
+ if (hdr)
+ parse_content_disposition(p, hdr->content);
+ break;
+
+ case HDR_CONTENT_LENGTH:
if (hdr) {
- m_strreplace(&hdr->content->description, p);
- rfc2047_decode (&hdr->content->description);
+ if ((hdr->content->length = atoi(p)) < 0)
+ hdr->content->length = -1;
}
- matched = 1;
- }
- else if (ascii_strcasecmp (line + 8, "disposition") == 0) {
+ break;
+
+ case HDR_CONTENT_TRANSFER_ENCODING:
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->content->encoding = mutt_check_encoding(p);
+ break;
+
+ case HDR_CONTENT_TYPE:
+ if (hdr)
+ mutt_parse_content_type (p, hdr->content);
+ break;
+
+ case HDR_DATE:
+ m_strreplace(&e->date, p);
+ if (hdr)
+ hdr->date_sent = mutt_parse_date (p, hdr);
+ break;
+
+ case HDR_EXPIRES:
+ if (hdr && mutt_parse_date (p, NULL) < time (NULL))
+ hdr->expired = 1;
+ break;
+
#ifdef USE_NNTP
- else if (!m_strcasecmp(line + 1, "ollowup-to")) {
- if (!e->followup_to) {
- m_strrtrim(p);
- e->followup_to = m_strdup(skipspaces(p));
- }
- matched = 1;
- }
+ case HDR_FOLLOWUP_TO:
+ if (!e->followup_to) {
+ m_strrtrim(p);
+ e->followup_to = 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_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);
+ }
+ break;
- case 'l':
- if (!ascii_strcasecmp (line + 1, "ines")) {
- if (hdr) {
- hdr->lines = atoi (p);
+ case HDR_IN_REPLY_TO:
+ mutt_free_list(&e->in_reply_to);
+ e->in_reply_to = mutt_parse_references(p, 1);
+ 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_LINES:
+ if (hdr) {
+ /* HACK - mutt has, for a very short time, produced negative
+ Lines header values. Ignore them. */
+ hdr->lines = MAX(0, atoi(p));
+ }
+ 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_LIST_POST:
+ /* RFC 2369. FIXME: We should ignore whitespace, but don't. */
+ if (strncmp(p, "NO", 2)) {
+ char *beg, *end;
- /* 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;
- }
+ 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;
+ }
+ }
}
- }
- 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 */
+ 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);
- 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;
+ 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)
+ hdr->mime = 1;
+ 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;
+ case HDR_NEWSGROUPS:
+ p_delete(&e->newsgroups);
+ m_strrtrim(p);
+ e->newsgroups = m_strdup(skipspaces(p));
+ break;
#endif
- 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_ORGANIZATION:
+ if (!e->organization && m_strcasecmp(p, "unknown"))
+ e->organization = m_strdup(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, ';');
+ case HDR_RECEIVED:
+ if (hdr && !hdr->received) {
+ char *d = strchr(p, ';');
+ if (d)
+ hdr->received = mutt_parse_date(d + 1, NULL);
+ }
+ break;
- if (d)
- hdr->received = mutt_parse_date (d + 1, NULL);
- }
- }
- break;
+ case HDR_REFERENCES:
+ mutt_free_list(&e->references);
+ e->references = mutt_parse_references(p, 0);
+ 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++;
+ case HDR_REPLY_TO:
+ e->reply_to = rfc822_parse_adrlist(e->reply_to, p);
+ 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;
- }
- else if (ascii_strcasecmp (line + 1, "-label") == 0) {
- e->x_label = m_strdup(p);
- matched = 1;
- }
+ break;
+
+ case HDR_SUBJECT:
+ if (!e->subject)
+ e->subject = m_strdup(p);
+ break;
+
+ case HDR_SUPERCEDES:
+ case HDR_SUPERSEDES:
+ if (hdr)
+ e->supersedes = m_strdup(p);
+ break;
+
+ case HDR_TO:
+ e->to = rfc822_parse_adrlist(e->to, p);
+ break;
+
#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_X_COMMENT_TO:
+ if (!e->x_comment_to)
+ e->x_comment_to = m_strdup(p);
+ break;
#endif
- default:
- break;
- }
+ case HDR_X_LABEL:
+ e->x_label = m_strdup(p);
+ break;
- /* Keep track of the user-defined headers */
- if (!matched && user_hdrs) {
- /* restore the original line */
- line[m_strlen(line)] = ':';
+#ifdef USE_NNTP
+ case HDR_XREF:
+ if (!e->xref)
+ e->xref = m_strdup(p);
+ break;
+#endif
- if (weed && option (OPTWEED) && mutt_matches_ignore (line, Ignore)
- && !mutt_matches_ignore (line, UnIgnore))
- goto done;
+ 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;
- 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);
- }
+ default:
+ if (!user_hdrs) {
+ return;
+ }
+ /* restore the original line */
+ line[m_strlen(line)] = ':';
-done:
+ if (weed && option(OPTWEED) && mutt_matches_ignore(line, Ignore)
+ && !mutt_matches_ignore(line, UnIgnore)) {
+ return;
+ }
+
+ if (*lastp) {
+ (*lastp)->next = mutt_new_list();
+ (*lastp) = (*lastp)->next;
+ } else {
+ (*lastp) = e->userhdrs = mutt_new_list ();
+ }
- *lastp = last;
- return matched;
+ (*lastp)->data = m_strdup(line);
+ if (do_2047)
+ rfc2047_decode(&(*lastp)->data);
+ }
}
+/*** XXX: MC READ MARK ***/
+
+
/* mutt_read_rfc822_header() -- parses a RFC822 header
*
char *line = p_new(char, LONG_STRING);
char *p;
off_t loc;
- int matched;
ssize_t linelen = LONG_STRING;
char buf[LONG_STRING + 1];
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;
if (!*p)
continue; /* skip empty header fields */
- matched =
- mutt_parse_rfc822_line (e, hdr, line, p, user_hdrs, weed, 1, &last);
-
+ mutt_parse_rfc822_line (e, hdr, line, p, user_hdrs, weed, 1, &last);
}
p_delete(&line);