Exemplo n.º 1
0
/*-----------------------------------------------------------------------------------*/
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;
    }
  }
}
Exemplo n.º 2
0
/*-----------------------------------------------------------------------------------*/
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;
  }
    
}
Exemplo n.º 3
0
/*---------------------------------------------------------------------------*/
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();
}
Exemplo n.º 4
0
/*---------------------------------------------------------------------------*/
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);
}