]> granicus.if.org Git - mutt/commitdiff
Gracefully handle unknown maildir flags.
authorThomas Roessler <roessler@does-not-exist.org>
Sat, 7 Dec 2002 08:53:21 +0000 (08:53 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Sat, 7 Dec 2002 08:53:21 +0000 (08:53 +0000)
mh.c
mutt.h
muttlib.c

diff --git a/mh.c b/mh.c
index 359f3652e07b72162d52eb97c9ec541f7eebf612..77ea5f4d773d488eba32f72c2f81ab25e9ed6962 100644 (file)
--- 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 39f8d9c1f83f12c6c3a77a1cfec73e2aedce3634..38b510392b915055d58be294896da1d32519a037 100644 (file)
--- 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
index 3918008ebc6e47b46533b2e2cbbd38e7ba558807..00605925f66c9967406f834dbbe633f2dbe7d5bb 100644 (file)
--- 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