From 2476b34b95596ec16aab09c85133bc7eddd8ca53 Mon Sep 17 00:00:00 2001 From: Jiri Hruska Date: Sat, 23 Feb 2013 10:29:40 +0100 Subject: [PATCH] imap: Introduced a custom IMAP structure for per-request data Created a new IMAP structure and changed the type of the imap proto variable in connectdata from FTP* to the new IMAP*. Moved the mailbox variable from the per-connection struct imap_conn to the new per-request struct and fixed references accordingly. --- lib/imap.c | 26 +++++++++++++------------- lib/imap.h | 14 +++++++++++++- lib/urldata.h | 2 +- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/lib/imap.c b/lib/imap.c index 4621a8ff6..cff4d8133 100644 --- a/lib/imap.c +++ b/lib/imap.c @@ -523,7 +523,7 @@ static CURLcode imap_state_upgrade_tls(struct connectdata *conn) static CURLcode imap_state_login(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct FTP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->state.proto.imap; char *user; char *passwd; @@ -1088,10 +1088,11 @@ static CURLcode imap_state_login_resp(struct connectdata *conn, static CURLcode imap_select(struct connectdata *conn) { CURLcode result = CURLE_OK; - struct imap_conn *imapc = &conn->proto.imapc; + struct SessionHandle *data = conn->data; + struct IMAP *imap = data->state.proto.imap; result = imap_sendf(conn, "SELECT %s", - imapc->mailbox ? imapc->mailbox : ""); + imap->mailbox ? imap->mailbox : ""); if(result) return result; @@ -1151,7 +1152,7 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode, CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; struct imap_conn *imapc = &conn->proto.imapc; - struct FTP *imap = data->state.proto.imap; + struct IMAP *imap = data->state.proto.imap; struct pingpong *pp = &imapc->pp; const char *ptr = data->state.buffer; @@ -1365,10 +1366,10 @@ static CURLcode imap_block_statemach(struct connectdata *conn) static CURLcode imap_init(struct connectdata *conn) { struct SessionHandle *data = conn->data; - struct FTP *imap = data->state.proto.imap; + struct IMAP *imap = data->state.proto.imap; if(!imap) { - imap = data->state.proto.imap = calloc(sizeof(struct FTP), 1); + imap = data->state.proto.imap = calloc(sizeof(struct IMAP), 1); if(!imap) return CURLE_OUT_OF_MEMORY; } @@ -1456,8 +1457,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status, { CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - struct FTP *imap = data->state.proto.imap; - struct imap_conn *imapc= &conn->proto.imapc; + struct IMAP *imap = data->state.proto.imap; (void)premature; @@ -1475,7 +1475,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status, } /* Cleanup our per-request based variables */ - Curl_safefree(imapc->mailbox); + Curl_safefree(imap->mailbox); /* Clear the transfer mode for the next connection */ imap->transfer = FTPTRANSFER_BODY; @@ -1500,7 +1500,7 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected, if(conn->data->set.opt_no_body) { /* Requested no body means no transfer */ - struct FTP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->state.proto.imap; imap->transfer = FTPTRANSFER_INFO; } @@ -1621,21 +1621,21 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection) static CURLcode imap_parse_url_path(struct connectdata *conn) { /* The imap struct is already inited in imap_connect() */ - struct imap_conn *imapc = &conn->proto.imapc; struct SessionHandle *data = conn->data; + struct IMAP *imap = data->state.proto.imap; const char *path = data->state.path; if(!*path) path = "INBOX"; /* URL decode the path and use this mailbox */ - return Curl_urldecode(data, path, 0, &imapc->mailbox, NULL, TRUE); + return Curl_urldecode(data, path, 0, &imap->mailbox, NULL, TRUE); } /* Call this when the DO phase has completed */ static CURLcode imap_dophase_done(struct connectdata *conn, bool connected) { - struct FTP *imap = conn->data->state.proto.imap; + struct IMAP *imap = conn->data->state.proto.imap; (void)connected; diff --git a/lib/imap.h b/lib/imap.h index 31888529a..acec210b0 100644 --- a/lib/imap.h +++ b/lib/imap.h @@ -23,6 +23,7 @@ ***************************************************************************/ #include "pingpong.h" +#include "ftp.h" /**************************************************************************** * IMAP unique setup @@ -51,11 +52,22 @@ typedef enum { IMAP_LAST /* never used */ } imapstate; +/* This IMAP struct is used in the SessionHandle. All IMAP data that is + connection-oriented must be in imap_conn to properly deal with the fact that + perhaps the SessionHandle is changed between the times the connection is + used. */ +struct IMAP { + curl_off_t *bytecountp; + char *user; /* User name string */ + char *passwd; /* Password string */ + curl_ftptransfer transfer; + char *mailbox; /* Mailbox to select */ +}; + /* imap_conn is used for struct connection-oriented data in the connectdata struct */ struct imap_conn { struct pingpong pp; - char *mailbox; /* Mailbox to select */ unsigned int authmechs; /* Accepted authentication mechanisms */ unsigned int authused; /* Auth mechanism used for the connection */ imapstate state; /* Always use imap.c:state() to change state! */ diff --git a/lib/urldata.h b/lib/urldata.h index d564ae1da..dd592521a 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1292,7 +1292,7 @@ struct UrlState { void *telnet; /* private for telnet.c-eyes only */ void *generic; struct SSHPROTO *ssh; - struct FTP *imap; + struct IMAP *imap; struct FTP *pop3; struct FTP *smtp; } proto;