From: Brendan Cully Date: Wed, 28 Feb 2007 17:47:13 +0000 (+0000) Subject: Add imap_close_connection to fully reset IMAP state. (closes: #2717) X-Git-Tag: mutt-1-5-15-rel~47^2~36 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e6ab46cf0f8ccf9549da6fe5f8fc20a03d8c88e9;p=mutt Add imap_close_connection to fully reset IMAP state. (closes: #2717) Thanks to Sergey Svishchev for the original patch. --- diff --git a/imap/command.c b/imap/command.c index faf6ae4b..d73d7ef4 100644 --- a/imap/command.c +++ b/imap/command.c @@ -375,11 +375,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; - } + imap_close_connection (idata); } /* cmd_handle_untagged: fallback parser for otherwise unhandled messages. */ diff --git a/imap/imap.c b/imap/imap.c index ebe02b1b..50367309 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -399,8 +399,7 @@ int imap_open_connection (IMAP_DATA* idata) if (imap_cmd_step (idata) != IMAP_CMD_CONTINUE) { - mutt_socket_close (idata->conn); - idata->state = IMAP_DISCONNECTED; + imap_close_connection (idata); return -1; } @@ -467,14 +466,21 @@ int imap_open_connection (IMAP_DATA* idata) #if defined(USE_SSL) err_close_conn: - mutt_socket_close (idata->conn); - idata->state = IMAP_DISCONNECTED; + imap_close_connection (idata); #endif bail: FREE (&idata->capstr); return -1; } +void imap_close_connection(IMAP_DATA* idata) +{ + mutt_socket_close (idata->conn); + idata->state = IMAP_DISCONNECTED; + idata->seqno = idata->nextcmd = idata->lastcmd = idata->status = 0; + memset (idata->cmds, 0, sizeof (IMAP_COMMAND) * IMAP_PIPELINE_DEPTH); +} + /* imap_get_flags: Make a simple list out of a FLAGS response. * return stream following FLAGS response */ static char* imap_get_flags (LIST** hflags, char* s) diff --git a/imap/imap_private.h b/imap/imap_private.h index 4608ce15..6b945933 100644 --- a/imap/imap_private.h +++ b/imap/imap_private.h @@ -235,6 +235,7 @@ void imap_mboxcache_free (IMAP_DATA* idata); int imap_make_msg_set (IMAP_DATA* idata, BUFFER* buf, int flag, int changed, int invert); int imap_open_connection (IMAP_DATA* idata); +void imap_close_connection (IMAP_DATA* idata); IMAP_DATA* imap_conn_find (const ACCOUNT* account, int flags); int imap_read_literal (FILE* fp, IMAP_DATA* idata, long bytes, progress_t*); void imap_expunge_mailbox (IMAP_DATA* idata);