void imap_cb_read(void *arg) { ImapSession *session = (ImapSession *) arg; ci_read_cb(session->ci); uint64_t have = p_string_len(session->ci->read_buffer); uint64_t need = session->ci->rbuff_size; int enough = (need>0?(have >= need):(have >= 0)); int state; PLOCK(session->ci->lock); state = session->ci->client_state; PUNLOCK(session->ci->lock); TRACE(TRACE_DEBUG,"state [%d] enough %d: %" PRIu64 "/%" PRIu64 "", state, enough, have, need); if (state & CLIENT_ERR) { imap_session_bailout(session); } else if (state & CLIENT_EOF) { ci_cork(session->ci); if (enough) imap_handle_input(session); else imap_session_bailout(session); } else if (have > 0) imap_handle_input(session); }
void client_session_read(void *arg) { int state; ClientSession_t *session = (ClientSession_t *)arg; TRACE(TRACE_DEBUG, "[%p] state: [%d]", session, session->state); ci_read_cb(session->ci); state = session->ci->client_state; if (state & CLIENT_ERR) { TRACE(TRACE_DEBUG,"client_state ERROR"); client_session_bailout(&session); } else if (state & CLIENT_EOF) { TRACE(TRACE_NOTICE,"reached EOF"); event_del(session->ci->rev); if (session->ci->read_buffer->len < 1) client_session_bailout(&session); else session->handle_input(session); } else if (state & CLIENT_OK || state & CLIENT_AGAIN) { session->handle_input(session); } }