Lines Matching full:s
309 static enum smtp_session_state smtp_prepare_mail(struct smtp_session *s, u16_t *tx_buf_len);
310 static void smtp_send_body(struct smtp_session *s, struct altcp_pcb *pcb);
313 static void smtp_send_body_data_handler(struct smtp_session *s, struct altcp_pcb *pcb);
446 static void smtp_free_struct(struct smtp_session *s) in smtp_free_struct() argument
448 if (s->bodydh != NULL) { in smtp_free_struct()
449 SMTP_BODYDH_FREE(s->bodydh); in smtp_free_struct()
451 SMTP_STATE_FREE(s); in smtp_free_struct()
458 smtp_setup_pcb(struct smtp_session *s, const ip_addr_t* remote_ip) in smtp_setup_pcb() argument
472 altcp_arg(pcb, s); in smtp_setup_pcb()
485 smtp_send_mail_alloced(struct smtp_session *s) in smtp_send_mail_alloced() argument
491 LWIP_ASSERT("no smtp_session supplied", s != NULL); in smtp_send_mail_alloced()
498 if (smtp_verify(s->to, s->to_len, 0) != ERR_OK) { in smtp_send_mail_alloced()
502 if (smtp_verify(s->from, s->from_len, 0) != ERR_OK) { in smtp_send_mail_alloced()
506 if (smtp_verify(s->subject, s->subject_len, 0) != ERR_OK) { in smtp_send_mail_alloced()
511 if (s->bodydh == NULL) in smtp_send_mail_alloced()
514 if (smtp_verify(s->body, s->body_len, 0) != ERR_OK) { in smtp_send_mail_alloced()
523 MEMCPY(s->auth_plain + 1, smtp_auth_plain + 1, smtp_auth_plain_len - 1); in smtp_send_mail_alloced()
524 s->auth_plain_len = smtp_auth_plain_len; in smtp_send_mail_alloced()
526 s->username = s->auth_plain; in smtp_send_mail_alloced()
527 s->pass = s->auth_plain; in smtp_send_mail_alloced()
529 s->username += smtp_username - smtp_auth_plain; in smtp_send_mail_alloced()
532 s->pass += smtp_pass - smtp_auth_plain; in smtp_send_mail_alloced()
536 s->state = SMTP_NULL; in smtp_send_mail_alloced()
537 s->timer = SMTP_TIMEOUT; in smtp_send_mail_alloced()
540 err = dns_gethostbyname(smtp_server, &addr, smtp_dns_found, s); in smtp_send_mail_alloced()
545 pcb = smtp_setup_pcb(s, &addr); in smtp_send_mail_alloced()
567 smtp_free_struct(s); in smtp_send_mail_alloced()
589 struct smtp_session* s; in smtp_send_mail() local
605 /* Allocate memory to keep this email's session state */ in smtp_send_mail()
606 s = (struct smtp_session *)SMTP_STATE_MALLOC((mem_size_t)mem_len); in smtp_send_mail()
607 if (s == NULL) { in smtp_send_mail()
611 memset(s, 0, mem_len); in smtp_send_mail()
612 s->from = sfrom = (char*)s + sizeof(struct smtp_session); in smtp_send_mail()
613 s->from_len = (u16_t)from_len; in smtp_send_mail()
614 s->to = sto = sfrom + from_len + 1; in smtp_send_mail()
615 s->to_len = (u16_t)to_len; in smtp_send_mail()
616 s->subject = ssubject = sto + to_len + 1; in smtp_send_mail()
617 s->subject_len = (u16_t)subject_len; in smtp_send_mail()
618 s->body = sbody = ssubject + subject_len + 1; in smtp_send_mail()
619 s->body_len = (u16_t)body_len; in smtp_send_mail()
627 s->callback_fn = callback_fn; in smtp_send_mail()
628 s->callback_arg = callback_arg; in smtp_send_mail()
631 return smtp_send_mail_alloced(s); in smtp_send_mail()
644 struct smtp_session* s; in smtp_send_mail_static() local
649 s = (struct smtp_session*)SMTP_STATE_MALLOC(sizeof(struct smtp_session)); in smtp_send_mail_static()
650 if (s == NULL) { in smtp_send_mail_static()
653 memset(s, 0, sizeof(struct smtp_session)); in smtp_send_mail_static()
655 s->from = from; in smtp_send_mail_static()
658 s->from_len = (u16_t)len; in smtp_send_mail_static()
659 s->to = to; in smtp_send_mail_static()
662 s->to_len = (u16_t)len; in smtp_send_mail_static()
663 s->subject = subject; in smtp_send_mail_static()
666 s->subject_len = (u16_t)len; in smtp_send_mail_static()
667 s->body = body; in smtp_send_mail_static()
670 s->body_len = (u16_t)len; in smtp_send_mail_static()
671 s->callback_fn = callback_fn; in smtp_send_mail_static()
672 s->callback_arg = callback_arg; in smtp_send_mail_static()
674 return smtp_send_mail_alloced(s); in smtp_send_mail_static()
729 LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: no 8-bit data supported: %s\n", data)); in smtp_verify()
734 … LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found CR where no linebreaks allowed: %s\n", data)); in smtp_verify()
738 LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found double CR: %s\n", data)); in smtp_verify()
745 LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found LF without CR before: %s\n", data)); in smtp_verify()
758 smtp_free(struct smtp_session *s, u8_t result, u16_t srv_err, err_t err) in smtp_free() argument
760 smtp_result_fn fn = s->callback_fn; in smtp_free()
761 void *arg = s->callback_arg; in smtp_free()
762 if (s->p != NULL) { in smtp_free()
763 pbuf_free(s->p); in smtp_free()
765 smtp_free_struct(s); in smtp_free()
773 smtp_close(struct smtp_session *s, struct altcp_pcb *pcb, u8_t result, in smtp_close() argument
779 if (s != NULL) { in smtp_close()
780 smtp_free(s, result, srv_err, err); in smtp_close()
784 altcp_arg(pcb, s); in smtp_close()
787 if (s != NULL) { in smtp_close()
788 smtp_free(s, result, srv_err, err); in smtp_close()
809 struct smtp_session *s = (struct smtp_session*)arg; in smtp_tcp_poll() local
810 if (s->timer != 0) { in smtp_tcp_poll()
811 s->timer--; in smtp_tcp_poll()
866 struct smtp_session *s = (struct smtp_session*)arg; in smtp_dns_found() local
874 pcb = smtp_setup_pcb(s, ipaddr); in smtp_dns_found()
889 LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_dns_found: failed to resolve hostname: %s\n", in smtp_dns_found()
895 smtp_close(s, pcb, result, 0, err); in smtp_dns_found()
905 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
908 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
953 * @param s smtp session struct
956 smtp_is_response(struct smtp_session *s) in smtp_is_response() argument
961 if (s->p == NULL) { in smtp_is_response()
965 if (pbuf_copy_partial(s->p, digits, 3, 0) != 3) { in smtp_is_response()
985 * @param s smtp session struct
988 smtp_is_response_finished(struct smtp_session *s) in smtp_is_response_finished() argument
994 if (s->p == NULL) { in smtp_is_response_finished()
1008 crlf = pbuf_memfind(s->p, SMTP_CRLF, SMTP_CRLF_LEN, (u16_t)(offset + 4)); in smtp_is_response_finished()
1013 sp = pbuf_get_at(s->p, (u16_t)(offset + 3)); in smtp_is_response_finished()
1032 smtp_prepare_helo(struct smtp_session *s, u16_t *tx_buf_len, struct altcp_pcb *pcb) in smtp_prepare_helo() argument
1043 SMEMCPY(s->tx_buf, SMTP_CMD_EHLO_1, SMTP_CMD_EHLO_1_LEN); in smtp_prepare_helo()
1044 MEMCPY(&s->tx_buf[SMTP_CMD_EHLO_1_LEN], ipa, ipa_len); in smtp_prepare_helo()
1045 SMEMCPY(&s->tx_buf[SMTP_CMD_EHLO_1_LEN + ipa_len], SMTP_CMD_EHLO_2, SMTP_CMD_EHLO_2_LEN); in smtp_prepare_helo()
1055 smtp_prepare_auth_or_mail(struct smtp_session *s, u16_t *tx_buf_len) in smtp_prepare_auth_or_mail() argument
1058 u16_t auth = pbuf_strstr(s->p, SMTP_KEYWORD_AUTH_SP); in smtp_prepare_auth_or_mail()
1060 auth = pbuf_strstr(s->p, SMTP_KEYWORD_AUTH_EQ); in smtp_prepare_auth_or_mail()
1063 u16_t crlf = pbuf_memfind(s->p, SMTP_CRLF, SMTP_CRLF_LEN, auth); in smtp_prepare_auth_or_mail()
1066 u16_t copied = pbuf_copy_partial(s->p, s->tx_buf, (u16_t)(crlf - auth), auth); in smtp_prepare_auth_or_mail()
1068 char *sep = s->tx_buf + SMTP_KEYWORD_AUTH_LEN; in smtp_prepare_auth_or_mail()
1069 s->tx_buf[copied] = 0; in smtp_prepare_auth_or_mail()
1075 SMEMCPY(s->tx_buf, SMTP_CMD_AUTHPLAIN_1, SMTP_CMD_AUTHPLAIN_1_LEN); in smtp_prepare_auth_or_mail()
1078 auth_len = smtp_base64_encode(&s->tx_buf[SMTP_CMD_AUTHPLAIN_1_LEN], in smtp_prepare_auth_or_mail()
1079 SMTP_TX_BUF_LEN - SMTP_CMD_AUTHPLAIN_1_LEN, SMTP_AUTH_PLAIN_DATA(s), in smtp_prepare_auth_or_mail()
1080 SMTP_AUTH_PLAIN_LEN(s)); in smtp_prepare_auth_or_mail()
1083 SMEMCPY(&s->tx_buf[SMTP_CMD_AUTHPLAIN_1_LEN + auth_len], SMTP_CMD_AUTHPLAIN_2, in smtp_prepare_auth_or_mail()
1093 SMEMCPY(s->tx_buf, SMTP_CMD_AUTHLOGIN, SMTP_CMD_AUTHLOGIN_LEN); in smtp_prepare_auth_or_mail()
1101 /* server didnt's send correct keywords for AUTH, try sending directly */ in smtp_prepare_auth_or_mail()
1102 return smtp_prepare_mail(s, tx_buf_len); in smtp_prepare_auth_or_mail()
1109 smtp_prepare_auth_login_uname(struct smtp_session *s, u16_t *tx_buf_len) in smtp_prepare_auth_login_uname() argument
1111 size_t base64_len = smtp_base64_encode(s->tx_buf, SMTP_TX_BUF_LEN, in smtp_prepare_auth_login_uname()
1112 SMTP_USERNAME(s), strlen(SMTP_USERNAME(s))); in smtp_prepare_auth_login_uname()
1118 SMEMCPY(&s->tx_buf[base64_len], SMTP_CRLF, SMTP_CRLF_LEN); in smtp_prepare_auth_login_uname()
1119 s->tx_buf[*tx_buf_len] = 0; in smtp_prepare_auth_login_uname()
1125 smtp_prepare_auth_login_pass(struct smtp_session *s, u16_t *tx_buf_len) in smtp_prepare_auth_login_pass() argument
1127 size_t base64_len = smtp_base64_encode(s->tx_buf, SMTP_TX_BUF_LEN, in smtp_prepare_auth_login_pass()
1128 SMTP_PASS(s), strlen(SMTP_PASS(s))); in smtp_prepare_auth_login_pass()
1134 SMEMCPY(&s->tx_buf[base64_len], SMTP_CRLF, SMTP_CRLF_LEN); in smtp_prepare_auth_login_pass()
1135 s->tx_buf[*tx_buf_len] = 0; in smtp_prepare_auth_login_pass()
1142 smtp_prepare_mail(struct smtp_session *s, u16_t *tx_buf_len) in smtp_prepare_mail() argument
1144 char *target = s->tx_buf; in smtp_prepare_mail()
1145 …LWIP_ASSERT("tx_buf overflow detected", s->from_len <= (SMTP_TX_BUF_LEN - SMTP_CMD_MAIL_1_LEN - SM… in smtp_prepare_mail()
1146 *tx_buf_len = (u16_t)(SMTP_CMD_MAIL_1_LEN + SMTP_CMD_MAIL_2_LEN + s->from_len); in smtp_prepare_mail()
1151 MEMCPY(target, s->from, s->from_len); in smtp_prepare_mail()
1152 target += s->from_len; in smtp_prepare_mail()
1159 smtp_prepare_rcpt(struct smtp_session *s, u16_t *tx_buf_len) in smtp_prepare_rcpt() argument
1161 char *target = s->tx_buf; in smtp_prepare_rcpt()
1162 …LWIP_ASSERT("tx_buf overflow detected", s->to_len <= (SMTP_TX_BUF_LEN - SMTP_CMD_RCPT_1_LEN - SMTP… in smtp_prepare_rcpt()
1163 *tx_buf_len = (u16_t)(SMTP_CMD_RCPT_1_LEN + SMTP_CMD_RCPT_2_LEN + s->to_len); in smtp_prepare_rcpt()
1168 MEMCPY(target, s->to, s->to_len); in smtp_prepare_rcpt()
1169 target += s->to_len; in smtp_prepare_rcpt()
1176 smtp_prepare_header(struct smtp_session *s, u16_t *tx_buf_len) in smtp_prepare_header() argument
1178 char *target = s->tx_buf; in smtp_prepare_header()
1180 SMTP_CMD_HEADER_3_LEN + SMTP_CMD_HEADER_4_LEN + s->from_len + s->to_len + in smtp_prepare_header()
1181 s->subject_len; in smtp_prepare_header()
1188 MEMCPY(target, s->from, s->from_len); in smtp_prepare_header()
1189 target += s->from_len; in smtp_prepare_header()
1192 MEMCPY(target, s->to, s->to_len); in smtp_prepare_header()
1193 target += s->to_len; in smtp_prepare_header()
1196 MEMCPY(target, s->subject, s->subject_len); in smtp_prepare_header()
1197 target += s->subject_len; in smtp_prepare_header()
1205 smtp_prepare_quit(struct smtp_session *s, u16_t *tx_buf_len) in smtp_prepare_quit() argument
1208 s->tx_buf[*tx_buf_len] = 0; in smtp_prepare_quit()
1209 SMEMCPY(s->tx_buf, SMTP_CMD_QUIT, SMTP_CMD_QUIT_LEN); in smtp_prepare_quit()
1216 smtp_send_body(struct smtp_session *s, struct altcp_pcb *pcb) in smtp_send_body() argument
1220 if (s->state == SMTP_BODY) { in smtp_send_body()
1222 if (s->bodydh) { in smtp_send_body()
1223 smtp_send_body_data_handler(s, pcb); in smtp_send_body()
1227 u16_t send_len = (u16_t)(s->body_len - s->body_sent); in smtp_send_body()
1235 err = altcp_write(pcb, &s->body[s->body_sent], (u16_t)send_len, TCP_WRITE_FLAG_COPY); in smtp_send_body()
1237 s->timer = SMTP_TIMEOUT_DATABLOCK; in smtp_send_body()
1238 s->body_sent = (u16_t)(s->body_sent + send_len); in smtp_send_body()
1239 if (s->body_sent < s->body_len) { in smtp_send_body()
1241 s->body_sent, s->body_len)); in smtp_send_body()
1247 if (s->body_sent == s->body_len) { in smtp_send_body()
1250 s->body_len)); in smtp_send_body()
1253 s->timer = SMTP_TIMEOUT_DATATERM; in smtp_send_body()
1254 … LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_send_body: end-of-body written, changing state to %s\n", in smtp_send_body()
1257 s->state = SMTP_QUIT; in smtp_send_body()
1268 struct smtp_session* s = (struct smtp_session*)arg; in smtp_process() local
1276 LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("Received %d bytes after closing: %s\n", in smtp_process()
1283 next_state = s->state; in smtp_process()
1287 if (s->p == NULL) { in smtp_process()
1288 s->p = p; in smtp_process()
1290 pbuf_cat(s->p, p); in smtp_process()
1294 if (s->timer == 0) { in smtp_process()
1296 smtp_close(s, pcb, SMTP_RESULT_ERR_TIMEOUT, 0, ERR_TIMEOUT); in smtp_process()
1299 if (s->state == SMTP_BODY) { in smtp_process()
1300 smtp_send_body(s, pcb); in smtp_process()
1304 response_code = smtp_is_response(s); in smtp_process()
1307 if (smtp_is_response_finished(s) != ERR_OK) { in smtp_process()
1313 if (s->p != NULL) { in smtp_process()
1314 LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_process: unknown data received (%s)\n", in smtp_process()
1315 smtp_pbuf_str(s->p))); in smtp_process()
1316 pbuf_free(s->p); in smtp_process()
1317 s->p = NULL; in smtp_process()
1322 switch(s->state) in smtp_process()
1328 next_state = smtp_prepare_helo(s, &tx_buf_len, pcb); in smtp_process()
1336 next_state = smtp_prepare_auth_or_mail(s, &tx_buf_len); in smtp_process()
1345 next_state = smtp_prepare_mail(s, &tx_buf_len); in smtp_process()
1352 if (pbuf_strstr(s->p, SMTP_RESP_LOGIN_UNAME) != 0xFFFF) { in smtp_process()
1354 next_state = smtp_prepare_auth_login_uname(s, &tx_buf_len); in smtp_process()
1361 if (pbuf_strstr(s->p, SMTP_RESP_LOGIN_PASS) != 0xFFFF) { in smtp_process()
1363 next_state = smtp_prepare_auth_login_pass(s, &tx_buf_len); in smtp_process()
1372 next_state = smtp_prepare_rcpt(s, &tx_buf_len); in smtp_process()
1379 SMEMCPY(s->tx_buf, SMTP_CMD_DATA, SMTP_CMD_DATA_LEN); in smtp_process()
1388 next_state = smtp_prepare_header(s, &tx_buf_len); in smtp_process()
1398 next_state = smtp_prepare_quit(s, &tx_buf_len); in smtp_process()
1405 LWIP_DEBUGF(SMTP_DEBUG_SERIOUS, ("Invalid state: %d/%s\n", (int)s->state, in smtp_process()
1406 smtp_state_str[s->state])); in smtp_process()
1409 if (s->state == next_state) { in smtp_process()
1410 …LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_process[%s]: unexpected response_code, closing: %d (%s)\… in smtp_process()
1411 smtp_state_str[s->state], response_code, smtp_pbuf_str(s->p))); in smtp_process()
1413 smtp_close(s, pcb, SMTP_RESULT_ERR_SVR_RESP, response_code, ERR_OK); in smtp_process()
1418 if (altcp_write(pcb, s->tx_buf, tx_buf_len, TCP_WRITE_FLAG_COPY) == ERR_OK) { in smtp_process()
1419 LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process[%s]: received command %d (%s)\n", in smtp_process()
1420 smtp_state_str[s->state], response_code, smtp_pbuf_str(s->p))); in smtp_process()
1421 LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process[%s]: sent %"U16_F" bytes: \"%s\"\n", in smtp_process()
1422 smtp_state_str[s->state], tx_buf_len, s->tx_buf)); in smtp_process()
1423 s->timer = SMTP_TIMEOUT; in smtp_process()
1424 pbuf_free(s->p); in smtp_process()
1425 s->p = NULL; in smtp_process()
1426 LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_process: changing state from %s to %s\n", in smtp_process()
1427 smtp_state_str[s->state], smtp_state_str[next_state])); in smtp_process()
1428 s->state = next_state; in smtp_process()
1431 smtp_send_body(s, pcb); in smtp_process()
1435 smtp_free(s, SMTP_RESULT_OK, 0, ERR_OK); in smtp_process()
1472 struct smtp_session* s; in smtp_send_mail_bodycback() local
1477 s = (struct smtp_session*)SMTP_STATE_MALLOC(sizeof(struct smtp_session)); in smtp_send_mail_bodycback()
1478 if (s == NULL) { in smtp_send_mail_bodycback()
1481 memset(s, 0, sizeof(struct smtp_session)); in smtp_send_mail_bodycback()
1482 s->bodydh = (struct smtp_bodydh_state*)SMTP_BODYDH_MALLOC(sizeof(struct smtp_bodydh_state)); in smtp_send_mail_bodycback()
1483 if (s->bodydh == NULL) { in smtp_send_mail_bodycback()
1484 SMTP_STATE_FREE(s); in smtp_send_mail_bodycback()
1487 memset(s->bodydh, 0, sizeof(struct smtp_bodydh_state)); in smtp_send_mail_bodycback()
1489 s->from = from; in smtp_send_mail_bodycback()
1492 s->from_len = (u16_t)len; in smtp_send_mail_bodycback()
1493 s->to = to; in smtp_send_mail_bodycback()
1496 s->to_len = (u16_t)len; in smtp_send_mail_bodycback()
1497 s->subject = subject; in smtp_send_mail_bodycback()
1500 s->subject_len = (u16_t)len; in smtp_send_mail_bodycback()
1501 s->body = NULL; in smtp_send_mail_bodycback()
1503 s->callback_fn = callback_fn; in smtp_send_mail_bodycback()
1504 s->callback_arg = callback_arg; in smtp_send_mail_bodycback()
1505 s->bodydh->callback_fn = bodycback_fn; in smtp_send_mail_bodycback()
1506 s->bodydh->state = BDH_SENDING; in smtp_send_mail_bodycback()
1508 return smtp_send_mail_alloced(s); in smtp_send_mail_bodycback()
1512 smtp_send_body_data_handler(struct smtp_session *s, struct altcp_pcb *pcb) in smtp_send_body_data_handler() argument
1516 LWIP_ASSERT("s != NULL", s != NULL); in smtp_send_body_data_handler()
1517 bdh = s->bodydh; in smtp_send_body_data_handler()
1521 if (s->body_len) { in smtp_send_body_data_handler()
1523 if((res = smtp_send_bodyh_data(pcb, (const char **)&s->body, &s->body_len)) in smtp_send_body_data_handler()
1525 s->body_sent = s->body_len - 1; in smtp_send_body_data_handler()
1536 if (bdh->callback_fn(s->callback_arg, &bdh->exposed) == BDH_DONE) { in smtp_send_body_data_handler()
1539 s->body = bdh->exposed.buffer; in smtp_send_body_data_handler()
1540 s->body_len = bdh->exposed.length; in smtp_send_body_data_handler()
1541 …EBUG_TRACE, ("smtp_send_body_data_handler: trying to send %u bytes\n", (unsigned int)s->body_len)); in smtp_send_body_data_handler()
1542 } while (s->body_len && in smtp_send_body_data_handler()
1543 … ((res = smtp_send_bodyh_data(pcb, (const char **)&s->body, &s->body_len)) == BDHALLDATASENT) in smtp_send_body_data_handler()
1548 s->body_sent = s->body_len; in smtp_send_body_data_handler()
1551 s->body_sent = s->body_len - 1; in smtp_send_body_data_handler()