Rocco Rutte:
[apps/madmutt.git] / mbox.c
diff --git a/mbox.c b/mbox.c
index e973d3b..bafb7f3 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -14,8 +14,8 @@
 #endif
 
 #include "mutt.h"
-#include "mailbox.h"
 #include "mx.h"
+#include "mbox.h"
 #include "sort.h"
 #include "copy.h"
 
@@ -45,6 +45,13 @@ struct m_update_t {
   long length;
 };
 
+
+int mbox_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
+{
+  msg->fp = dest->fp;
+  return 0;
+}
+
 /* parameters:
  * ctx - context to lock
  * excl - exclusive lock?
@@ -601,7 +608,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 ();
@@ -972,7 +979,7 @@ int mbox_close_mailbox (CONTEXT * ctx)
   return 0;
 }
 
-int mutt_reopen_mailbox (CONTEXT * ctx, int *index_hint)
+int mbox_reopen_mailbox (CONTEXT * ctx, int *index_hint)
 {
   int (*cmp_headers) (const HEADER *, const HEADER *) = NULL;
   HEADER **old_hdrs;
@@ -1035,7 +1042,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 +1154,70 @@ 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;
+  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);
+}