diff options
author | Daniel Stenberg <daniel@haxx.se> | 2010-02-20 21:56:48 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2010-02-20 21:56:48 +0000 |
commit | a434cb43e807753730d815096464c9c7cb3f1596 (patch) | |
tree | b07e5774cdd5732f24f55136039f4037fd30a1cc /lib | |
parent | 846b926a3fd9078a4fa07f04b0ee4c9253831ce1 (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.c | 37 | ||||
-rw-r--r-- | lib/smtp.h | 1 |
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; |