/*-----------------------------------------------------------------------------------*/ static void acked(void) { s.sendptr += s.sentlen; s.sentlen = 0; if(s.sendptr == s.textlen) { switch(s.state) { case STATE_SEND_DATA_HEADERS: s.state = STATE_SEND_DATA_MESSAGE; s.sendptr = s.textlen = 0; break; case STATE_SEND_DATA_MESSAGE: s.state = STATE_SEND_DATA_END; s.sendptr = s.textlen = 0; break; case STATE_SEND_DATA_END: s.state = STATE_SEND_QUIT; s.sendptr = s.textlen = 0; break; case STATE_SEND_QUIT: s.state = STATE_SEND_DONE; smtp_done(SMTP_ERR_OK); uip_close(); break; } } }
/*-----------------------------------------------------------------------------------*/ static void newdata(void) { if(*(char *)uip_appdata == ISO_5) { smtp_done(1); uip_abort(); return; } /* printf("Got %d bytes: '%s'\n", uip_datalen(), uip_appdata);*/ switch(s.state) { case STATE_SEND_NONE: if(strncmp((char *)uip_appdata, smtp_220, 3) == 0) { /* printf("Newdata(): SEND_NONE, got 220, towards SEND_HELO\n");*/ s.state = STATE_SEND_HELO; s.sendptr = 0; } break; case STATE_SEND_HELO: if(*(char *)uip_appdata == ISO_2) { /* printf("Newdata(): SEND_HELO, got 2*, towards SEND_MAIL_FROM\n");*/ s.state = STATE_SEND_MAIL_FROM; s.sendptr = 0; } break; case STATE_SEND_MAIL_FROM: if(*(char *)uip_appdata == ISO_2) { /* printf("Newdata(): SEND_MAIL_FROM, got 2*, towards SEND_RCPT_TO\n"); */ /* printf("2\n");*/ s.state = STATE_SEND_RCPT_TO; s.textlen = s.sendptr = 0; } break; case STATE_SEND_RCPT_TO: if(*(char *)uip_appdata == ISO_2) { /* printf("2\n");*/ s.state = STATE_SEND_DATA; s.textlen = s.sendptr = 0; } break; case STATE_SEND_DATA: if(*(char *)uip_appdata == ISO_3) { /* printf("3\n");*/ s.state = STATE_SEND_DATA_HEADERS; s.textlen = s.sendptr = 0; } break; case STATE_SEND_DATA_HEADERS: if(*(char *)uip_appdata == ISO_3) { /* printf("3\n");*/ s.state = STATE_SEND_DATA_MESSAGE; s.textlen = s.sendptr = 0; } break; } }
/*---------------------------------------------------------------------------*/ void smtp_appcall(void) { if(uip_closed()) { s.connected = 0; return; } if(uip_aborted() || uip_timedout()) { s.connected = 0; smtp_done(1); return; } smtp_thread(); }
/*---------------------------------------------------------------------------*/ static PT_THREAD(smtp_thread(void)) { PSOCK_BEGIN(&s.psock); PSOCK_READTO(&s.psock, ISO_nl); if(strncmp(s.inputbuffer, smtp_220, 3) != 0) { PSOCK_CLOSE(&s.psock); smtp_done(2); PSOCK_EXIT(&s.psock); } PSOCK_SEND_STR(&s.psock, (char *)smtp_helo); PSOCK_SEND_STR(&s.psock, localhostname); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); PSOCK_READTO(&s.psock, ISO_nl); if(s.inputbuffer[0] != ISO_2) { PSOCK_CLOSE(&s.psock); smtp_done(3); PSOCK_EXIT(&s.psock); } PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from); PSOCK_SEND_STR(&s.psock, s.from); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); PSOCK_READTO(&s.psock, ISO_nl); if(s.inputbuffer[0] != ISO_2) { PSOCK_CLOSE(&s.psock); smtp_done(4); PSOCK_EXIT(&s.psock); } PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to); PSOCK_SEND_STR(&s.psock, s.to); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); PSOCK_READTO(&s.psock, ISO_nl); if(s.inputbuffer[0] != ISO_2) { PSOCK_CLOSE(&s.psock); smtp_done(5); PSOCK_EXIT(&s.psock); } if(s.cc != 0) { PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to); PSOCK_SEND_STR(&s.psock, s.cc); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); PSOCK_READTO(&s.psock, ISO_nl); if(s.inputbuffer[0] != ISO_2) { PSOCK_CLOSE(&s.psock); smtp_done(6); PSOCK_EXIT(&s.psock); } } PSOCK_SEND_STR(&s.psock, (char *)smtp_data); PSOCK_READTO(&s.psock, ISO_nl); if(s.inputbuffer[0] != ISO_3) { PSOCK_CLOSE(&s.psock); smtp_done(7); PSOCK_EXIT(&s.psock); } PSOCK_SEND_STR(&s.psock, (char *)smtp_to); PSOCK_SEND_STR(&s.psock, s.to); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); if(s.cc != 0) { PSOCK_SEND_STR(&s.psock, (char *)smtp_cc); PSOCK_SEND_STR(&s.psock, s.cc); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); } PSOCK_SEND_STR(&s.psock, (char *)smtp_from); PSOCK_SEND_STR(&s.psock, s.from); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); PSOCK_SEND_STR(&s.psock, (char *)smtp_subject); PSOCK_SEND_STR(&s.psock, s.subject); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); PSOCK_SEND(&s.psock, s.msg, s.msglen); PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl); PSOCK_READTO(&s.psock, ISO_nl); if(s.inputbuffer[0] != ISO_2) { PSOCK_CLOSE(&s.psock); smtp_done(8); PSOCK_EXIT(&s.psock); } PSOCK_SEND_STR(&s.psock, (char *)smtp_quit); smtp_done(SMTP_ERR_OK); PSOCK_END(&s.psock); }