#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"
#define MH_SEQ_REPLIED (1 << 1)
#define MH_SEQ_FLAGGED (1 << 2)
+/* prototypes */
+static int maildir_check_empty (const char*);
+
static void mhs_alloc (struct mh_sequences *mhs, int i)
{
int j;
* 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;
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;
* 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);
}
*
*/
-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];
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;
* 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;
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;
+ 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;
+ return (fmt);
+}