From 9114e639c4ce06ffc4588f11d90e048e8302512d Mon Sep 17 00:00:00 2001
From: Ben Noordhuis <info@bnoordhuis.nl>
Date: Wed, 16 Feb 2011 22:13:10 +0100
Subject: [PATCH 1/2] SMTP in multi mode: use Curl_ssl_connect_nonblocking() when connecting.

---
 lib/smtp.c |   13 ++++++++++---
 lib/smtp.h |    1 +
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/lib/smtp.c b/lib/smtp.c
index 71a9c6e..8d24a62 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -999,7 +999,14 @@ static CURLcode smtp_multi_statemach(struct connectdata *conn,
                                      bool *done)
 {
   struct smtp_conn *smtpc = &conn->proto.smtpc;
-  CURLcode result = Curl_pp_multi_statemach(&smtpc->pp);
+  CURLcode result;
+
+  if((conn->handler->protocol & CURLPROTO_SMTPS) && !smtpc->ssldone) {
+    result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &smtpc->ssldone);
+  }
+  else {
+    result = Curl_pp_multi_statemach(&smtpc->pp);
+  }
 
   *done = (bool)(smtpc->state == SMTP_STOP);
 
@@ -1114,8 +1121,8 @@ static CURLcode smtp_connect(struct connectdata *conn,
   }
 #endif /* !CURL_DISABLE_HTTP && !CURL_DISABLE_PROXY */
 
-  if(conn->handler->protocol & CURLPROTO_SMTPS) {
-    /* BLOCKING */
+  if((conn->handler->protocol & CURLPROTO_SMTPS) &&
+      data->state.used_interface != Curl_if_multi) {
     /* SMTPS is simply smtp with SSL for the control channel */
     /* now, perform the SSL initialization for this socket */
     result = Curl_ssl_connect(conn, FIRSTSOCKET);
diff --git a/lib/smtp.h b/lib/smtp.h
index 417fd52..e9050f8 100644
--- a/lib/smtp.h
+++ b/lib/smtp.h
@@ -57,6 +57,7 @@ struct smtp_conn {
   unsigned int authmechs;       /* Accepted authentication methods. */
   smtpstate state; /* always use smtp.c:state() to change state! */
   struct curl_slist *rcpt;
+  bool ssldone; /* is connect() over SSL done? only relevant in multi mode */
 };
 
 /* Authentication mechanism flags. */
-- 
1.7.0.4

