From: pdmef Date: Wed, 27 Jul 2005 02:39:27 +0000 (+0000) Subject: Rocco Rutte: X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=commitdiff_plain;h=cee79e37906a9ce36e9f92905da773841ec7c194 Rocco Rutte: - merge in latest mutt changes git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@355 e385b8ad-14ed-0310-8656-cc95a2468c6d --- diff --git a/ChangeLog.mutt b/ChangeLog.mutt index d72a363..8e12b1b 100644 --- a/ChangeLog.mutt +++ b/ChangeLog.mutt @@ -1,3 +1,19 @@ +2005-07-27 00:40:15 Brendan Cully (brendan) + + * imap/command.c: More fiddling with fatal state handling. Not + tested, and probably as wrong as what was already there. + +2005-07-27 00:32:18 Brendan Cully (brendan) + + * muttlib.c: Rework mutt_save_confirm to support confirmappend + with IMAP mailboxes. I hope I got all cases right. + +2005-07-26 23:57:38 Brendan Cully (brendan) + + * imap/imap.c: Adjust imap_access so that it doesn't issue STATUS + on the selected mailbox, and have imap_open_mailbox_append use + imap_access instead of rolling its own. + 2005-07-26 18:45:01 TAKAHASHI Tamotsu (brendan) * crypt-gpgme.c, mutt_ssl_gnutls.c, po/POTFILES.in: Partial diff --git a/imap/command.c b/imap/command.c index ba9d666..40a1cf3 100644 --- a/imap/command.c +++ b/imap/command.c @@ -279,8 +279,8 @@ static void cmd_handle_fatal (IMAP_DATA * idata) idata->status = IMAP_FATAL; if ((idata->state == IMAP_SELECTED) && - (idata->reopen & IMAP_REOPEN_ALLOW) && !idata->ctx->closing) { - /*mx_fastclose_mailbox (idata->ctx); */ + (idata->reopen & IMAP_REOPEN_ALLOW)) { + /* mx_fastclose_mailbox (idata->ctx); */ mutt_error (_("Mailbox closed")); mutt_sleep (1); idata->state = IMAP_DISCONNECTED; @@ -290,6 +290,7 @@ static void cmd_handle_fatal (IMAP_DATA * idata) if (idata->state != IMAP_SELECTED) { idata->state = IMAP_DISCONNECTED; + mutt_socket_close (idata->conn); idata->status = 0; } } @@ -359,17 +360,9 @@ static int cmd_handle_untagged (IMAP_DATA * idata) s += 3; SKIPWS (s); mutt_error ("%s", s); - idata->status = IMAP_BYE; - - /*if (imap_reconnect(idata->ctx)!=0) { - if (idata->state == IMAP_SELECTED) - mx_fastclose_mailbox (idata->ctx); *//* XXX memleak? */ - mutt_socket_close (idata->conn); - idata->state = IMAP_DISCONNECTED; + mutt_sleep (2); + cmd_handle_fatal (idata); return -1; - /*} else { - return 0; - } */ } else if (option (OPTIMAPSERVERNOISE) && (ascii_strncasecmp ("NO", s, 2) == 0)) { diff --git a/imap/imap.c b/imap/imap.c index 099be62..2a4dff5 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -47,7 +47,9 @@ static int imap_check_capabilities (IMAP_DATA * idata); static void imap_set_flag (IMAP_DATA * idata, int aclbit, int flag, const char *str, char *flags, size_t flsize); -/* imap_access: Check permissions on an IMAP mailbox. */ +/* 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) { IMAP_DATA *idata; @@ -67,10 +69,16 @@ 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)) { + FREE (&mx.mbox); + return 0; + } + FREE (&mx.mbox); imap_munge_mbox_name (mbox, sizeof (mbox), mailbox); - /* TODO: ACL checks. Right now we assume if it exists we can mess with it. */ if (mutt_bit_isset (idata->capabilities, IMAP4REV1)) snprintf (buf, sizeof (buf), "STATUS %s (UIDVALIDITY)", mbox); else if (mutt_bit_isset (idata->capabilities, STATUS)) @@ -694,9 +702,8 @@ int imap_open_mailbox_append (CONTEXT * ctx) { CONNECTION *conn; IMAP_DATA *idata; - char buf[LONG_STRING], mbox[LONG_STRING]; + char buf[LONG_STRING]; char mailbox[LONG_STRING]; - int r; IMAP_MBOX mx; if (imap_parse_path (ctx->path, &mx)) @@ -705,58 +712,31 @@ int imap_open_mailbox_append (CONTEXT * ctx) /* in APPEND mode, we appear to hijack an existing IMAP connection - * ctx is brand new and mostly empty */ - if (!(idata = imap_conn_find (&(mx.account), 0))) - goto fail; + if (!(idata = imap_conn_find (&(mx.account), 0))) { + FREE(&mx.mbox); + return (-1); + } conn = idata->conn; ctx->magic = M_IMAP; ctx->data = idata; - /* check mailbox existance */ - imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox)); - /* We may be appending to the same folder we've selected. */ - if (!ascii_strcmp(idata->mailbox, mx.mbox)) { - FREE (&mx.mbox); - return 0; - } - - imap_munge_mbox_name (mbox, sizeof (mbox), mailbox); + FREE(&mx.mbox); - if (mutt_bit_isset (idata->capabilities, IMAP4REV1)) - snprintf (buf, sizeof (buf), "STATUS %s (UIDVALIDITY)", mbox); - else if (mutt_bit_isset (idata->capabilities, STATUS)) - /* We have no idea what the other guy wants. UW imapd 8.3 wants this - * (but it does not work if another mailbox is selected) */ - snprintf (buf, sizeof (buf), "STATUS %s (UID-VALIDITY)", mbox); - else { - /* STATUS not supported */ - mutt_message _("Unable to append to IMAP mailboxes at this server"); - - goto fail; - } - - r = imap_exec (idata, buf, IMAP_CMD_FAIL_OK); - if (r == -2) { - /* command failed cause folder doesn't exist */ - snprintf (buf, sizeof (buf), _("Create %s?"), mailbox); - if (option (OPTCONFIRMCREATE) && mutt_yesorno (buf, 1) < 1) - goto fail; + /* really we should also check for W_OK */ + if (!imap_access (ctx->path, F_OK)) + return 0; - if (imap_create_mailbox (idata, mailbox) < 0) - goto fail; - } - else if (r == -1) - /* Hmm, some other failure */ - goto fail; + snprintf (buf, sizeof (buf), _("Create %s?"), mailbox); + if (option (OPTCONFIRMCREATE) && mutt_yesorno (buf, 1) < 1) + return -1; - FREE (&mx.mbox); - return 0; + if (imap_create_mailbox (idata, mailbox) < 0) + return -1; -fail: - FREE (&mx.mbox); - return -1; + return (0); } /* imap_logout: Gracefully log out of server. */ @@ -1079,12 +1059,11 @@ void imap_close_mailbox (CONTEXT * ctx) return; if (ctx == idata->ctx) { - if (idata->state == IMAP_SELECTED) { + if (idata->state != IMAP_FATAL && idata->state == IMAP_SELECTED) { /* mx_close_mailbox won't sync if there are no deleted messages * and the mailbox is unchanged, so we may have to close here */ - if (idata->status != IMAP_FATAL && !ctx->deleted && - imap_exec (idata, "CLOSE", 0)) - mutt_error (_("CLOSE failed")); + if (!ctx->deleted && imap_exec (idata, "CLOSE", 0)) + mutt_error (_("CLOSE failed")); idata->state = IMAP_AUTHENTICATED; } diff --git a/muttlib.c b/muttlib.c index 72566aa..94c7816 100644 --- a/muttlib.c +++ b/muttlib.c @@ -1225,16 +1225,10 @@ int mutt_save_confirm (const char *s, struct stat *st) } #endif - if (stat (s, st) != -1) { - if (magic == -1) { - mutt_error (_("%s is not a mailbox!"), s); - return 1; - } - + if (magic > 0 && !mx_access (s, W_OK)) { if (option (OPTCONFIRMAPPEND) && - (!TrashPath || (mutt_strcmp (s, TrashPath) != 0))) + (!TrashPath || (mutt_strcmp (s, TrashPath) != 0))) { /* if we're appending to the trash, there's no point in asking */ - { snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s); if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO) ret = 1; @@ -1242,6 +1236,13 @@ int mutt_save_confirm (const char *s, struct stat *st) ret = -1; } } + + if (stat (s, st) != -1) { + if (magic == -1) { + mutt_error (_("%s is not a mailbox!"), s); + return 1; + } + } else { #ifdef USE_IMAP if (magic != M_IMAP)