Rocco Rutte:
[apps/madmutt.git] / mbox.c
diff --git a/mbox.c b/mbox.c
index 64d86b8..bafb7f3 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -1,19 +1,10 @@
 /*
+ * Copyright notice from original mutt:
  * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
- * 
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- * 
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- * 
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
  */
 
 /* This file contains code to parse ``mbox'' and ``mmdf'' style mailboxes */
@@ -23,8 +14,8 @@
 #endif
 
 #include "mutt.h"
-#include "mailbox.h"
 #include "mx.h"
+#include "mbox.h"
 #include "sort.h"
 #include "copy.h"
 
 #include "compress.h"
 #endif
 
+#include "lib/mem.h"
+#include "lib/intl.h"
+#include "lib/str.h"
+
 #include <sys/stat.h>
 #include <dirent.h>
 #include <string.h>
@@ -50,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?
@@ -119,7 +121,7 @@ int mmdf_parse_mailbox (CONTEXT * ctx)
     if (fgets (buf, sizeof (buf) - 1, ctx->fp) == NULL)
       break;
 
-    if (mutt_strcmp (buf, MMDF_SEP) == 0) {
+    if (safe_strcmp (buf, MMDF_SEP) == 0) {
       loc = ftell (ctx->fp);
 
       count++;
@@ -163,7 +165,7 @@ int mmdf_parse_mailbox (CONTEXT * ctx)
         if (0 < tmploc && tmploc < ctx->size) {
           if (fseek (ctx->fp, tmploc, SEEK_SET) != 0 ||
               fgets (buf, sizeof (buf) - 1, ctx->fp) == NULL ||
-              mutt_strcmp (MMDF_SEP, buf) != 0) {
+              safe_strcmp (MMDF_SEP, buf) != 0) {
             if (fseek (ctx->fp, loc, SEEK_SET) != 0)
               dprint (1, (debugfile, "mmdf_parse_mailbox: fseek() failed\n"));
             hdr->content->length = -1;
@@ -182,7 +184,7 @@ int mmdf_parse_mailbox (CONTEXT * ctx)
           if (fgets (buf, sizeof (buf) - 1, ctx->fp) == NULL)
             break;
           lines++;
-        } while (mutt_strcmp (buf, MMDF_SEP) != 0);
+        } while (safe_strcmp (buf, MMDF_SEP) != 0);
 
         hdr->lines = lines;
         hdr->content->length = loc - hdr->content->offset;
@@ -303,7 +305,7 @@ int mbox_parse_mailbox (CONTEXT * ctx)
            */
           if (fseek (ctx->fp, tmploc, SEEK_SET) != 0 ||
               fgets (buf, sizeof (buf), ctx->fp) == NULL ||
-              mutt_strncmp ("From ", buf, 5) != 0) {
+              safe_strncmp ("From ", buf, 5) != 0) {
             dprint (1,
                     (debugfile,
                      "mbox_parse_mailbox: bad content-length in message %d (cl=%ld)\n",
@@ -416,8 +418,8 @@ int mbox_open_mailbox (CONTEXT * ctx)
 static int strict_addrcmp (const ADDRESS * a, const ADDRESS * b)
 {
   while (a && b) {
-    if (mutt_strcmp (a->mailbox, b->mailbox) ||
-        mutt_strcmp (a->personal, b->personal))
+    if (safe_strcmp (a->mailbox, b->mailbox) ||
+        safe_strcmp (a->personal, b->personal))
       return (0);
 
     a = a->next;
@@ -432,7 +434,7 @@ static int strict_addrcmp (const ADDRESS * a, const ADDRESS * b)
 static int strict_cmp_lists (const LIST * a, const LIST * b)
 {
   while (a && b) {
-    if (mutt_strcmp (a->data, b->data))
+    if (safe_strcmp (a->data, b->data))
       return (0);
 
     a = a->next;
@@ -447,8 +449,8 @@ static int strict_cmp_lists (const LIST * a, const LIST * b)
 static int strict_cmp_envelopes (const ENVELOPE * e1, const ENVELOPE * e2)
 {
   if (e1 && e2) {
-    if (mutt_strcmp (e1->message_id, e2->message_id) ||
-        mutt_strcmp (e1->subject, e2->subject) ||
+    if (safe_strcmp (e1->message_id, e2->message_id) ||
+        safe_strcmp (e1->subject, e2->subject) ||
         !strict_cmp_lists (e1->references, e2->references) ||
         !strict_addrcmp (e1->from, e2->from) ||
         !strict_addrcmp (e1->sender, e2->sender) ||
@@ -471,8 +473,8 @@ static int strict_cmp_envelopes (const ENVELOPE * e1, const ENVELOPE * e2)
 static int strict_cmp_parameters (const PARAMETER * p1, const PARAMETER * p2)
 {
   while (p1 && p2) {
-    if (mutt_strcmp (p1->attribute, p2->attribute) ||
-        mutt_strcmp (p1->value, p2->value))
+    if (safe_strcmp (p1->attribute, p2->attribute) ||
+        safe_strcmp (p1->value, p2->value))
       return (0);
 
     p1 = p1->next;
@@ -488,8 +490,8 @@ static int strict_cmp_bodies (const BODY * b1, const BODY * b2)
 {
   if (b1->type != b2->type ||
       b1->encoding != b2->encoding ||
-      mutt_strcmp (b1->subtype, b2->subtype) ||
-      mutt_strcmp (b1->description, b2->description) ||
+      safe_strcmp (b1->subtype, b2->subtype) ||
+      safe_strcmp (b1->description, b2->description) ||
       !strict_cmp_parameters (b1->parameter, b2->parameter) ||
       b1->length != b2->length)
     return (0);
@@ -572,8 +574,8 @@ int mbox_check_mailbox (CONTEXT * ctx, int *index_hint)
       if (fseek (ctx->fp, ctx->size, SEEK_SET) != 0)
         dprint (1, (debugfile, "mbox_check_mailbox: fseek() failed\n"));
       if (fgets (buffer, sizeof (buffer), ctx->fp) != NULL) {
-        if ((ctx->magic == M_MBOX && mutt_strncmp ("From ", buffer, 5) == 0)
-            || (ctx->magic == M_MMDF && mutt_strcmp (MMDF_SEP, buffer) == 0)) {
+        if ((ctx->magic == M_MBOX && safe_strncmp ("From ", buffer, 5) == 0)
+            || (ctx->magic == M_MMDF && safe_strcmp (MMDF_SEP, buffer) == 0)) {
           if (fseek (ctx->fp, ctx->size, SEEK_SET) != 0)
             dprint (1, (debugfile, "mbox_check_mailbox: fseek() failed\n"));
           if (ctx->magic == M_MBOX)
@@ -606,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 ();
@@ -837,8 +839,8 @@ int mbox_sync_mailbox (CONTEXT * ctx, int *index_hint)
   if (fseek (ctx->fp, offset, SEEK_SET) != 0 || /* seek the append location */
       /* do a sanity check to make sure the mailbox looks ok */
       fgets (buf, sizeof (buf), ctx->fp) == NULL ||
-      (ctx->magic == M_MBOX && mutt_strncmp ("From ", buf, 5) != 0) ||
-      (ctx->magic == M_MMDF && mutt_strcmp (MMDF_SEP, buf) != 0)) {
+      (ctx->magic == M_MBOX && safe_strncmp ("From ", buf, 5) != 0) ||
+      (ctx->magic == M_MMDF && safe_strcmp (MMDF_SEP, buf) != 0)) {
     dprint (1,
             (debugfile,
              "mbox_sync_mailbox: message not in expected position."));
@@ -977,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;
@@ -1040,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 {
@@ -1152,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);
+}