]> granicus.if.org Git - mutt/commitdiff
Add imap_close_connection to fully reset IMAP state. (closes: #2717)
authorBrendan Cully <brendan@kublai.com>
Wed, 28 Feb 2007 17:47:13 +0000 (17:47 +0000)
committerBrendan Cully <brendan@kublai.com>
Wed, 28 Feb 2007 17:47:13 +0000 (17:47 +0000)
Thanks to Sergey Svishchev for the original patch.

imap/command.c
imap/imap.c
imap/imap_private.h

index faf6ae4baee7827497af19cbddf0464b6796b16f..d73d7ef4abb72a63534721ee29b4aea31df70d77 100644 (file)
@@ -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. */
index ebe02b1be679689dba8feb39275449dc13a8d4bc..50367309398e2754d9f67039d51db0c0ac07f1ce 100644 (file)
@@ -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)
index 4608ce15ed933e7643ca2816b16a2e807f57c455..6b94593333cda3b019be3b1972114ee46453d922 100644 (file)
@@ -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);