static gboolean simple_tcp_new(liConnection *con, int fd) { simple_tcp_connection *data = g_slice_new0(simple_tcp_connection); data->sock_stream = li_iostream_new(con->wrk, fd, simple_tcp_io_cb, data); data->simple_tcp_context = NULL; data->con = con; con->con_sock.data = data; con->con_sock.callbacks = &simple_tcp_cbs; con->con_sock.raw_out = &data->sock_stream->stream_out; con->con_sock.raw_in = &data->sock_stream->stream_in; li_stream_acquire(con->con_sock.raw_out); li_stream_acquire(con->con_sock.raw_in); return TRUE; }
static void close_cb(liOpenSSLFilter *f, gpointer data) { openssl_connection_ctx *conctx = data; liConnection *con = conctx->con; assert(conctx->ssl_filter == f); conctx->ssl_filter = NULL; li_openssl_filter_free(f); if (NULL != conctx->con) { liStream *raw_out = con->con_sock.raw_out, *raw_in = con->con_sock.raw_in; assert(con->con_sock.data == conctx); conctx->con = NULL; con->con_sock.data = NULL; li_stream_acquire(raw_in); li_stream_reset(raw_out); li_stream_reset(raw_in); li_stream_release(raw_in); } if (NULL != conctx->sock_stream) { liIOStream *stream = conctx->sock_stream; conctx->sock_stream = NULL; li_iostream_release(stream); } }
static void close_cb(liGnuTLSFilter *f, gpointer data) { mod_connection_ctx *conctx = data; liConnection *con = conctx->con; LI_FORCE_ASSERT(conctx->tls_filter == f); conctx->tls_filter = NULL; li_gnutls_filter_free(f); gnutls_deinit(conctx->session); if (NULL != conctx->ctx) { mod_gnutls_context_release(conctx->ctx); conctx->ctx = NULL; } if (NULL != conctx->con) { liStream *raw_out = con->con_sock.raw_out, *raw_in = con->con_sock.raw_in; LI_FORCE_ASSERT(con->con_sock.data == conctx); conctx->con = NULL; con->con_sock.data = NULL; con->con_sock.callbacks = NULL; li_stream_acquire(raw_in); li_stream_reset(raw_out); li_stream_reset(raw_in); li_stream_release(raw_in); } #ifdef USE_SNI if (NULL != conctx->sni_db_wait) { li_fetch_cancel(&conctx->sni_db_wait); } if (NULL != conctx->sni_entry) { li_fetch_entry_release(conctx->sni_entry); conctx->sni_entry = NULL; } #endif if (NULL != conctx->client_hello_stream) { li_ssl_client_hello_stream_ready(conctx->client_hello_stream); li_stream_release(conctx->client_hello_stream); conctx->client_hello_stream = NULL; } #ifdef USE_SNI if (NULL != conctx->sni_jobref) { li_job_ref_release(conctx->sni_jobref); conctx->sni_jobref = NULL; } li_job_clear(&conctx->sni_job); if (NULL != conctx->sni_server_name) { g_string_free(conctx->sni_server_name, TRUE); conctx->sni_server_name = NULL; } #endif LI_FORCE_ASSERT(NULL != conctx->sock_stream); li_iostream_safe_release(&conctx->sock_stream); }
static gboolean do_gnutls_handshake(liGnuTLSFilter *f, gboolean writing) { int r; LI_FORCE_ASSERT(!f->initial_handshaked_finished); r = gnutls_handshake(f->session); if (GNUTLS_E_SUCCESS == r) { f->initial_handshaked_finished = 1; li_stream_acquire(&f->plain_source); li_stream_acquire(&f->plain_drain); f->callbacks->handshake_cb(f, f->callback_data, &f->plain_source, &f->plain_drain); li_stream_release(&f->plain_source); li_stream_release(&f->plain_drain); return TRUE; } else { do_handle_error(f, "gnutls_handshake", r, writing); return FALSE; } }
void li_filter_buffer_on_disk_stop(liStream *stream) { bod_state *state; if (NULL == stream) return; assert(bod_cb == stream->cb); li_stream_acquire(stream); state = LI_CONTAINER_OF(stream, bod_state, stream); bod_stop(state); li_stream_again_later(stream); li_stream_release(stream); }