Rocco Rutte:
[apps/madmutt.git] / mbox.c
diff --git a/mbox.c b/mbox.c
index e973d3b..2470bb3 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -14,8 +14,9 @@
 #endif
 
 #include "mutt.h"
-#include "mailbox.h"
 #include "mx.h"
+#include "buffy.h"
+#include "mbox.h"
 #include "sort.h"
 #include "copy.h"
 
@@ -45,6 +46,16 @@ struct m_update_t {
   long length;
 };
 
+
+static int mbox_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
+{
+  msg->fp = dest->fp;
+  return 0;
+}
+
+/* prototypes */
+static int mbox_reopen_mailbox (CONTEXT*, int*);
+
 /* parameters:
  * ctx - context to lock
  * excl - exclusive lock?
@@ -74,7 +85,7 @@ void mbox_unlock_mailbox (CONTEXT * ctx)
   }
 }
 
-int mmdf_parse_mailbox (CONTEXT * ctx)
+static int mmdf_parse_mailbox (CONTEXT * ctx)
 {
   char buf[HUGE_STRING];
   char return_path[LONG_STRING];
@@ -212,7 +223,7 @@ int mmdf_parse_mailbox (CONTEXT * ctx)
  * NOTE: it is assumed that the mailbox being read has been locked before
  * this routine gets called.  Strange things could happen if it's not!
  */
-int mbox_parse_mailbox (CONTEXT * ctx)
+static int mbox_parse_mailbox (CONTEXT * ctx)
 {
   struct stat sb;
   char buf[HUGE_STRING], return_path[STRING];
@@ -381,7 +392,7 @@ int mbox_parse_mailbox (CONTEXT * ctx)
 #undef PREV
 
 /* open a mbox or mmdf style mailbox */
-int mbox_open_mailbox (CONTEXT * ctx)
+static int mbox_open_mailbox (CONTEXT * ctx)
 {
   int rc;
 
@@ -601,7 +612,7 @@ int mbox_check_mailbox (CONTEXT * ctx, int *index_hint)
   }
 
   if (modified) {
-    if (mutt_reopen_mailbox (ctx, index_hint) != -1) {
+    if (mbox_reopen_mailbox (ctx, index_hint) != -1) {
       if (unlock) {
         mbox_unlock_mailbox (ctx);
         mutt_unblock_signals ();
@@ -624,7 +635,7 @@ int mbox_check_mailbox (CONTEXT * ctx, int *index_hint)
  *     0       success
  *     -1      failure
  */
-int mbox_sync_mailbox (CONTEXT * ctx, int *index_hint)
+static int _mbox_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint)
 {
   char tempfile[_POSIX_PATH_MAX];
   char buf[32];
@@ -706,7 +717,7 @@ int mbox_sync_mailbox (CONTEXT * ctx, int *index_hint)
     mutt_error
       _("sync: mbox modified, but no modified messages! (report this bug)");
     mutt_sleep (5);             /* the mutt_error /will/ get cleared! */
-    dprint (1, (debugfile, "mbox_sync_mailbox(): no modified messages.\n"));
+    dprint (1, (debugfile, "_mbox_sync_mailbox(): no modified messages.\n"));
     unlink (tempfile);
     goto bail;
   }
@@ -802,7 +813,7 @@ int mbox_sync_mailbox (CONTEXT * ctx, int *index_hint)
   if (fclose (fp) != 0) {
     fp = NULL;
     dprint (1,
-            (debugfile, "mbox_sync_mailbox: fclose() returned non-zero.\n"));
+            (debugfile, "_mbox_sync_mailbox: fclose() returned non-zero.\n"));
     unlink (tempfile);
     mutt_perror (tempfile);
     mutt_sleep (5);
@@ -823,7 +834,7 @@ int mbox_sync_mailbox (CONTEXT * ctx, int *index_hint)
     mx_fastclose_mailbox (ctx);
     dprint (1,
             (debugfile,
-             "mbox_sync_mailbox: unable to reopen temp copy of mailbox!\n"));
+             "_mbox_sync_mailbox: unable to reopen temp copy of mailbox!\n"));
     mutt_perror (tempfile);
     mutt_sleep (5);
     return (-1);
@@ -836,14 +847,14 @@ int mbox_sync_mailbox (CONTEXT * ctx, int *index_hint)
       (ctx->magic == M_MMDF && safe_strcmp (MMDF_SEP, buf) != 0)) {
     dprint (1,
             (debugfile,
-             "mbox_sync_mailbox: message not in expected position."));
+             "_mbox_sync_mailbox: message not in expected position."));
     dprint (1, (debugfile, "\tLINE: %s\n", buf));
     i = -1;
   }
   else {
     if (fseek (ctx->fp, offset, SEEK_SET) != 0) {       /* return to proper offset */
       i = -1;
-      dprint (1, (debugfile, "mbox_sync_mailbox: fseek() failed\n"));
+      dprint (1, (debugfile, "_mbox_sync_mailbox: fseek() failed\n"));
     }
     else {
       /* copy the temp mailbox back into place starting at the first
@@ -957,6 +968,19 @@ bail:                          /* Come here in case of disaster */
   return rc;
 }
 
+static int mbox_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint) {
+#ifdef BUFFY_SIZE
+  BUFFY* tmp = NULL;
+#endif
+  int rc = _mbox_sync_mailbox (ctx, unused, index_hint);
+
+#ifdef BUFFY_SIZE
+  if ((tmp = buffy_find_mailbox (ctx->path)) && tmp->new == 0)
+    buffy_update_mailbox (tmp);
+#endif
+  return (rc);
+}
+
 /* close a mailbox opened in write-mode */
 int mbox_close_mailbox (CONTEXT * ctx)
 {
@@ -972,7 +996,7 @@ int mbox_close_mailbox (CONTEXT * ctx)
   return 0;
 }
 
-int mutt_reopen_mailbox (CONTEXT * ctx, int *index_hint)
+static int mbox_reopen_mailbox (CONTEXT * ctx, int *index_hint)
 {
   int (*cmp_headers) (const HEADER *, const HEADER *) = NULL;
   HEADER **old_hdrs;
@@ -1035,7 +1059,7 @@ int mutt_reopen_mailbox (CONTEXT * ctx, int *index_hint)
   case M_MBOX:
   case M_MMDF:
     if (fseek (ctx->fp, 0, SEEK_SET) != 0) {
-      dprint (1, (debugfile, "mutt_reopen_mailbox: fseek() failed\n"));
+      dprint (1, (debugfile, "mbox_reopen_mailbox: fseek() failed\n"));
       rc = -1;
     }
     else {
@@ -1147,3 +1171,72 @@ int mbox_check_empty (const char *path)
 
   return ((st.st_size == 0));
 }
+
+int mbox_is_magic (const char* path, struct stat* st) {
+  int magic = -1;
+  FILE* f;
+  char tmp[_POSIX_PATH_MAX];
+
+  if (S_ISDIR(st->st_mode))
+    return (-1);
+
+  if (st->st_size == 0) {
+    /* hard to tell what zero-length files are, so assume the default magic */
+    if (DefaultMagic == M_MBOX || DefaultMagic == M_MMDF)
+      return (DefaultMagic);
+    else
+      return (M_MBOX);
+  }
+  else if ((f = fopen (path, "r")) != NULL) {
+#ifndef BUFFY_SIZE
+    struct utimbuf times;
+#endif
+    fgets (tmp, sizeof (tmp), f);
+    if (safe_strncmp ("From ", tmp, 5) == 0)
+      magic = M_MBOX;
+    else if (safe_strcmp (MMDF_SEP, tmp) == 0)
+      magic = M_MMDF;
+    safe_fclose (&f);
+#ifndef BUFFY_SIZE
+    /* need to restore the times here, the file was not really accessed,
+     * only the type was accessed.  This is important, because detection
+     * of "new mail" depends on those times set correctly.
+     */
+    times.actime = st->st_atime;
+    times.modtime = st->st_mtime;
+    utime (path, &times);
+#endif
+  } else {
+    mutt_perror (path);
+    return (-1);         /* fopen failed */
+  }
+
+#ifdef USE_COMPRESSED
+  if (magic == -1 && mutt_can_read_compressed (path))
+    return (M_COMPRESSED);
+#endif
+  return (magic);
+}
+
+static mx_t* reg_mx (void) {
+  mx_t* fmt = safe_calloc (1, sizeof (mx_t));
+  fmt->local = 1;
+  fmt->mx_check_empty = mbox_check_empty;
+  fmt->mx_is_magic = mbox_is_magic;
+  fmt->mx_access = access;
+  fmt->mx_open_mailbox = mbox_open_mailbox;
+  fmt->mx_open_new_message = mbox_open_new_message;
+  fmt->mx_sync_mailbox = mbox_sync_mailbox;
+  return (fmt);
+}
+
+mx_t* mbox_reg_mx (void) {
+  mx_t* fmt = reg_mx ();
+  fmt->type = M_MBOX;
+  return (fmt);
+}
+mx_t* mmdf_reg_mx (void) {
+  mx_t* fmt = reg_mx ();
+  fmt->type = M_MMDF;
+  return (fmt);
+}