aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/imap.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/imap.c b/lib/imap.c
index 8f6aad7c6..a834c4e5f 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -1337,6 +1337,26 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
return result;
}
+/* For the final response to the FETCH command */
+static CURLcode imap_state_fetch_final_resp(struct connectdata *conn,
+ int imapcode,
+ imapstate instate)
+{
+ CURLcode result = CURLE_OK;
+
+ (void)instate; /* No use for this yet */
+
+ if('O' != imapcode)
+ result = CURLE_FTP_WEIRD_SERVER_REPLY; /* TODO: Fix error code */
+ else
+ result = CURLE_OK;
+
+ /* End of do phase */
+ state(conn, IMAP_STOP);
+
+ return result;
+}
+
static CURLcode imap_statemach_act(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
@@ -1435,6 +1455,10 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
result = imap_state_fetch_resp(conn, imapcode, imapc->state);
break;
+ case IMAP_FETCH_FINAL:
+ result = imap_state_fetch_final_resp(conn, imapcode, imapc->state);
+ break;
+
case IMAP_LOGOUT:
/* fallthrough, just stop! */
default:
@@ -1578,6 +1602,18 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
conn->bits.close = TRUE; /* marked for closure */
result = status; /* use the already set error code */
}
+ else if(!data->set.connect_only) {
+ state(conn, IMAP_FETCH_FINAL);
+
+ /* Run the state-machine
+
+ TODO: when the multi interface is used, this _really_ should be using
+ the imap_multi_statemach function but we have no general support for
+ non-blocking DONE operations, not in the multi state machine and with
+ Curl_done() invokes on several places in the code!
+ */
+ result = imap_block_statemach(conn);
+ }
/* Cleanup our per-request based variables */
Curl_safefree(imap->mailbox);