1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

SMTP-multi: non-blocking connect

Use Curl_ssl_connect_nonblocking() when upgrading the connection to
TLS/SSL while using the multi interface.
This commit is contained in:
Ben Noordhuis 2011-02-16 22:28:01 +01:00 committed by Daniel Stenberg
parent 88e825de86
commit 521e88e009
2 changed files with 31 additions and 5 deletions

View File

@ -115,6 +115,7 @@ static int smtp_getsock(struct connectdata *conn,
static CURLcode smtp_doing(struct connectdata *conn, static CURLcode smtp_doing(struct connectdata *conn,
bool *dophase_done); bool *dophase_done);
static CURLcode smtp_setup_connection(struct connectdata * conn); static CURLcode smtp_setup_connection(struct connectdata * conn);
static CURLcode smtp_state_upgrade_tls(struct connectdata *conn);
/* /*
@ -290,6 +291,7 @@ static void state(struct connectdata *conn,
"EHLO", "EHLO",
"HELO", "HELO",
"STARTTLS", "STARTTLS",
"UPGRADETLS",
"AUTHPLAIN", "AUTHPLAIN",
"AUTHLOGIN", "AUTHLOGIN",
"AUTHPASSWD", "AUTHPASSWD",
@ -481,13 +483,33 @@ static CURLcode smtp_state_starttls_resp(struct connectdata *conn,
result = smtp_authenticate(conn); result = smtp_authenticate(conn);
} }
else { else {
/* Curl_ssl_connect is BLOCKING */ if(data->state.used_interface == Curl_if_multi) {
state(conn, SMTP_UPGRADETLS);
return smtp_state_upgrade_tls(conn);
}
else {
result = Curl_ssl_connect(conn, FIRSTSOCKET); result = Curl_ssl_connect(conn, FIRSTSOCKET);
if(CURLE_OK == result) { if(CURLE_OK == result) {
smtp_to_smtps(conn); smtp_to_smtps(conn);
result = smtp_state_ehlo(conn); result = smtp_state_ehlo(conn);
} }
} }
}
return result;
}
static CURLcode smtp_state_upgrade_tls(struct connectdata *conn)
{
struct smtp_conn *smtpc = &conn->proto.smtpc;
CURLcode result;
result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &smtpc->ssldone);
if(smtpc->ssldone) {
smtp_to_smtps(conn);
result = smtp_state_ehlo(conn);
}
return result; return result;
} }
@ -910,6 +932,9 @@ static CURLcode smtp_statemach_act(struct connectdata *conn)
struct pingpong *pp = &smtpc->pp; struct pingpong *pp = &smtpc->pp;
size_t nread = 0; size_t nread = 0;
if(smtpc->state == SMTP_UPGRADETLS)
return smtp_state_upgrade_tls(conn);
if(pp->sendleft) if(pp->sendleft)
/* we have a piece of a command still left to send */ /* we have a piece of a command still left to send */
return Curl_pp_flushsend(pp); return Curl_pp_flushsend(pp);

View File

@ -34,6 +34,7 @@ typedef enum {
SMTP_EHLO, SMTP_EHLO,
SMTP_HELO, SMTP_HELO,
SMTP_STARTTLS, SMTP_STARTTLS,
SMTP_UPGRADETLS, /* asynchronously upgrade the connection to SSL/TLS (multi mode only) */
SMTP_AUTHPLAIN, SMTP_AUTHPLAIN,
SMTP_AUTHLOGIN, SMTP_AUTHLOGIN,
SMTP_AUTHPASSWD, SMTP_AUTHPASSWD,