int mu_imap_logout (mu_imap_t imap) { int status; if (imap == NULL) return EINVAL; if (!imap->io) return MU_ERR_NO_TRANSPORT; if (imap->session_state == MU_IMAP_SESSION_INIT) return MU_ERR_SEQ; switch (imap->client_state) { case MU_IMAP_CLIENT_READY: status = _mu_imap_tag_next (imap); MU_IMAP_CHECK_EAGAIN (imap, status); status = mu_imapio_printf (imap->io, "%s LOGOUT\r\n", imap->tag_str); MU_IMAP_CHECK_EAGAIN (imap, status); MU_IMAP_FCLR (imap, MU_IMAP_RESP); imap->client_state = MU_IMAP_CLIENT_LOGOUT_RX; case MU_IMAP_CLIENT_LOGOUT_RX: status = _mu_imap_response (imap, NULL, NULL); MU_IMAP_CHECK_EAGAIN (imap, status); imap->client_state = MU_IMAP_CLIENT_READY; imap->session_state = MU_IMAP_SESSION_INIT; break; default: status = EINPROGRESS; } return status; }
int mu_imap_disconnect (mu_imap_t imap) { /* Sanity checks. */ if (imap == NULL) return EINVAL; imap->client_state = MU_IMAP_CLIENT_READY; MU_IMAP_FCLR (imap, MU_IMAP_RESP); mu_list_clear (imap->capa); /* Close the stream. */ mu_imapio_destroy (&imap->io); return 0; }
int mu_imap_id (mu_imap_t imap, char **idenv, mu_assoc_t *passoc) { int status; mu_assoc_t assoc = NULL; if (imap == NULL) return EINVAL; if (!imap->io) return MU_ERR_NO_TRANSPORT; if (imap->session_state == MU_IMAP_SESSION_INIT) return MU_ERR_SEQ; switch (imap->client_state) { case MU_IMAP_CLIENT_READY: status = _mu_imap_tag_next (imap); MU_IMAP_CHECK_EAGAIN (imap, status); status = mu_imapio_printf (imap->io, "%s ID ", imap->tag_str); MU_IMAP_CHECK_ERROR (imap, status); if (!idenv) status = mu_imapio_printf (imap->io, "NIL"); else { if (idenv[0]) { int i; char *delim = "("; for (i = 0; idenv[i]; i++) { status = mu_imapio_printf (imap->io, "%s\"%s\"", delim, idenv[i]); MU_IMAP_CHECK_ERROR (imap, status); delim = " "; if (status) break; } status = mu_imapio_printf (imap->io, ")"); } else status = mu_imapio_printf (imap->io, "()"); } MU_IMAP_CHECK_ERROR (imap, status); status = mu_imapio_printf (imap->io, "\r\n"); MU_IMAP_CHECK_ERROR (imap, status); MU_IMAP_FCLR (imap, MU_IMAP_RESP); imap->client_state = MU_IMAP_CLIENT_ID_RX; case MU_IMAP_CLIENT_ID_RX: status = _mu_imap_response (imap, parse_id_reply, &assoc); MU_IMAP_CHECK_EAGAIN (imap, status); switch (imap->response) { case MU_IMAP_OK: status = 0; *passoc = assoc ? assoc : create_id_assoc (); break; case MU_IMAP_NO: status = EACCES; break; case MU_IMAP_BAD: status = MU_ERR_BADREPLY; break; } imap->client_state = MU_IMAP_CLIENT_READY; break; default: status = EINPROGRESS; } return status; }