]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: If connection isn't in selected state when deleting mailbox, don't try to...
authorTimo Sirainen <tss@iki.fi>
Wed, 24 Sep 2014 21:40:48 +0000 (00:40 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 24 Sep 2014 21:40:48 +0000 (00:40 +0300)
src/lib-imap-client/imapc-client.h
src/lib-imap-client/imapc-connection.c
src/lib-storage/index/imapc/imapc-list.c

index 456c76059dd6c2c5aa464e571ce8877df8077cd1..191db2ea623e3de0383a7063d33725239238589c 100644 (file)
@@ -146,11 +146,13 @@ imapc_client_cmd(struct imapc_client *client,
                 imapc_command_callback_t *callback, void *context);
 void imapc_command_set_flags(struct imapc_command *cmd,
                             enum imapc_command_flags flags);
+bool imapc_command_connection_is_selected(struct imapc_command *cmd);
 void imapc_command_send(struct imapc_command *cmd, const char *cmd_str);
 void imapc_command_sendf(struct imapc_command *cmd, const char *cmd_fmt, ...)
        ATTR_FORMAT(2, 3);
 void imapc_command_sendvf(struct imapc_command *cmd,
                          const char *cmd_fmt, va_list args) ATTR_FORMAT(2, 0);
+void imapc_command_abort(struct imapc_command **cmd);
 
 void imapc_client_register_untagged(struct imapc_client *client,
                                    imapc_untagged_callback_t *callback,
index bbf716043eb50696c3e813c8b9d77d77f8d0b413..34f3eb21b2add8a6e3a4b25b15b280f3ee29f111 100644 (file)
@@ -1481,6 +1481,14 @@ static void imapc_command_free(struct imapc_command *cmd)
        pool_unref(&cmd->pool);
 }
 
+void imapc_command_abort(struct imapc_command **_cmd)
+{
+       struct imapc_command *cmd = *_cmd;
+
+       *_cmd = NULL;
+       imapc_command_free(cmd);
+}
+
 static void imapc_command_timeout(struct imapc_connection *conn)
 {
        struct imapc_command *const *cmds;
@@ -1780,6 +1788,12 @@ void imapc_command_set_mailbox(struct imapc_command *cmd,
        box->pending_box_command_count++;
 }
 
+bool imapc_command_connection_is_selected(struct imapc_command *cmd)
+{
+       return cmd->conn->selected_box != NULL ||
+               cmd->conn->selecting_box != NULL;
+}
+
 void imapc_command_send(struct imapc_command *cmd, const char *cmd_str)
 {
        unsigned int len = strlen(cmd_str);
index 9ec6febdbe1f23bb6472e4b2a788a61cbea04b9e..e8ead79328c2a95a66248942f77f75b530ee4027 100644 (file)
@@ -800,12 +800,16 @@ imapc_list_delete_mailbox(struct mailbox_list *_list, const char *name)
        capa = imapc_client_get_capabilities(list->client->client);
 
        cmd = imapc_list_simple_context_init(&ctx, list);
-       imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
-       if ((capa & IMAPC_CAPABILITY_UNSELECT) != 0)
-               imapc_command_sendf(cmd, "UNSELECT");
-       else
-               imapc_command_sendf(cmd, "SELECT \"~~~\"");
-       imapc_simple_run(&ctx);
+       if (!imapc_command_connection_is_selected(cmd))
+               imapc_command_abort(&cmd);
+       else {
+               imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
+               if ((capa & IMAPC_CAPABILITY_UNSELECT) != 0)
+                       imapc_command_sendf(cmd, "UNSELECT");
+               else
+                       imapc_command_sendf(cmd, "SELECT \"~~~\"");
+               imapc_simple_run(&ctx);
+       }
 
        cmd = imapc_list_simple_context_init(&ctx, list);
        imapc_command_sendf(cmd, "DELETE %s", name);