aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2010-02-20 21:56:48 +0000
committerDaniel Stenberg <daniel@haxx.se>2010-02-20 21:56:48 +0000
commita434cb43e807753730d815096464c9c7cb3f1596 (patch)
treeb07e5774cdd5732f24f55136039f4037fd30a1cc /lib
parent846b926a3fd9078a4fa07f04b0ee4c9253831ce1 (diff)
- I made the SMTP code expect a 250 response back from the server after the
full DATA has been sent, and I modified the test SMTP server to also send that response. As usual, the DONE operation that is made after a completed transfer is still not doable in a non-blocking way so this waiting for 250 is unfortunately made blockingly.
Diffstat (limited to 'lib')
-rw-r--r--lib/smtp.c37
-rw-r--r--lib/smtp.h1
2 files changed, 38 insertions, 0 deletions
diff --git a/lib/smtp.c b/lib/smtp.c
index 7e3d4670c..f879651c6 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -232,6 +232,7 @@ static void state(struct connectdata *conn,
"MAIL",
"RCPT",
"DATA",
+ "POSTDATA",
"QUIT",
/* LAST */
};
@@ -424,6 +425,25 @@ static CURLcode smtp_state_data_resp(struct connectdata *conn,
return result;
}
+/* for the POSTDATA response, which is received after the entire DATA
+ part has been sent off to the server */
+static CURLcode smtp_state_postdata_resp(struct connectdata *conn,
+ int smtpcode,
+ smtpstate instate)
+{
+ CURLcode result = CURLE_OK;
+ struct SessionHandle *data = conn->data;
+ struct FTP *smtp = data->state.proto.smtp;
+
+ (void)instate; /* no use for this yet */
+
+ if(smtpcode != 250)
+ result = CURLE_RECV_ERROR;
+
+ state(conn, SMTP_STOP);
+ return result;
+}
+
static CURLcode smtp_statemach_act(struct connectdata *conn)
{
CURLcode result;
@@ -484,6 +504,10 @@ static CURLcode smtp_statemach_act(struct connectdata *conn)
result = smtp_state_data_resp(conn, smtpcode, smtpc->state);
break;
+ case SMTP_POSTDATA:
+ result = smtp_state_postdata_resp(conn, smtpcode, smtpc->state);
+ break;
+
case SMTP_QUIT:
/* fallthrough, just stop! */
default:
@@ -691,6 +715,19 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
SMTP_EOB_LEN, /* buffer size */
&bytes_written); /* actually sent away */
+
+ if(status == CURLE_OK) {
+ state(conn, SMTP_POSTDATA);
+ /* run the state-machine
+
+ TODO: when the multi interface is used, this _really_ should be using
+ the smtp_multi_statemach function but we have no general support for
+ non-blocking DONE operations, not in the multi state machine and with
+ Curl_done() invokes on several places in the code!
+ */
+ result = smtp_easy_statemach(conn);
+ }
+
/* clear these for next connection */
smtp->transfer = FTPTRANSFER_BODY;
diff --git a/lib/smtp.h b/lib/smtp.h
index cc581d4d5..02cd467f5 100644
--- a/lib/smtp.h
+++ b/lib/smtp.h
@@ -37,6 +37,7 @@ typedef enum {
SMTP_MAIL, /* MAIL FROM */
SMTP_RCPT, /* RCPT TO */
SMTP_DATA,
+ SMTP_POSTDATA,
SMTP_QUIT,
SMTP_LAST /* never used */
} smtpstate;