Rocco Rutte:
[apps/madmutt.git] / mh.c
diff --git a/mh.c b/mh.c
index 04b11ae..ae978e9 100644 (file)
--- a/mh.c
+++ b/mh.c
  * mailboxes.
  */
 
  * mailboxes.
  */
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "mutt.h"
 #include "mailbox.h"
 #include "mx.h"
 #include "mutt.h"
 #include "mailbox.h"
 #include "mx.h"
@@ -192,7 +196,8 @@ static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt)
   {
     snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d",
              dest->path, NONULL (Hostname), (int) getpid (), Counter++);
   {
     snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d",
              dest->path, NONULL (Hostname), (int) getpid (), Counter++);
-    if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
+    umask(Umask);
+    if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
     {
       if (errno != EEXIST)
       {
     {
       if (errno != EEXIST)
       {
@@ -871,29 +876,79 @@ static struct maildir* maildir_sort_inode(struct maildir* list)
   return maildir_merge_inode(left, right);
 }
 
   return maildir_merge_inode(left, right);
 }
 
+#if USE_HCACHE
+static size_t maildir_hcache_keylen (const char *fn)
+{
+  const char * p = strchr (fn, ':');
+  return p ? (size_t) (p - fn) : mutt_strlen(fn);
+}
+#endif
 
 /* 
  * This function does the second parsing pass for a maildir-style
  * folder.
  */
 
 /* 
  * This function does the second parsing pass for a maildir-style
  * folder.
  */
-
 void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md)
 {
   struct maildir *p;
   char fn[_POSIX_PATH_MAX];
 void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md)
 {
   struct maildir *p;
   char fn[_POSIX_PATH_MAX];
+  int count;
 
 
-  for (p = md; p; p = p->next)
-    if (p && p->h && !p->header_parsed)
-    {
-      snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path);
-      if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h))
-       p->header_parsed = 1;
-      else
-       mutt_free_header (&p->h);
-    }
-}
+#if USE_HCACHE
+  void *hc = NULL;
+  void *data;
+  struct timeval *when = NULL;
+  struct stat lastchanged;
+  int ret;
+
+  hc = mutt_hcache_open (HeaderCache, ctx->path);
+#endif
+
+  for (p = md, count = 0; p; p = p->next, count++)
+  {
+    if (! (p && p->h && !p->header_parsed))
+       continue;
+
+#if USE_HCACHE
+    data      = mutt_hcache_fetch (hc, p->h->path + 3, &maildir_hcache_keylen);
+    when      = (struct timeval *) data;
+#endif
 
 
+    if (!ctx->quiet && ReadInc && ((count % ReadInc) == 0 || count == 1))
+      mutt_message (_("Reading %s... %d"), ctx->path, count);
+    snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path);
+
+#if USE_HCACHE
+    if (option(OPTHCACHEVERIFY)) {
+      ret = stat(fn, &lastchanged);
+    } else {
+      lastchanged.st_mtime = 0;
+      ret = 0;
+    }
 
 
+    if (data != NULL && !ret && lastchanged.st_mtime <= when->tv_sec)
+    {
+      p->h = mutt_hcache_restore ((unsigned char *)data, &p->h);
+      maildir_parse_flags (p->h, fn);
+    } else
+#endif
+    if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h))
+    {
+      p->header_parsed = 1;
+      maildir_parse_flags (p->h, fn);
+#if USE_HCACHE
+      mutt_hcache_store (hc, p->h->path + 3, p->h, 0, &maildir_hcache_keylen);
+#endif
+    } else
+      mutt_free_header (&p->h);
+#if USE_HCACHE
+    FREE(&data);
+#endif
+  }
+#if USE_HCACHE
+  mutt_hcache_close (hc);
+#endif
+}
 
 /* Read a MH/maildir style mailbox.
  *
 
 /* Read a MH/maildir style mailbox.
  *
@@ -1024,14 +1079,15 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
 
   FOREVER
   {
 
   FOREVER
   {
-    snprintf (path, _POSIX_PATH_MAX, "%s/tmp/%s.%ld.%d_%d.%s%s",
-             dest->path, subdir, time (NULL), getpid (), Counter++,
-             NONULL (Hostname), suffix);
+    snprintf (path, _POSIX_PATH_MAX, "%s/tmp/%s.%ld.%u_%d.%s%s",
+             dest->path, subdir, (long) time (NULL), (unsigned int)getpid (),
+             Counter++, NONULL (Hostname), suffix);
 
     dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n",
                path));
 
 
     dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n",
                path));
 
-    if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
+    umask(Umask);
+    if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
     {
       if (errno != EEXIST)
       {
     {
       if (errno != EEXIST)
       {
@@ -1105,8 +1161,9 @@ int maildir_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr)
   /* construct a new file name. */
   FOREVER
   {
   /* construct a new file name. */
   FOREVER
   {
-    snprintf (path, _POSIX_PATH_MAX, "%s/%ld.%d_%d.%s%s", subdir,
-             time (NULL), getpid (), Counter++, NONULL (Hostname), suffix);
+    snprintf (path, _POSIX_PATH_MAX, "%s/%ld.%u_%d.%s%s", subdir,
+             (long) time (NULL), (unsigned int)getpid (), Counter++, 
+             NONULL (Hostname), suffix);
     snprintf (full, _POSIX_PATH_MAX, "%s/%s", ctx->path, path);
 
     dprint (2, (debugfile, "maildir_commit_message (): renaming %s to %s.\n",
     snprintf (full, _POSIX_PATH_MAX, "%s/%s", ctx->path, path);
 
     dprint (2, (debugfile, "maildir_commit_message (): renaming %s to %s.\n",
@@ -1387,6 +1444,9 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint)
 {
   char path[_POSIX_PATH_MAX], tmp[_POSIX_PATH_MAX];
   int i, j;
 {
   char path[_POSIX_PATH_MAX], tmp[_POSIX_PATH_MAX];
   int i, j;
+#if USE_HCACHE
+  void *hc = NULL;
+#endif /* USE_HCACHE */
 
   if (ctx->magic == M_MH)
     i = mh_check_mailbox (ctx, index_hint);
 
   if (ctx->magic == M_MH)
     i = mh_check_mailbox (ctx, index_hint);
@@ -1396,6 +1456,11 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint)
   if (i != 0)
     return i;
 
   if (i != 0)
     return i;
 
+#if USE_HCACHE
+  if (ctx->magic == M_MAILDIR)
+    hc = mutt_hcache_open(HeaderCache, ctx->path);
+#endif /* USE_HCACHE */
+
   for (i = 0; i < ctx->msgcount; i++)
   {
     if (ctx->hdrs[i]->deleted
   for (i = 0; i < ctx->msgcount; i++)
   {
     if (ctx->hdrs[i]->deleted
@@ -1404,7 +1469,13 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint)
       snprintf (path, sizeof (path), "%s/%s", ctx->path, ctx->hdrs[i]->path);
       if (ctx->magic == M_MAILDIR
          || (option (OPTMHPURGE) && ctx->magic == M_MH))
       snprintf (path, sizeof (path), "%s/%s", ctx->path, ctx->hdrs[i]->path);
       if (ctx->magic == M_MAILDIR
          || (option (OPTMHPURGE) && ctx->magic == M_MH))
+      {
+#if USE_HCACHE
+        if (ctx->magic == M_MAILDIR)
+          mutt_hcache_delete (hc, ctx->hdrs[i]->path + 3, &maildir_hcache_keylen);
+#endif /* USE_HCACHE */
        unlink (path);
        unlink (path);
+      }
       else if (ctx->magic == M_MH)
       {
        /* MH just moves files out of the way when you delete them */
       else if (ctx->magic == M_MH)
       {
        /* MH just moves files out of the way when you delete them */
@@ -1426,16 +1497,21 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint)
       if (ctx->magic == M_MAILDIR)
       {
        if (maildir_sync_message (ctx, i) == -1)
       if (ctx->magic == M_MAILDIR)
       {
        if (maildir_sync_message (ctx, i) == -1)
-         return -1;
+         goto err;
       }
       else
       {
        if (mh_sync_message (ctx, i) == -1)
       }
       else
       {
        if (mh_sync_message (ctx, i) == -1)
-         return -1;
+         goto err;
       }
     }
   }
 
       }
     }
   }
 
+#if USE_HCACHE
+  if (ctx->magic == M_MAILDIR)
+    mutt_hcache_close (hc);
+#endif /* USE_HCACHE */
+
   if (ctx->magic == M_MH)
     mh_update_sequences (ctx);
 
   if (ctx->magic == M_MH)
     mh_update_sequences (ctx);
 
@@ -1456,6 +1532,13 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint)
   }
 
   return 0;
   }
 
   return 0;
+
+err:
+#if USE_HCACHE
+  if (ctx->magic == M_MAILDIR)
+    mutt_hcache_close (hc);
+#endif /* USE_HCACHE */
+  return -1;
 }
 
 static char *maildir_canon_filename (char *dest, const char *src, size_t l)
 }
 
 static char *maildir_canon_filename (char *dest, const char *src, size_t l)