* please see the file GPL in the top level source directory.
*/
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <lib-lib/lib-lib.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
#include <utime.h>
-#include <lib-lib/mem.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/str.h>
-#include <lib-lib/macros.h>
-#include <lib-lib/file.h>
-#include <lib-lib/url.h>
-
#include <lib-sys/unix.h>
-
#include <lib-mime/mime.h>
-
#include <lib-ui/sidebar.h>
#include "mutt.h"
#include <lib-crypt/crypt.h>
-#include "lib/list.h"
-
-static list2_t* MailboxFormats = NULL;
-#define MX_COMMAND(idx,cmd) ((mx_t*) MailboxFormats->data[idx])->cmd
-#define MX_IDX(idx) (idx >= 0 && idx < MailboxFormats->length)
+static mx_t const *mxfmts[] = {
+ &mbox_mx,
+ &mmdf_mx,
+ &mh_mx,
+ &maildir_mx,
+ &imap_mx,
+ &pop_mx,
+#ifdef USE_NNTP
+ &nntp_mx,
+#endif
+ &compress_mx,
+};
-#define mutt_is_spool(s) (m_strcmp(Spoolfile, s) == 0)
+#define MX_IDX(idx) (idx >= 0 && idx < countof(mxfmts))
+#define mutt_is_spool(s) (m_strcmp(Spoolfile, s) == 0)
#ifdef USE_DOTLOCK
/* parameters:
* retry - should retry if unable to lock?
*/
-static int invoke_dotlock (const char *path, int dummy, int flags, int retry)
+static int invoke_dotlock (const char *path, int flags, int retry)
{
char cmd[LONG_STRING + _POSIX_PATH_MAX];
char f[SHORT_STRING + _POSIX_PATH_MAX];
return mutt_system (cmd);
}
-static int dotlock_file (const char *path, int fd, int retry)
+static int dotlock_file (const char *path, int retry)
{
int r;
int flags = DL_FL_USEPRIV | DL_FL_RETRY;
retry = 1;
retry_lock:
- if ((r = invoke_dotlock (path, fd, flags, retry)) == DL_EX_EXIST) {
+ if ((r = invoke_dotlock (path, flags, retry)) == DL_EX_EXIST) {
if (!option (OPTNOCURSES)) {
char msg[LONG_STRING];
return (r == DL_EX_OK ? 0 : -1);
}
-static int undotlock_file (const char *path, int fd)
+static int undotlock_file (const char *path)
{
- return (invoke_dotlock (path, fd, DL_FL_USEPRIV | DL_FL_UNLOCK, 0) ==
+ return (invoke_dotlock (path, DL_FL_USEPRIV | DL_FL_UNLOCK, 0) ==
DL_EX_OK ? 0 : -1);
}
#endif /* USE_DOTLOCK */
-/* looks up index of type for path in MailboxFormats */
+/* looks up index of type for path in mxfmts */
static int mx_get_idx (const char* path) {
- int i = 0, t = 0;
- struct stat st;
-
- /* first, test all non-local folders to avoid stat() call */
- for (i = 0; i < MailboxFormats->length; i++) {
- if (!MX_COMMAND(i,local))
- t = MX_COMMAND(i,mx_is_magic)(path, NULL);
- if (t >= 1)
- return (t-1);
- }
- if (stat (path, &st) == 0) {
- /* if stat() succeeded, keep testing until success and
- * pass stat() info so that we only need to do it once */
- for (i = 0; i < MailboxFormats->length; i++) {
- if (MX_COMMAND(i,local))
- t = MX_COMMAND(i,mx_is_magic)(path, &st);
- if (t >= 1)
- return (t-1);
+ int i = 0, t = 0;
+ struct stat st;
+
+ /* first, test all non-local folders to avoid stat() call */
+ for (i = 0; i < countof(mxfmts); i++) {
+ if (!mxfmts[i]->local)
+ t = mxfmts[i]->mx_is_magic(path, NULL);
+ if (t >= 1)
+ return (t-1);
}
- }
- return (-1);
+ if (stat (path, &st) == 0) {
+ /* if stat() succeeded, keep testing until success and
+ * pass stat() info so that we only need to do it once */
+ for (i = 0; i < countof(mxfmts); i++) {
+ if (mxfmts[i]->local)
+ t = mxfmts[i]->mx_is_magic(path, &st);
+ if (t >= 1)
+ return (t-1);
+ }
+ }
+ return (-1);
}
/* Args:
#ifdef USE_DOTLOCK
if (r == 0 && dot)
- r = dotlock_file (path, fd, time_out);
+ r = dotlock_file (path, time_out);
#endif /* USE_DOTLOCK */
if (r == -1) {
#ifdef USE_DOTLOCK
if (dot)
- undotlock_file (path, fd);
+ undotlock_file (path);
#endif
return 0;
}
-void mx_unlink_empty (const char *path)
+static void mx_unlink_empty (const char *path)
{
int fd;
}
#ifdef USE_DOTLOCK
- invoke_dotlock (path, fd, DL_FL_UNLINK, 1);
+ invoke_dotlock (path, DL_FL_UNLINK, 1);
#else
if (fstat (fd, &sb) == 0 && sb.st_size == 0)
unlink (path);
if (m_strlen(path) == 0)
return (-1);
if ((i = mx_get_idx (path)) >= 0)
- return (MX_COMMAND(i,type));
+ return (mxfmts[i]->type);
return (-1);
}
int mx_is_local (int m) {
if (!MX_IDX(m))
return (0);
- return (MX_COMMAND(m,local));
+ return (mxfmts[m]->local);
}
/*
{
int i = 0;
- if ((i = mx_get_idx (path)) >= 0 && MX_COMMAND(i,mx_access))
- return (MX_COMMAND(i,mx_access)(path,flags));
+ if ((i = mx_get_idx (path)) >= 0 && mxfmts[i]->mx_access)
+ return (mxfmts[i]->mx_access(path,flags));
return (0);
}
if (!ctx->quiet)
mutt_message (_("Reading %s..."), ctx->path);
- rc = MX_COMMAND(ctx->magic-1,mx_open_mailbox)(ctx);
+ rc = mxfmts[ctx->magic-1]->mx_open_mailbox(ctx);
if (rc == 0) {
if ((flags & M_NOSORT) == 0) {
if (!ctx)
return;
- if (MX_IDX(ctx->magic-1) && MX_COMMAND(ctx->magic-1,mx_fastclose_mailbox))
- MX_COMMAND(ctx->magic-1,mx_fastclose_mailbox(ctx));
+ if (MX_IDX(ctx->magic-1) && mxfmts[ctx->magic-1]->mx_fastclose_mailbox)
+ mxfmts[ctx->magic-1]->mx_fastclose_mailbox(ctx);
if (ctx->subj_hash)
hash_destroy (&ctx->subj_hash, NULL);
if (ctx->id_hash)
if (MX_IDX(ctx->magic-1))
/* the 1 is only of interest for IMAP and means EXPUNGE */
- rc = MX_COMMAND(ctx->magic-1,mx_sync_mailbox(ctx,1,index_hint));
+ rc = mxfmts[ctx->magic-1]->mx_sync_mailbox(ctx,1,index_hint);
if (rc == 0 && ctx->compressinfo)
return mutt_sync_compressed (ctx);
if (msg->received == 0)
time (&msg->received);
- if (MX_COMMAND(dest->magic-1,mx_open_new_message)(msg, dest, hdr) == 0) {
+ if (mxfmts[dest->magic-1]->mx_open_new_message(msg, dest, hdr) == 0) {
if (dest->magic == M_MMDF)
fputs (MMDF_SEP, msg->fp);
if (ctx) {
if (ctx->locked)
lock = 0;
- if (MX_IDX(ctx->magic-1) && MX_COMMAND(ctx->magic-1,mx_check_mailbox))
- return (MX_COMMAND(ctx->magic-1,mx_check_mailbox)(ctx, index_hint, lock));
+ if (MX_IDX(ctx->magic-1) && mxfmts[ctx->magic-1]->mx_check_mailbox)
+ return (mxfmts[ctx->magic-1]->mx_check_mailbox(ctx, index_hint, lock));
}
return (-1);
if (!(msg->write && ctx->append)) {
return -1;
}
- if (!ctx || !MX_IDX(ctx->magic-1) || !MX_COMMAND(ctx->magic-1,mx_commit_message))
+ if (!ctx || !MX_IDX(ctx->magic-1) || !mxfmts[ctx->magic-1]->mx_commit_message)
return (-1);
- return (MX_COMMAND(ctx->magic-1,mx_commit_message) (msg, ctx));
+ return (mxfmts[ctx->magic-1]->mx_commit_message (msg, ctx));
}
/* close a pointer to a message */
int mx_check_empty (const char *path)
{
int i = 0;
- if ((i = mx_get_idx (path)) >= 0 && MX_COMMAND(i,mx_check_empty))
- return (MX_COMMAND(i,mx_check_empty)(path));
+ if ((i = mx_get_idx (path)) >= 0 && mxfmts[i]->mx_check_empty)
+ return (mxfmts[i]->mx_check_empty(path));
errno = EINVAL;
return (-1);
}
if (!ctx || !MX_IDX(ctx->magic-1))
return (0);
/* if no acl_check defined for module, assume permission is granted */
- if (!MX_COMMAND(ctx->magic-1,mx_acl_check))
+ if (!mxfmts[ctx->magic-1]->mx_acl_check)
return (1);
- return (MX_COMMAND(ctx->magic-1,mx_acl_check)(ctx,flag));
-}
-
-void mx_init (void) {
- list_push_back (&MailboxFormats, (void*) mbox_reg_mx ());
- list_push_back (&MailboxFormats, (void*) mmdf_reg_mx ());
- list_push_back (&MailboxFormats, (void*) mh_reg_mx ());
- list_push_back (&MailboxFormats, (void*) maildir_reg_mx ());
- list_push_back (&MailboxFormats, (void*) imap_reg_mx ());
- list_push_back (&MailboxFormats, (void*) pop_reg_mx ());
-#ifdef USE_NNTP
- list_push_back (&MailboxFormats, (void*) nntp_reg_mx ());
-#endif
- list_push_back (&MailboxFormats, (void*) compress_reg_mx ());
+ return (mxfmts[ctx->magic-1]->mx_acl_check(ctx,flag));
}
int mx_rebuild_cache (void) {
if (magic != M_MAILDIR && magic != M_MH && magic != M_IMAP)
continue;
sidebar_set_current (b->path);
- sidebar_draw (CurrentMenu);
+ sidebar_draw ();
if ((ctx = mx_open_mailbox (b->path,
M_READONLY | M_NOSORT | M_COUNT,
NULL)) != NULL)
if (Context && Context->path)
sidebar_set_current (Context->path);
- sidebar_draw (CurrentMenu);
+ sidebar_draw ();
return (0);
#endif