static void tims_handle_input(void *arg) { int l = 0; char buffer[MAX_LINESIZE]; /* connection buffer */ ClientSession_t *session = (ClientSession_t *)arg; ci_cork(session->ci); while (TRUE) { memset(buffer, 0, sizeof(buffer)); l = ci_readln(session->ci, buffer); if (l == 0) break; if ((l = tims_tokenizer(session, buffer))) { if (l == -3) { client_session_bailout(&session); return; } if (tims(session) == -3) { client_session_bailout(&session); return; } client_session_reset_parser(session); } } if (session->state < QUIT) ci_uncork(session->ci); }
void imap_cb_time(void *arg) { Field_T interval; int idle_interval = 10; ImapSession *session = (ImapSession *) arg; TRACE(TRACE_DEBUG,"[%p]", session); if ( session->command_type == IMAP_COMM_IDLE && session->command_state == IDLE ) { // session is in a IDLE loop GETCONFIGVALUE("idle_interval", "IMAP", interval); if (strlen(interval) > 0) { int i = atoi(interval); if (i > 0 && i < 1000) idle_interval = i; } ci_cork(session->ci); if (! (++session->loop % idle_interval)) { imap_session_printf(session, "* OK\r\n"); } dbmail_imap_session_mailbox_status(session,TRUE); dbmail_imap_session_buff_flush(session); ci_uncork(session->ci); } else { dbmail_imap_session_set_state(session,CLIENTSTATE_ERROR); imap_session_printf(session, "%s", IMAP_TIMEOUT_MSG); imap_session_bailout(session); } }
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_set_timeout(ClientSession_T *session, int timeout) { if (session && (session->state > CLIENTSTATE_ANY) && session->ci && session->ci->timeout) { int current = session->ci->timeout->tv_sec; if (timeout != current) { ci_cork(session->ci); session->ci->timeout->tv_sec = timeout; ci_uncork(session->ci); } } }
static void pop3_handle_input(void *arg) { char buffer[MAX_LINESIZE]; /* connection buffer */ ClientSession_T *session = (ClientSession_T *)arg; if (p_string_len(session->ci->write_buffer)) { ci_write(session->ci, NULL); return; } memset(buffer, 0, sizeof(buffer)); if (ci_readln(session->ci, buffer) == 0) return; ci_cork(session->ci); if (pop3(session, buffer) <= 0) { client_session_bailout(&session); return; } ci_uncork(session->ci); }