X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=imap%2Fimap.c;h=06e14edbc6fa15be2f79fda4d5757b68eb4041fc;hb=e5f7fde48e226cefc14f3b3b2f1039d530c73ab1;hp=202a10dfb267d98e4830b29763ab3f3354c13eb8;hpb=e01486aabea6f0af36933158bd58b9ab03b30add;p=apps%2Fmadmutt.git diff --git a/imap/imap.c b/imap/imap.c index 202a10d..06e14ed 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -16,6 +16,8 @@ #endif #include "mutt.h" +#include "ascii.h" +#include "buffer.h" #include "mutt_curses.h" #include "mx.h" #include "globals.h" @@ -65,7 +67,7 @@ int imap_access (const char *path, int flags) if (!(idata = imap_conn_find (&mx.account, option (OPTIMAPPASSIVE) ? M_IMAP_CONN_NONEW : 0))) { - FREE (&mx.mbox); + mem_free (&mx.mbox); return -1; } @@ -73,11 +75,11 @@ int imap_access (const char *path, int flags) /* we may already be in the folder we're checking */ if (!ascii_strcmp(idata->mailbox, mx.mbox)) { - FREE (&mx.mbox); + mem_free (&mx.mbox); return 0; } - FREE (&mx.mbox); + mem_free (&mx.mbox); imap_munge_mbox_name (mbox, sizeof (mbox), mailbox); if (mutt_bit_isset (idata->capabilities, IMAP4REV1)) @@ -137,7 +139,7 @@ int imap_delete_mailbox (CONTEXT * ctx, IMAP_MBOX mx) if (!(idata = imap_conn_find (&mx.account, option (OPTIMAPPASSIVE) ? M_IMAP_CONN_NONEW : 0))) { - FREE (&mx.mbox); + mem_free (&mx.mbox); return -1; } } @@ -240,7 +242,7 @@ void imap_expunge_mailbox (IMAP_DATA * idata) if (idata->cache[cacheno].uid == HEADER_DATA (h)->uid && idata->cache[cacheno].path) { unlink (idata->cache[cacheno].path); - FREE (&idata->cache[cacheno].path); + mem_free (&idata->cache[cacheno].path); } imap_free_header_data (&h->data); @@ -333,6 +335,7 @@ IMAP_DATA *imap_conn_find (const ACCOUNT * account, int flags) CONNECTION *conn; IMAP_DATA *idata; ACCOUNT *creds; + int new = 0; if (!(conn = mutt_conn_find (NULL, account))) return NULL; @@ -369,6 +372,7 @@ IMAP_DATA *imap_conn_find (const ACCOUNT * account, int flags) conn->data = idata; idata->conn = conn; + new = 1; } if (idata->state == IMAP_DISCONNECTED) @@ -382,10 +386,15 @@ IMAP_DATA *imap_conn_find (const ACCOUNT * account, int flags) else mutt_account_unsetpass (&idata->conn->account); - FREE (&idata->capstr); + mem_free (&idata->capstr); } - if (idata->state == IMAP_AUTHENTICATED) + if (new && idata->state == IMAP_AUTHENTICATED) { imap_get_delim (idata); + if (option (OPTIMAPCHECKSUBSCRIBED)) { + mutt_message _("Checking mailbox subscriptions"); + imap_exec (idata, "LSUB \"\" \"*\"", 0); + } + } return idata; } @@ -454,7 +463,7 @@ int imap_open_connection (IMAP_DATA * idata) idata->state = IMAP_AUTHENTICATED; if (imap_check_capabilities (idata) != 0) goto bail; - FREE (&idata->capstr); + mem_free (&idata->capstr); } else { imap_error ("imap_open_connection()", buf); @@ -467,7 +476,7 @@ err_close_conn: mutt_socket_close (idata->conn); idata->state = IMAP_DISCONNECTED; bail: - FREE (&idata->capstr); + mem_free (&idata->capstr); return -1; } @@ -549,12 +558,12 @@ int imap_open_mailbox (CONTEXT * ctx) /* Clean up path and replace the one in the ctx */ imap_fix_path (idata, mx.mbox, buf, sizeof (buf)); - FREE (&(idata->mailbox)); - idata->mailbox = safe_strdup (buf); + mem_free (&(idata->mailbox)); + idata->mailbox = str_dup (buf); imap_qualify_path (buf, sizeof (buf), &mx, idata->mailbox); - FREE (&(ctx->path)); - ctx->path = safe_strdup (buf); + mem_free (&(ctx->path)); + ctx->path = str_dup (buf); idata->ctx = ctx; @@ -682,8 +691,8 @@ int imap_open_mailbox (CONTEXT * ctx) } ctx->hdrmax = count; - ctx->hdrs = safe_calloc (count, sizeof (HEADER *)); - ctx->v2r = safe_calloc (count, sizeof (int)); + ctx->hdrs = mem_calloc (count, sizeof (HEADER *)); + ctx->v2r = mem_calloc (count, sizeof (int)); ctx->msgcount = 0; if (count && (imap_read_headers (idata, 0, count - 1) < 0)) { mutt_error _("Error opening mailbox"); @@ -693,14 +702,14 @@ int imap_open_mailbox (CONTEXT * ctx) } debug_print (2, ("msgcount is %d\n", ctx->msgcount)); - FREE (&mx.mbox); + mem_free (&mx.mbox); return 0; fail: if (idata->state == IMAP_SELECTED) idata->state = IMAP_AUTHENTICATED; fail_noidata: - FREE (&mx.mbox); + mem_free (&mx.mbox); return -1; } @@ -719,7 +728,7 @@ int imap_open_mailbox_append (CONTEXT * ctx) * ctx is brand new and mostly empty */ if (!(idata = imap_conn_find (&(mx.account), 0))) { - FREE(&mx.mbox); + mem_free(&mx.mbox); return (-1); } conn = idata->conn; @@ -729,7 +738,7 @@ int imap_open_mailbox_append (CONTEXT * ctx) imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox)); - FREE(&mx.mbox); + mem_free(&mx.mbox); /* really we should also check for W_OK */ if (!imap_access (ctx->path, F_OK)) @@ -753,8 +762,8 @@ void imap_logout (IMAP_DATA * idata) idata->status = IMAP_BYE; imap_cmd_start (idata, "LOGOUT"); while (imap_cmd_step (idata) == IMAP_CMD_CONTINUE); - FREE (&idata->cmd.buf); - FREE (&idata); + mem_free (&idata->cmd.buf); + mem_free (&idata); } /* @@ -781,7 +790,7 @@ static void imap_set_flag (IMAP_DATA * idata, int aclbit, int flag, { if (mutt_bit_isset (idata->rights, aclbit)) if (flag) - safe_strcat (flags, flsize, str); + str_cat (flags, flsize, str); } /* imap_make_msg_set: make an IMAP4rev1 UID message set out of a set of @@ -806,7 +815,7 @@ int imap_make_msg_set (IMAP_DATA * idata, BUFFER * buf, int flag, int changed) int started = 0; /* make copy of header pointers to sort in natural order */ - hdrs = safe_calloc (idata->ctx->msgcount, sizeof (HEADER *)); + hdrs = mem_calloc (idata->ctx->msgcount, sizeof (HEADER *)); memcpy (hdrs, idata->ctx->hdrs, idata->ctx->msgcount * sizeof (HEADER *)); if (Sort != SORT_ORDER) { @@ -862,7 +871,7 @@ int imap_make_msg_set (IMAP_DATA * idata, BUFFER * buf, int flag, int changed) } } - FREE (&hdrs); + mem_free (&hdrs); return count; } @@ -1045,10 +1054,10 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint) rc = 0; out: if (cmd.data) - FREE (&cmd.data); + mem_free (&cmd.data); if (appendctx) { mx_fastclose_mailbox (appendctx); - FREE (&appendctx); + mem_free (&appendctx); } return rc; } @@ -1074,7 +1083,7 @@ void imap_close_mailbox (CONTEXT * ctx) } idata->reopen &= IMAP_REOPEN_ALLOW; - FREE (&(idata->mailbox)); + mem_free (&(idata->mailbox)); mutt_free_list (&idata->flags); idata->ctx = NULL; } @@ -1086,7 +1095,7 @@ void imap_close_mailbox (CONTEXT * ctx) for (i = 0; i < IMAP_CACHE_LEN; i++) { if (idata->cache[i].path) { unlink (idata->cache[i].path); - FREE (&idata->cache[i].path); + mem_free (&idata->cache[i].path); } } } @@ -1108,7 +1117,7 @@ int imap_check_mailbox (CONTEXT * ctx, int *index_hint, int force) idata = (IMAP_DATA *) ctx->data; - if ((force || time (NULL) > idata->lastread + Timeout) + if ((force || time (NULL) >= idata->lastread + Timeout) && imap_exec (idata, "NOOP", 0) != 0) return -1; @@ -1155,13 +1164,13 @@ int imap_mailbox_check (char *path, int new) connflags = M_IMAP_CONN_NONEW; if (!(idata = imap_conn_find (&(mx.account), connflags))) { - FREE (&mx.mbox); + mem_free (&mx.mbox); return -1; } conn = idata->conn; imap_fix_path (idata, mx.mbox, buf, sizeof (buf)); - FREE (&mx.mbox); + mem_free (&mx.mbox); imap_munge_mbox_name (mbox, sizeof (mbox), buf); strfcpy (mbox_unquoted, buf, sizeof (mbox_unquoted)); @@ -1170,9 +1179,9 @@ int imap_mailbox_check (char *path, int new) * command on a mailbox that you have selected */ - if (mutt_strcmp (mbox_unquoted, idata->mailbox) == 0 + if (str_cmp (mbox_unquoted, idata->mailbox) == 0 || (ascii_strcasecmp (mbox_unquoted, "INBOX") == 0 - && safe_strcasecmp (mbox_unquoted, idata->mailbox) == 0)) { + && str_casecmp (mbox_unquoted, idata->mailbox) == 0)) { strfcpy (buf, "NOOP", sizeof (buf)); } else if (mutt_bit_isset (idata->capabilities, IMAP4REV1) || @@ -1197,8 +1206,8 @@ int imap_mailbox_check (char *path, int new) /* The mailbox name may or may not be quoted here. We could try to * munge the server response and compare with quoted (or vise versa) * but it is probably more efficient to just strncmp against both. */ - if (safe_strncmp (mbox_unquoted, s, mutt_strlen (mbox_unquoted)) == 0 - || safe_strncmp (mbox, s, mutt_strlen (mbox)) == 0) { + if (str_ncmp (mbox_unquoted, s, str_len (mbox_unquoted)) == 0 + || str_ncmp (mbox, s, str_len (mbox)) == 0) { s = imap_next_word (s); s = imap_next_word (s); if (isdigit ((unsigned char) *s)) { @@ -1297,6 +1306,8 @@ int imap_subscribe (char *path, int subscribe) IMAP_DATA *idata; char buf[LONG_STRING]; char mbox[LONG_STRING]; + char errstr[STRING]; + BUFFER err, token; IMAP_MBOX mx; if (mx_get_magic (path) == M_IMAP || imap_parse_path (path, &mx)) { @@ -1304,30 +1315,40 @@ int imap_subscribe (char *path, int subscribe) return -1; } - if (!(idata = imap_conn_find (&(mx.account), 0))) goto fail; conn = idata->conn; imap_fix_path (idata, mx.mbox, buf, sizeof (buf)); + + if (option (OPTIMAPCHECKSUBSCRIBED)) { + memset (&token, 0, sizeof (token)); + err.data = errstr; + 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)); + mem_free (&token.data); + } + if (subscribe) mutt_message (_("Subscribing to %s..."), buf); else mutt_message (_("Unsubscribing to %s..."), buf); imap_munge_mbox_name (mbox, sizeof (mbox), buf); - snprintf (buf, sizeof (buf), "%s %s", subscribe ? "SUBSCRIBE" : - "UNSUBSCRIBE", mbox); + snprintf (buf, sizeof (buf), "%sSUBSCRIBE %s", subscribe ? "" : "UN", mbox); if (imap_exec (idata, buf, 0) < 0) goto fail; - FREE (&mx.mbox); + mem_free (&mx.mbox); return 0; fail: - FREE (&mx.mbox); + mem_free (&mx.mbox); return -1; } @@ -1353,12 +1374,12 @@ static int imap_complete_hosts (char *dest, size_t len) { int matchlen; int i = 0; - matchlen = mutt_strlen (dest); + matchlen = str_len (dest); if (list_empty (Incoming)) return (-1); for (i = 0; i < Incoming->length; i++) { mailbox = (BUFFY*) Incoming->data[i]; - if (!safe_strncmp (dest, mailbox->path, matchlen)) { + if (!str_ncmp (dest, mailbox->path, matchlen)) { if (rc) { strfcpy (dest, mailbox->path, len); rc = 0; @@ -1379,7 +1400,7 @@ static int imap_complete_hosts (char *dest, size_t len) { url.user = NULL; url.path = NULL; url_ciss_tostring (&url, urlstr, sizeof (urlstr), 0); - if (!safe_strncmp (dest, urlstr, matchlen)) { + if (!str_ncmp (dest, urlstr, matchlen)) { if (rc) { strfcpy (dest, urlstr, len); rc = 0; @@ -1414,7 +1435,7 @@ int imap_complete (char *dest, size_t dlen, char *path) { /* don't open a new socket just for completion. Instead complete over * known mailboxes/hooks/etc */ if (!(idata = imap_conn_find (&(mx.account), M_IMAP_CONN_NONEW))) { - FREE (&mx.mbox); + mem_free (&mx.mbox); strfcpy (dest, path, dlen); return imap_complete_hosts (dest, dlen); } @@ -1447,14 +1468,14 @@ int imap_complete (char *dest, size_t dlen, char *path) { /* if the folder isn't selectable, append delimiter to force browse * to enter it on second tab. */ if (noselect) { - clen = mutt_strlen (list_word); + clen = str_len (list_word); list_word[clen++] = delim; list_word[clen] = '\0'; } /* copy in first word */ if (!completions) { strfcpy (completion, list_word, sizeof (completion)); - matchlen = mutt_strlen (completion); + matchlen = str_len (completion); completions++; continue; } @@ -1470,7 +1491,7 @@ int imap_complete (char *dest, size_t dlen, char *path) { imap_qualify_path (dest, dlen, &mx, completion); mutt_pretty_mailbox (dest); - FREE (&mx.mbox); + mem_free (&mx.mbox); return 0; }