int mu_pop3_stat (mu_pop3_t pop3, size_t *msg_count, mu_off_t *size) { int status; unsigned long lv, count; if (pop3 == NULL || msg_count == NULL) return EINVAL; if (size == NULL) return MU_ERR_OUT_PTR_NULL; switch (pop3->state) { case MU_POP3_NO_STATE: status = mu_pop3_writeline (pop3, "STAT\r\n"); MU_POP3_CHECK_ERROR (pop3, status); MU_POP3_FCLR (pop3, MU_POP3_ACK); pop3->state = MU_POP3_STAT; case MU_POP3_STAT: status = mu_pop3_response (pop3, NULL); MU_POP3_CHECK_EAGAIN (pop3, status); MU_POP3_CHECK_OK (pop3); pop3->state = MU_POP3_NO_STATE; /* Parse the answer. */ *msg_count = 0; lv = 0; /* FIXME: Error checking */ sscanf (pop3->ackbuf, "+OK %lu %lu", &count, &lv); *msg_count = count; *size = lv; break; /* They must deal with the error first by reopening. */ case MU_POP3_ERROR: status = ECANCELED; break; default: status = EINPROGRESS; } return status; }
int mu_pop3_pass (mu_pop3_t pop3, const char *passwd) { int status; if (pop3 == NULL || passwd == NULL) return EINVAL; switch (pop3->state) { case MU_POP3_NO_STATE: status = mu_pop3_writeline (pop3, "PASS %s\r\n", passwd); MU_POP3_CHECK_ERROR (pop3, status); mu_pop3_debug_cmd (pop3); pop3->state = MU_POP3_PASS; case MU_POP3_PASS: status = mu_pop3_send (pop3); MU_POP3_CHECK_EAGAIN (pop3, status); /* Obscure the passwd. */ memset (pop3->io.buf, '\0', pop3->io.len); pop3->acknowledge = 0; pop3->state = MU_POP3_PASS_ACK; case MU_POP3_PASS_ACK: status = mu_pop3_response (pop3, NULL, 0, NULL); MU_POP3_CHECK_EAGAIN (pop3, status); mu_pop3_debug_ack (pop3); MU_POP3_CHECK_OK (pop3); pop3->state = MU_POP3_NO_STATE; break; /* They must deal with the error first by reopening. */ case MU_POP3_ERROR: status = ECANCELED; break; default: status = EINPROGRESS; } return status; }
int mu_pop3_noop (mu_pop3_t pop3) { int status; if (pop3 == NULL) return EINVAL; switch (pop3->state) { case MU_POP3_NO_STATE: status = mu_pop3_writeline (pop3, "NOOP\r\n"); MU_POP3_CHECK_ERROR (pop3, status); mu_pop3_debug_cmd (pop3); pop3->state = MU_POP3_NOOP; case MU_POP3_NOOP: status = mu_pop3_send (pop3); MU_POP3_CHECK_EAGAIN (pop3, status); pop3->acknowledge = 0; pop3->state = MU_POP3_NOOP_ACK; case MU_POP3_NOOP_ACK: status = mu_pop3_response (pop3, NULL, 0, NULL); MU_POP3_CHECK_EAGAIN (pop3, status); mu_pop3_debug_ack (pop3); MU_POP3_CHECK_OK (pop3); pop3->state = MU_POP3_NO_STATE; break; /* They must deal with the error first by reopening. */ case MU_POP3_ERROR: status = ECANCELED; break; default: status = EINPROGRESS; } return status; }
int mu_pop3_list_cmd (mu_pop3_t pop3) { int status = 0; if (pop3 == NULL) return EINVAL; switch (pop3->state) { case MU_POP3_NO_STATE: status = mu_pop3_writeline (pop3, "LIST\r\n"); MU_POP3_CHECK_ERROR (pop3, status); MU_POP3_FCLR (pop3, MU_POP3_ACK); pop3->state = MU_POP3_LIST; case MU_POP3_LIST: status = mu_pop3_response (pop3, NULL); MU_POP3_CHECK_EAGAIN (pop3, status); MU_POP3_CHECK_OK (pop3); pop3->state = MU_POP3_LIST_RX; case MU_POP3_LIST_RX: /* The mu_iterator_t will read the stream and set the state to MU_POP3_NO_STATE when done. */ break; /* They must deal with the error first by reopening. */ case MU_POP3_ERROR: status = ECANCELED; break; default: status = EINPROGRESS; } return status; }