mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
imap: Added list perform and response handler functions
This commit is contained in:
parent
041754e3fa
commit
742544aad0
65
lib/imap.c
65
lib/imap.c
@ -397,6 +397,11 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IMAP_LIST:
|
||||||
|
if(!imap_matchresp(line, len, "LIST"))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
case IMAP_SELECT:
|
case IMAP_SELECT:
|
||||||
/* SELECT is special in that its untagged responses does not have a
|
/* SELECT is special in that its untagged responses does not have a
|
||||||
common prefix so accept anything! */
|
common prefix so accept anything! */
|
||||||
@ -681,6 +686,30 @@ static CURLcode imap_authenticate(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Start the DO phase */
|
/* Start the DO phase */
|
||||||
|
static CURLcode imap_list(struct connectdata *conn)
|
||||||
|
{
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
struct IMAP *imap = data->state.proto.imap;
|
||||||
|
struct imap_conn *imapc = &conn->proto.imapc;
|
||||||
|
char *mailbox;
|
||||||
|
|
||||||
|
/* Make sure the mailbox is in the correct atom format */
|
||||||
|
mailbox = imap_atom(imap->mailbox ? imap->mailbox : "");
|
||||||
|
if(!mailbox)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
/* Send the LIST command */
|
||||||
|
result = imap_sendf(conn, "LIST \"%s\" *", mailbox);
|
||||||
|
|
||||||
|
Curl_safefree(mailbox);
|
||||||
|
|
||||||
|
if(!result)
|
||||||
|
state(conn, IMAP_LIST);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static CURLcode imap_select(struct connectdata *conn)
|
static CURLcode imap_select(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
@ -1278,6 +1307,38 @@ static CURLcode imap_state_login_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For LIST responses */
|
||||||
|
static CURLcode imap_state_list_resp(struct connectdata *conn, int imapcode,
|
||||||
|
imapstate instate)
|
||||||
|
{
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
char *line = conn->data->state.buffer;
|
||||||
|
size_t len = strlen(line);
|
||||||
|
|
||||||
|
(void)instate; /* No use for this yet */
|
||||||
|
|
||||||
|
if(imapcode == '*') {
|
||||||
|
/* The client which asked for this custom command should know best
|
||||||
|
how to cope with the result, just send it as body.
|
||||||
|
Add back the LF character temporarily while saving. */
|
||||||
|
line[len] = '\n';
|
||||||
|
result = Curl_client_write(conn, CLIENTWRITE_BODY, line, len + 1);
|
||||||
|
line[len] = '\0';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Final response. Stop and return the final status. */
|
||||||
|
if(imapcode != 'O')
|
||||||
|
result = CURLE_QUOTE_ERROR; /* TODO: Fix error code */
|
||||||
|
else
|
||||||
|
result = CURLE_OK;
|
||||||
|
|
||||||
|
/* End of DO phase */
|
||||||
|
state(conn, IMAP_STOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* For SELECT responses */
|
/* For SELECT responses */
|
||||||
static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode,
|
static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode,
|
||||||
imapstate instate)
|
imapstate instate)
|
||||||
@ -1605,6 +1666,10 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
|
|||||||
result = imap_state_login_resp(conn, imapcode, imapc->state);
|
result = imap_state_login_resp(conn, imapcode, imapc->state);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IMAP_LIST:
|
||||||
|
result = imap_state_list_resp(conn, imapcode, imapc->state);
|
||||||
|
break;
|
||||||
|
|
||||||
case IMAP_SELECT:
|
case IMAP_SELECT:
|
||||||
result = imap_state_select_resp(conn, imapcode, imapc->state);
|
result = imap_state_select_resp(conn, imapcode, imapc->state);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user