X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=imap%2Fimap.c;h=a180ac13316fd6d434e375aaa40fa0ea9f2ea073;hp=fb4b3ac3a01d6fff8f0c1667e83e7ecf5a2ba521;hb=8476307969a605bea67f6b702b0c1e7a52038bed;hpb=ac813896ca32d850febc2d95065ac4fa040f11f9 diff --git a/imap/imap.c b/imap/imap.c index fb4b3ac..a180ac1 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -11,18 +11,10 @@ /* 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 #include "mutt.h" -#include "mx.h" #include "globals.h" #include "sort.h" #include "browser.h" @@ -33,15 +25,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); @@ -53,7 +36,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) +static int imap_access (const char *path, int flags __attribute__ ((unused))) { IMAP_DATA *idata; IMAP_MBOX mx; @@ -74,7 +57,7 @@ int imap_access (const char *path, int flags) 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; } @@ -87,12 +70,10 @@ int imap_access (const char *path, int flags) else if (mutt_bit_isset (idata->capabilities, STATUS)) snprintf (buf, sizeof (buf), "STATUS %s (UID-VALIDITY)", mbox); else { - debug_print (2, ("STATUS not supported?\n")); return -1; } if (imap_exec (idata, buf, IMAP_CMD_FAIL_OK) < 0) { - debug_print (1, ("Can't check STATUS of %s\n", mbox)); return -1; } @@ -190,11 +171,8 @@ int imap_read_literal (FILE * fp, IMAP_DATA * idata, long bytes, progress_t* bar int r = 0; - debug_print (2, ("reading %ld bytes\n", bytes)); - for (pos = 0; pos < bytes; pos++) { if (mutt_socket_readchar (idata->conn, &c) != 1) { - debug_print (1, ("error during read, %ld bytes read\n", pos)); idata->status = IMAP_FATAL; return -1; @@ -214,10 +192,6 @@ int imap_read_literal (FILE * fp, IMAP_DATA * idata, long bytes, progress_t* bar fputc (c, fp); if (bar && !(pos % 1024)) mutt_progress_bar (bar, pos); -#ifdef DEBUG - if (DebugFile && DebugLevel >= IMAP_LOG_LTRL) - fputc (c, DebugFile); -#endif } return 0; @@ -235,8 +209,6 @@ void imap_expunge_mailbox (IMAP_DATA * idata) h = idata->ctx->hdrs[i]; if (h->index == -1) { - debug_print (2, ("Expunging message UID %d.\n", HEADER_DATA (h)->uid)); - h->active = 0; /* free cached body from disk, if neccessary */ @@ -285,13 +257,6 @@ static int imap_get_delim (IMAP_DATA * idata) } while (rc == IMAP_CMD_CONTINUE); - if (rc != IMAP_CMD_OK) { - debug_print (1, ("failed.\n")); - return -1; - } - - debug_print (2, ("Delimiter: %c\n", idata->delim)); - return -1; } @@ -382,8 +347,6 @@ IMAP_DATA *imap_conn_find (const ACCOUNT * account, int flags) if (idata->state == IMAP_CONNECTED) { if (!imap_authenticate (idata)) { idata->state = IMAP_AUTHENTICATED; - if (idata->conn->ssf) - debug_print (2, ("Communication encrypted at %d bits\n", idata->conn->ssf)); } else mutt_account_unsetpass (&idata->conn->account); @@ -490,12 +453,10 @@ static char *imap_get_flags (string_list_t ** hflags, char *s) /* sanity-check string */ if (ascii_strncasecmp ("FLAGS", s, 5) != 0) { - debug_print (1, ("not a FLAGS response: %s\n", s)); return NULL; } s = vskipspaces(s + 5); if (*s != '(') { - debug_print (1, ("bogus FLAGS response: %s\n", s)); return NULL; } @@ -517,7 +478,6 @@ static char *imap_get_flags (string_list_t ** hflags, char *s) /* note bad flags response */ if (*s != ')') { - debug_print (1, ("Unterminated FLAGS response: %s\n", s)); string_list_wipe(hflags); return NULL; @@ -528,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; @@ -592,14 +552,12 @@ int imap_open_mailbox (CONTEXT * ctx) if (ascii_strncasecmp ("FLAGS", pc, 5) == 0) { /* don't override PERMANENTFLAGS */ if (!idata->flags) { - debug_print (2, ("Getting mailbox FLAGS\n")); if ((pc = imap_get_flags (&(idata->flags), pc)) == NULL) goto fail; } } /* PERMANENTFLAGS are massaged to look like FLAGS, then override FLAGS */ else if (ascii_strncasecmp ("OK [PERMANENTFLAGS", pc, 18) == 0) { - debug_print (2, ("Getting mailbox PERMANENTFLAGS\n")); /* safe to call on NULL */ string_list_wipe(&(idata->flags)); /* skip "OK [PERMANENT" so syntax is the same as FLAGS */ @@ -610,7 +568,6 @@ int imap_open_mailbox (CONTEXT * ctx) #ifdef USE_HCACHE /* save UIDVALIDITY for the header cache */ else if (ascii_strncasecmp ("OK [UIDVALIDITY", pc, 14) == 0) { - debug_print (2, ("Getting mailbox UIDVALIDITY\n")); pc += 3; pc = imap_next_word (pc); @@ -644,29 +601,9 @@ int imap_open_mailbox (CONTEXT * ctx) if (!ascii_strncasecmp (imap_get_qualifier (idata->cmd.buf), "[READ-ONLY]", 11) && !mutt_bit_isset (idata->capabilities, ACL)) { - debug_print (2, ("Mailbox is read-only.\n")); ctx->readonly = 1; } -#ifdef DEBUG - /* dump the mailbox flags we've found */ - if (DebugLevel > 2) { - if (!idata->flags) - debug_print (3, ("No folder flags found\n")); - else { - string_list_t *t = idata->flags; - - debug_print (3, ("Mailbox flags:\n")); - - t = t->next; - while (t) { - debug_print (3, ("[%s]\n", t->data)); - t = t->next; - } - } - } -#endif - if (mutt_bit_isset (idata->capabilities, ACL)) { if (imap_check_acl (idata)) goto fail; @@ -699,7 +636,6 @@ int imap_open_mailbox (CONTEXT * ctx) goto fail; } - debug_print (2, ("msgcount is %d\n", ctx->msgcount)); p_delete(&mx.mbox); return 0; @@ -767,7 +703,6 @@ void imap_logout (IMAP_DATA * idata) /* int imap_close_connection (CONTEXT *ctx) { - debug_print (1, (debugfile, "imap_close_connection(): closing connection\n")); if (CTX_DATA->status != IMAP_BYE) { mutt_message _("Closing connection to IMAP server..."); @@ -805,7 +740,7 @@ int imap_make_msg_set (IMAP_DATA * idata, BUFFER * buf, int flag, int changed) HEADER **hdrs; /* sorted local copy */ int count = 0; /* number of messages in message set */ int match = 0; /* whether current message matches flag condition */ - unsigned int setstart = 0; /* start of current message range */ + int setstart = 0; /* start of current message range */ int n; short oldsort; /* we clobber reverse, must restore it */ @@ -963,7 +898,6 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint) idata = (IMAP_DATA *) ctx->data; if (idata->state != IMAP_SELECTED) { - debug_print (2, ("no mailbox selected\n")); return -1; } @@ -1011,14 +945,11 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint) * This works better if we're expunging, of course. */ if ((ctx->hdrs[n]->env && (ctx->hdrs[n]->env->refs_changed || ctx->hdrs[n]->env->irt_changed)) || ctx->hdrs[n]->attach_del) { - debug_print (3, ("Attachments to be deleted, falling back to _mutt_save_message\n")); if (!appendctx) appendctx = mx_open_mailbox (ctx->path, M_APPEND | M_QUIET, NULL); - if (!appendctx) { - debug_print (1, ("Error opening mailbox in append mode\n")); - } - else + if (appendctx) { _mutt_save_message (ctx->hdrs[n], appendctx, 1, 0, 0); + } } if (imap_sync_message (idata, ctx->hdrs[n], &cmd, &err_continue) < 0) { @@ -1061,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; @@ -1106,7 +1037,7 @@ void imap_close_mailbox (CONTEXT * ctx) * 0 no change * -1 error */ -int imap_check_mailbox (CONTEXT * ctx, int *index_hint, int force) +int imap_check_mailbox (CONTEXT * ctx, int *index_hint __attribute__ ((unused)), int force) { /* overload keyboard timeout to avoid many mailbox checks in a row. * Most users don't like having to wait exactly when they press a key. */ @@ -1214,12 +1145,9 @@ int imap_mailbox_check (char *path, int new) if (isdigit ((unsigned char) *s)) { if (*s != '0') { msgcount = atoi (s); - debug_print (2, ("%d new messages in %s\n", msgcount, path)); } } } - else - debug_print (1, ("STATUS response doesn't match requested mailbox.\n")); } } while (rc == IMAP_CMD_CONTINUE); @@ -1460,8 +1388,7 @@ int imap_subscribe (char *path, int subscribe) err.dsize = sizeof (errstr); snprintf (mbox, sizeof (mbox), "%smailboxes \"%s\"", subscribe ? "" : "un", path); - if (mutt_parse_rc_line (mbox, &token, &err)) - debug_print (1, ("Error adding subscribed mailbox: %s\n", errstr)); + mutt_parse_rc_line (mbox, &token, &err); p_delete(&token.data); } @@ -1507,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); @@ -1616,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 */ @@ -1653,3 +1580,62 @@ 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]; + + mutt_mktemp (tmp); + if ((msg->fp = safe_fopen (tmp, "w")) == NULL) { + 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 = safe_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, +};