static int handle_client_connection(const char *srcinfo, prelude_client_profile_t *cp, prelude_io_t *fd, gnutls_x509_privkey_t key, gnutls_x509_crt_t cacrt, gnutls_x509_crt_t crt) { gnutls_session_t session; session = new_tls_session(prelude_io_get_fd(fd)); if ( ! session ) return -1; prelude_io_set_tls_io(fd, session); if ( gnutls_auth_get_type(session) == GNUTLS_CRD_ANON && anon_check_passwd(fd) < 0 ) return -1; return tls_handle_certificate_request(srcinfo, cp, fd, key, cacrt, crt); }
int server_generic_process_requests(server_generic_t *server, server_generic_client_t *client) { client->server = server; ev_io_init(&client->evio, libev_notification_cb, (int) prelude_io_get_fd(client->fd), EV_READ); ev_io_start(manager_event_loop, &client->evio); if ( ! (client->state & SERVER_GENERIC_CLIENT_STATE_ACCEPTED) ) { ev_timer_init(&client->evtimer, libev_timer_cb, 0, config.connection_timeout); client->evtimer.data = client; ev_timer_again(manager_event_loop, &client->evtimer); } return 0; }
static int send_queued_alert(server_generic_client_t *client) { int ret; do { ret = gnutls_alert_send(prelude_io_get_fdptr(client->fd), GNUTLS_AL_FATAL, client->alert); } while ( ret < 0 && ret == GNUTLS_E_INTERRUPTED ); if ( ret == GNUTLS_E_AGAIN ) { server_generic_notify_write_enable(client); return 0; } client->alert = 0; gnutls_deinit(prelude_io_get_fdptr(client->fd)); prelude_io_set_sys_io(client->fd, prelude_io_get_fd(client->fd)); return 1; }
void server_generic_notify_write_disable(server_generic_client_t *client) { ev_io_stop(manager_event_loop, &client->evio); ev_io_set(&client->evio, (int) prelude_io_get_fd(client->fd), EV_READ); ev_io_start(manager_event_loop, &client->evio); }