X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=imap%2Fimap.c;h=4b85e288acc3617c6e2f98fde8b3b5c36cf631fb;hp=9f356ba7af011a4ab381762f43b3e52c7953ac24;hb=055f4c1f45ad240f9095e79d3b6957db3ce29975;hpb=23e6291cb5d5b4cd2008403d8b628007fd75ff23 diff --git a/imap/imap.c b/imap/imap.c index 9f356ba..4b85e28 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -11,18 +11,12 @@ /* Support for IMAP4rev1, with the occasional nod to IMAP 4. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include +#include +#include #include "mutt.h" -#include "mx.h" #include "globals.h" +#include "pattern.h" #include "sort.h" #include "browser.h" #include "message.h" @@ -32,15 +26,6 @@ #endif #include "buffy.h" -#include - -#include -#include -#include -#include -#include -#include - /* imap forward declarations */ static int imap_get_delim (IMAP_DATA * idata); static char *imap_get_flags (string_list_t ** hflags, char *s); @@ -52,7 +37,7 @@ static void imap_set_flag (IMAP_DATA * idata, int aclbit, int flag, /* imap_access: Check permissions on an IMAP mailbox. * TODO: ACL checks. Right now we assume if it exists we can * mess with it. */ -int imap_access (const char *path, int flags __attribute__ ((unused))) +static int imap_access (const char *path, int flags __attribute__ ((unused))) { IMAP_DATA *idata; IMAP_MBOX mx; @@ -73,7 +58,7 @@ int imap_access (const char *path, int flags __attribute__ ((unused))) imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox)); /* we may already be in the folder we're checking */ - if (!ascii_strcmp(idata->mailbox, mx.mbox)) { + if (!m_strcmp(idata->mailbox, mx.mbox)) { p_delete(&mx.mbox); return 0; } @@ -194,7 +179,6 @@ int imap_read_literal (FILE * fp, IMAP_DATA * idata, long bytes, progress_t* bar return -1; } -#if 1 if (r == 1 && c != '\n') fputc ('\r', fp); @@ -204,7 +188,7 @@ int imap_read_literal (FILE * fp, IMAP_DATA * idata, long bytes, progress_t* bar } else r = 0; -#endif + fputc (c, fp); if (bar && !(pos % 1024)) mutt_progress_bar (bar, pos); @@ -363,9 +347,9 @@ IMAP_DATA *imap_conn_find (const ACCOUNT * account, int flags) if (idata->state == IMAP_CONNECTED) { if (!imap_authenticate (idata)) { idata->state = IMAP_AUTHENTICATED; - } - else + } else { mutt_account_unsetpass (&idata->conn->account); + } p_delete(&idata->capstr); } @@ -504,7 +488,7 @@ static char *imap_get_flags (string_list_t ** hflags, char *s) return s; } -int imap_open_mailbox (CONTEXT * ctx) +static int imap_open_mailbox (CONTEXT * ctx) { CONNECTION *conn; IMAP_DATA *idata; @@ -1008,7 +992,7 @@ out: } /* imap_close_mailbox: clean up IMAP data in CONTEXT */ -void imap_close_mailbox (CONTEXT * ctx) +static void imap_close_mailbox (CONTEXT * ctx) { IMAP_DATA *idata; int i; @@ -1450,10 +1434,10 @@ static int imap_complete_hosts (char *dest, ssize_t len) { int i = 0; matchlen = m_strlen(dest); - if (list_empty (Incoming)) + if (!Incoming.len) return (-1); - for (i = 0; i < Incoming->length; i++) { - mailbox = (BUFFY*) Incoming->data[i]; + for (i = 0; i < Incoming.len; i++) { + mailbox = Incoming.arr[i]; if (!m_strncmp(dest, mailbox->path, matchlen)) { if (rc) { m_strcpy(dest, len, mailbox->path); @@ -1559,7 +1543,7 @@ int imap_complete (char *dest, size_t dlen, char *path) { completions++; } } - while (ascii_strncmp (idata->cmd.seq, idata->cmd.buf, SEQLEN)); + while (m_strncmp(idata->cmd.seq, idata->cmd.buf, SEQLEN)); if (completions) { /* reformat output */ @@ -1596,3 +1580,63 @@ int imap_reconnect (CONTEXT * ctx) mx_open_mailbox (ctx->path, 0, ctx); return 0; } + +int imap_is_magic (const char* path, struct stat* st __attribute__ ((unused))) { + url_scheme_t s; + if (!path || !*path) + return (-1); + s = url_check_scheme (NONULL (path)); + return ((s == U_IMAP || s == U_IMAPS) ? M_IMAP : -1); +} + +static int acl_check_imap (CONTEXT* ctx, int bit) { + return (!mutt_bit_isset (((IMAP_DATA*) ctx->data)->capabilities, ACL) || + mutt_bit_isset (((IMAP_DATA*) ctx->data)->rights, bit)); +} + +static int imap_open_new_message (MESSAGE * msg, + CONTEXT * dest __attribute__ ((unused)), + HEADER * hdr __attribute__ ((unused))) +{ + char tmp[_POSIX_PATH_MAX]; + + msg->fp = m_tempfile(tmp, sizeof(tmp), NONULL(Tempdir), NULL); + if (!msg->fp) { + mutt_perror(tmp); + return -1; + } + + msg->path = m_strdup(tmp); + return 0; +} + +/* this ugly kludge is required since the last int to + * imap_check_mailbox() doesn't mean 'lock' but 'force'... */ +static int _imap_check_mailbox (CONTEXT* ctx, + int* index_hint, + int lock __attribute__ ((unused))) { + return (imap_check_mailbox (ctx, index_hint, 0)); +} + +static int imap_commit_message (MESSAGE* msg, CONTEXT* ctx) { + int r = 0; + + if ((r = m_fclose(&msg->fp)) == 0) + r = imap_append_message (ctx, msg); + return (r); +} + +mx_t const imap_mx = { + M_IMAP, + 0, + imap_is_magic, + NULL, + imap_access, + imap_open_mailbox, + imap_open_new_message, + acl_check_imap, + _imap_check_mailbox, + imap_close_mailbox, + imap_sync_mailbox, + imap_commit_message, +};