Rocco Rutte:
[apps/madmutt.git] / mh.c
diff --git a/mh.c b/mh.c
index e695a93..1bcf9c1 100644 (file)
--- a/mh.c
+++ b/mh.c
@@ -18,8 +18,9 @@
 #endif
 
 #include "mutt.h"
-#include "mailbox.h"
 #include "mx.h"
+#include "mh.h"
+#include "mbox.h"
 #include "copy.h"
 #include "buffy.h"
 #include "sort.h"
@@ -27,6 +28,7 @@
 #include "lib/mem.h"
 #include "lib/intl.h"
 #include "lib/str.h"
+#include "lib/debug.h"
 
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -67,6 +69,11 @@ struct mh_sequences {
 #define MH_SEQ_REPLIED (1 << 1)
 #define MH_SEQ_FLAGGED (1 << 2)
 
+/* prototypes */
+static int maildir_check_empty (const char*);
+static int maildir_check_mailbox (CONTEXT*, int*, int);
+static int mh_check_mailbox (CONTEXT*, int*, int);
+
 static void mhs_alloc (struct mh_sequences *mhs, int i)
 {
   int j;
@@ -692,9 +699,7 @@ static int maildir_parse_dir (CONTEXT * ctx, struct maildir ***last,
 
     /* FOO - really ignore the return value? */
 
-    dprint (2,
-            (debugfile, "%s:%d: parsing %s\n", __FILE__, __LINE__,
-             de->d_name));
+    debug_print (2, ("parsing %s\n", de->d_name));
     maildir_parse_entry (ctx, last, subdir, de->d_name, count, is_old,
                          de->d_ino);
   }
@@ -709,16 +714,12 @@ static int maildir_add_to_context (CONTEXT * ctx, struct maildir *md)
 
   while (md) {
 
-    dprint (2, (debugfile, "%s:%d maildir_add_to_context(): Considering %s\n",
-                __FILE__, __LINE__, NONULL (md->canon_fname)));
+    debug_print (2, ("considering %s\n", NONULL (md->canon_fname)));
 
     if (md->h) {
-      dprint (2,
-              (debugfile,
-               "%s:%d Adding header structure. Flags: %s%s%s%s%s\n", __FILE__,
-               __LINE__, md->h->flagged ? "f" : "", md->h->deleted ? "D" : "",
-               md->h->replied ? "r" : "", md->h->old ? "O" : "",
-               md->h->read ? "R" : ""));
+      debug_print (2, ("flags: %s%s%s%s%s\n", md->h->flagged ? "f" : "",
+                  md->h->deleted ? "D" : "", md->h->replied ? "r" : "",
+                  md->h->old ? "O" : "", md->h->read ? "R" : ""));
       if (ctx->msgcount == ctx->hdrmax)
         mx_alloc_memory (ctx);
 
@@ -911,7 +912,7 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md)
  *     subdir [IN]     NULL for MH mailboxes, otherwise the subdir of the
  *                     maildir mailbox to read from
  */
-int mh_read_dir (CONTEXT * ctx, const char *subdir)
+static int _mh_read_dir (CONTEXT * ctx, const char *subdir)
 {
   struct maildir *md;
   struct mh_sequences mhs;
@@ -946,13 +947,17 @@ int mh_read_dir (CONTEXT * ctx, const char *subdir)
   return 0;
 }
 
+static int mh_read_dir (CONTEXT* ctx) {
+  return (_mh_read_dir (ctx, NULL));
+}
+
 /* read a maildir style mailbox */
-int maildir_read_dir (CONTEXT * ctx)
+static int maildir_read_dir (CONTEXT * ctx)
 {
   /* maildir looks sort of like MH, except that there are two subdirectories
    * of the main folder path from which to read messages
    */
-  if (mh_read_dir (ctx, "new") == -1 || mh_read_dir (ctx, "cur") == -1)
+  if (_mh_read_dir (ctx, "new") == -1 || _mh_read_dir (ctx, "cur") == -1)
     return (-1);
 
   return 0;
@@ -962,7 +967,7 @@ int maildir_read_dir (CONTEXT * ctx)
  * Open a new (temporary) message in an MH folder.
  */
 
-int mh_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
+static int mh_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
 {
   return mh_mkstemp (dest, &msg->fp, &msg->path);
 }
@@ -1010,7 +1015,7 @@ static void maildir_flags (char *dest, size_t destlen, HEADER * hdr)
  *
  */
 
-int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
+static int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
 {
   int fd;
   char path[_POSIX_PATH_MAX];
@@ -1039,8 +1044,7 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
               dest->path, subdir, (long) time (NULL),
               (unsigned int) getpid (), Counter++, NONULL (Hostname), suffix);
 
-    dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n",
-                path));
+    debug_print (2, ("trying %s.\n", path));
 
     umask (Umask);
     if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1) {
@@ -1050,7 +1054,7 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
       }
     }
     else {
-      dprint (2, (debugfile, "maildir_open_new_message (): Success.\n"));
+      debug_print (2, ("success.\n"));
       msg->path = safe_strdup (path);
       break;
     }
@@ -1117,8 +1121,7 @@ int maildir_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr)
               NONULL (Hostname), suffix);
     snprintf (full, _POSIX_PATH_MAX, "%s/%s", ctx->path, path);
 
-    dprint (2, (debugfile, "maildir_commit_message (): renaming %s to %s.\n",
-                msg->path, full));
+    debug_print (2, ("renaming %s to %s.\n", msg->path, full));
 
     if (safe_rename (msg->path, full) == 0) {
       if (hdr)
@@ -1336,10 +1339,7 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno)
     char *p;
 
     if ((p = strrchr (h->path, '/')) == NULL) {
-      dprint (1,
-              (debugfile,
-               "maildir_sync_message: %s: unable to find subdir!\n",
-               h->path));
+      debug_print (1, ("%s: unable to find subdir!\n", h->path));
       return (-1);
     }
     p++;
@@ -1373,7 +1373,7 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno)
   return (0);
 }
 
-int mh_sync_mailbox (CONTEXT * ctx, int *index_hint)
+static int mh_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint)
 {
   char path[_POSIX_PATH_MAX], tmp[_POSIX_PATH_MAX];
   int i, j;
@@ -1383,9 +1383,9 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint)
 #endif /* USE_HCACHE */
 
   if (ctx->magic == M_MH)
-    i = mh_check_mailbox (ctx, index_hint);
+    i = mh_check_mailbox (ctx, index_hint, 0);
   else
-    i = maildir_check_mailbox (ctx, index_hint);
+    i = maildir_check_mailbox (ctx, index_hint, 0);
 
   if (i != 0)
     return i;
@@ -1548,7 +1548,7 @@ static void maildir_update_flags (CONTEXT * ctx, HEADER * o, HEADER * n)
  * either subdirectory differently, as mail could be copied directly into
  * the cur directory from another agent.
  */
-int maildir_check_mailbox (CONTEXT * ctx, int *index_hint)
+static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused)
 {
   struct stat st_new;           /* status of the "new" subdirectory */
   struct stat st_cur;           /* status of the "cur" subdirectory */
@@ -1563,9 +1563,6 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint)
   HASH *fnames;                 /* hash table for quickly looking up the base filename
                                    for a maildir message */
 
-  /* XXX seems like this check belongs in mx_check_mailbox()
-   * rather than here.
-   */
   if (!option (OPTCHECKNEW))
     return 0;
 
@@ -1688,7 +1685,7 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint)
  *
  */
 
-int mh_check_mailbox (CONTEXT * ctx, int *index_hint)
+static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused)
 {
   char buf[_POSIX_PATH_MAX];
   struct stat st, st_cur;
@@ -1866,7 +1863,7 @@ FILE *maildir_open_find_message (const char *folder, const char *msg)
  * 0 if there are messages in the mailbox
  * -1 on error
  */
-int maildir_check_empty (const char *path)
+static int maildir_check_empty (const char *path)
 {
   DIR *dp;
   struct dirent *de;
@@ -1921,3 +1918,82 @@ int mh_check_empty (const char *path)
 
   return r;
 }
+
+static int mh_is_magic (const char* path, struct stat* st) {
+  char tmp[_POSIX_PATH_MAX];
+
+  if (S_ISDIR (st->st_mode)) {
+    snprintf (tmp, sizeof (tmp), "%s/.mh_sequences", path);
+    if (access (tmp, F_OK) == 0)
+      return (M_MH);
+
+    snprintf (tmp, sizeof (tmp), "%s/.xmhcache", path);
+    if (access (tmp, F_OK) == 0)
+      return (M_MH);
+
+    snprintf (tmp, sizeof (tmp), "%s/.mew_cache", path);
+    if (access (tmp, F_OK) == 0)
+      return (M_MH);
+
+    snprintf (tmp, sizeof (tmp), "%s/.mew-cache", path);
+    if (access (tmp, F_OK) == 0)
+      return (M_MH);
+
+    snprintf (tmp, sizeof (tmp), "%s/.sylpheed_cache", path);
+    if (access (tmp, F_OK) == 0)
+      return (M_MH);
+
+    /* 
+     * ok, this isn't an mh folder, but mh mode can be used to read
+     * Usenet news from the spool. ;-) 
+     */
+
+    snprintf (tmp, sizeof (tmp), "%s/.overview", path);
+    if (access (tmp, F_OK) == 0)
+      return (M_MH);
+  }
+  return (-1);
+}
+
+static int maildir_is_magic (const char* path, struct stat* st) {
+  struct stat sb;
+  char tmp[_POSIX_PATH_MAX];
+
+  if (S_ISDIR (st->st_mode)) {
+    snprintf (tmp, sizeof (tmp), "%s/cur", path);
+    if (stat (tmp, &sb) == 0 && S_ISDIR (sb.st_mode))
+      return (M_MAILDIR);
+  }
+  return (-1);
+}
+
+/* routines common to maildir and mh */
+static mx_t* reg_mx (void) {
+  mx_t* fmt = safe_calloc (1, sizeof (mx_t));
+  fmt->local = 1;
+  fmt->mx_access = access;
+  fmt->mx_sync_mailbox = mh_sync_mailbox;
+  return (fmt);
+}
+
+mx_t* mh_reg_mx (void) {
+  mx_t* fmt = reg_mx ();
+  fmt->type = M_MH;
+  fmt->mx_check_empty = mh_check_empty;
+  fmt->mx_is_magic = mh_is_magic;
+  fmt->mx_open_mailbox = mh_read_dir;
+  fmt->mx_open_new_message = mh_open_new_message;
+  fmt->mx_check_mailbox = mh_check_mailbox;
+  return (fmt);
+}
+
+mx_t* maildir_reg_mx (void) {
+  mx_t* fmt = reg_mx ();
+  fmt->type = M_MAILDIR;
+  fmt->mx_check_empty = maildir_check_empty;
+  fmt->mx_is_magic = maildir_is_magic;
+  fmt->mx_open_mailbox = maildir_read_dir;
+  fmt->mx_open_new_message = maildir_open_new_message;
+  fmt->mx_check_mailbox = maildir_check_mailbox;
+  return (fmt);
+}