static void _tcp_accept(uv_stream_t *master, int status, bool tls) { if (status != 0) { return; } uv_stream_t *client = handle_alloc(master->loop); if (!client) { return; } memset(client, 0, sizeof(*client)); io_create(master->loop, (uv_handle_t *)client, SOCK_STREAM); if (uv_accept(master, client) != 0) { uv_close((uv_handle_t *)client, io_free); return; } /* Set deadlines for TCP connection and start reading. * It will re-check every half of a request time limit if the connection * is idle and should be terminated, this is an educated guess. */ struct session *session = client->data; session->has_tls = tls; if (tls && !session->tls_ctx) { session->tls_ctx = tls_new(master->loop->data); } uv_timer_t *timer = &session->timeout; uv_timer_init(master->loop, timer); timer->data = client; uv_timer_start(timer, tcp_timeout_trigger, KR_CONN_RTT_MAX/2, KR_CONN_RTT_MAX/2); io_start_read((uv_handle_t *)client); }
static int udp_bind_finalize(uv_handle_t *handle) { check_bufsize((uv_handle_t *)handle); /* Handle is already created, just create context. */ handle->data = session_new(); assert(handle->data); return io_start_read((uv_handle_t *)handle); }
int udp_bind(uv_udp_t *handle, struct sockaddr *addr) { unsigned flags = UV_UDP_REUSEADDR; if (addr->sa_family == AF_INET6) { flags |= UV_UDP_IPV6ONLY; } int ret = uv_udp_bind(handle, addr, flags); if (ret != 0) { return ret; } handle->data = NULL; check_bufsize((uv_handle_t *)handle); return io_start_read((uv_handle_t *)handle); }
static void tcp_accept(uv_stream_t *master, int status) { if (status != 0) { return; } uv_stream_t *client = handle_alloc(master->loop, sizeof(*client)); if (!client) { return; } memset(client, 0, sizeof(*client)); io_create(master->loop, (uv_handle_t *)client, SOCK_STREAM); if (uv_accept(master, client) != 0) { handle_free((uv_handle_t *)client); return; } io_start_read((uv_handle_t *)client); }