]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
smtp.c: Fixed an issue with writing postdata
authorSteve Holme <steve_holme@hotmail.com>
Mon, 20 Feb 2012 12:18:22 +0000 (12:18 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 21 Feb 2012 21:50:46 +0000 (22:50 +0100)
Fixed a problem in smtp_done() when writing out the postdata as
Curl_write() would periodically return zero bytes written.

lib/smtp.c

index 3ee068692d43953ead7d876655480c05cd3db658..b0b4d1aaaba2aa15ccc6b12e31e3e374465ecf80 100644 (file)
@@ -1035,6 +1035,7 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn,
 
     /* send DATA */
     result = Curl_pp_sendf(&conn->proto.smtpc.pp, "DATA");
+
     if(result)
       return result;
 
@@ -1392,9 +1393,6 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
     struct smtp_conn *smtpc = &conn->proto.smtpc;
     struct pingpong *pp = &smtpc->pp;
 
-    /* TODO: make this work even when the socket is EWOULDBLOCK in this
-       call! */
-
     /* Send the end of block data */
     result = Curl_write(conn,
                         conn->writesockfd,  /* socket to send to */
@@ -1402,7 +1400,19 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
                         SMTP_EOB_LEN,       /* buffer size */
                         &bytes_written);    /* actually sent away */
 
-    pp->response = Curl_tvnow(); /* timeout relative now */
+    if(result)
+      return result;
+
+    if(bytes_written != SMTP_EOB_LEN) {
+      /* The whole chunk was not sent so keep it around and adjust the
+         pingpong structure accordingly */
+      pp->sendthis = strdup(SMTP_EOB);
+      pp->sendsize = SMTP_EOB_LEN;
+      pp->sendleft = SMTP_EOB_LEN - bytes_written;
+    }
+    else
+      /* Successfully sent so adjust the response timeout relative to now */
+      pp->response = Curl_tvnow();
 
     state(conn, SMTP_POSTDATA);