From 2f1ad7d6e2192e64ca6a5187ecf44a80b0425389 Mon Sep 17 00:00:00 2001 From: Steve Holme Date: Mon, 20 Feb 2012 12:18:22 +0000 Subject: [PATCH] smtp.c: Fixed an issue with writing postdata Fixed a problem in smtp_done() when writing out the postdata as Curl_write() would periodically return zero bytes written. --- lib/smtp.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/smtp.c b/lib/smtp.c index 3ee068692..b0b4d1aaa 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -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);