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); } }
// helpers // static void imap_session_reset(ImapSession *session) { ClientState_T current; TRACE(TRACE_DEBUG,"[%p]", session); memset(session->tag, 0, sizeof(session->tag)); memset(session->command, 0, sizeof(session->command)); session->use_uid = 0; session->command_type = 0; session->command_state = FALSE; session->parser_state = FALSE; dbmail_imap_session_args_free(session, FALSE); PLOCK(session->lock); current = session->state; PUNLOCK(session->lock); if (current == CLIENTSTATE_AUTHENTICATED) session->ci->timeout.tv_sec = server_conf->timeout; else session->ci->timeout.tv_sec = server_conf->login_timeout; ci_uncork(session->ci); return; }
static void reset_callbacks(ClientSession_T *session) { session->ci->cb_time = pop3_cb_time; session->ci->cb_write = pop3_cb_write; session->handle_input = pop3_handle_input; UNBLOCK(session->ci->rx); UNBLOCK(session->ci->tx); ci_uncork(session->ci); }
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); }