int request_idle(const char *server, const char *port, const char *user) { int t, rg, ri; session *s; if (!(s = session_find(server, port, user))) return -1; if (!(s->capabilities & CAPABILITY_IDLE)) return -1; do { ri = 0; t = imap_idle(s); if ((rg = response_continuation(s)) == -1) goto fail; if (rg == STATUS_RESPONSE_CONTINUE) { if ((ri = response_idle(s, t)) == -1) goto fail; imap_done(s); if ((rg = response_generic(s, t)) == -1) goto fail; } } while (ri == STATUS_RESPONSE_TIMEOUT); return rg; fail: close_connection(s); session_destroy(s); return -1; }
int request_idle(session *ssn, char **event) { int t, r, ri; if (!(ssn->capabilities & CAPABILITY_IDLE)) return STATUS_BAD; do { ri = 0; TRY(t = send_request(ssn, "IDLE")); TRY(r = response_continuation(ssn, t)); if (r == STATUS_CONTINUE) { TRY(ri = response_idle(ssn, t, event)); TRY(send_continuation(ssn, "DONE", strlen("DONE"))); TRY(r = response_generic(ssn, t)); } } while (ri == STATUS_TIMEOUT); return r; }