From: Thomas Roessler Date: Sat, 7 Dec 2002 08:53:21 +0000 (+0000) Subject: Gracefully handle unknown maildir flags. X-Git-Tag: mutt-1-5-3-rel~68 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5305d167f87565c4c79bf39d89fb735f17e73a04;p=mutt Gracefully handle unknown maildir flags. --- diff --git a/mh.c b/mh.c index 359f3652..77ea5f4d 100644 --- a/mh.c +++ b/mh.c @@ -493,7 +493,7 @@ static void maildir_free_maildir (struct maildir **md) static void maildir_parse_flags (HEADER * h, const char *path) { - char *p; + char *p, *q = NULL; h->flagged = 0; h->read = 0; @@ -502,6 +502,10 @@ static void maildir_parse_flags (HEADER * h, const char *path) if ((p = strrchr (path, ':')) != NULL && mutt_strncmp (p + 1, "2,", 2) == 0) { p += 3; + + mutt_str_replace (&h->maildir_flags, p); + q = h->maildir_flags; + while (*p) { switch (*p) @@ -525,10 +529,19 @@ static void maildir_parse_flags (HEADER * h, const char *path) h->trash = 1; h->deleted = 1; break; + + default: + *q++ = *p; + break; } p++; } } + + if (q == h->maildir_flags) + safe_free ((void **) &h->maildir_flags); + else if (q) + *q = '\0'; } static void maildir_update_mtime (CONTEXT * ctx) @@ -851,6 +864,11 @@ int mh_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) return mh_mkstemp (dest, &msg->fp, &msg->path); } +int ch_compar (const void *a, const void *b) +{ + return (int)( *((const char *) a) - *((const char *) b)); +} + static void maildir_flags (char *dest, size_t destlen, HEADER * hdr) { *dest = '\0'; @@ -863,13 +881,18 @@ static void maildir_flags (char *dest, size_t destlen, HEADER * hdr) * test even though there is no associated flag. */ - if (hdr && (hdr->flagged || hdr->replied || hdr->read || hdr->deleted || hdr->old)) + if (hdr && (hdr->flagged || hdr->replied || hdr->read || hdr->deleted || hdr->old || hdr->maildir_flags)) { - snprintf (dest, destlen, - ":2,%s%s%s%s", + char tmp[LONG_STRING]; + snprintf (tmp, sizeof (tmp), + "%s%s%s%s%s", hdr->flagged ? "F" : "", hdr->replied ? "R" : "", - hdr->read ? "S" : "", hdr->deleted ? "T" : ""); + hdr->read ? "S" : "", hdr->deleted ? "T" : "", + NONULL(hdr->maildir_flags)); + if (hdr->maildir_flags) + qsort (tmp, strlen (tmp), 1, ch_compar); + snprintf (dest, destlen, ":2,%s", tmp); } } diff --git a/mutt.h b/mutt.h index 39f8d9c1..38b51039 100644 --- a/mutt.h +++ b/mutt.h @@ -709,6 +709,8 @@ typedef struct header #if defined USE_POP || defined USE_IMAP void *data; /* driver-specific data */ #endif + + char *maildir_flags; /* unknown maildir flags */ } HEADER; typedef struct thread diff --git a/muttlib.c b/muttlib.c index 3918008e..00605925 100644 --- a/muttlib.c +++ b/muttlib.c @@ -269,6 +269,7 @@ void mutt_free_header (HEADER **h) if(!h || !*h) return; mutt_free_envelope (&(*h)->env); mutt_free_body (&(*h)->content); + safe_free ((void **) &(*h)->maildir_flags); safe_free ((void **) &(*h)->tree); safe_free ((void **) &(*h)->path); #ifdef MIXMASTER