ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
connection.h File Reference

Go to the source code of this file.

Data Structures

struct  network_connection_callbacks_t
 Callbacks and operations used by network connection callbacks. Packet payloads are borrowed until return. closing stops application producers; closed releases application state after the transport and callbacks have drained. An open failure still receives closing/closed, including partial application init. More...
struct  network_server_config_t
struct  network_connect_config_t
 For network connect config, this is the live record that ties timeout_ms, callback_data, tls_ca_file, quic_visual_datagrams together. The owning code creates it, updates it while work is active, and releases its handles and pointed-to storage before freeing the record. WebSocket establishes its library-managed transport. Returns one owned object. More...

Typedefs

typedef struct network_connection network_connection_t
typedef struct network_server network_server_t
typedef struct quic_endpoint quic_endpoint_t
typedef void(* network_connection_visit_fn) (network_connection_t *, void *)

Enumerations

enum  network_connection_state_t { NETWORK_NEGOTIATING , NETWORK_READY , NETWORK_CLOSING , NETWORK_CLOSED }

Functions

asciichat_error_t network_server_create (const network_server_config_t *, network_server_t **)
asciichat_error_t network_server_start (network_server_t *)
asciichat_error_t network_server_run (network_server_t *)
void network_server_request_stop (network_server_t *)
asciichat_error_t network_server_stop (network_server_t *)
void network_server_destroy (network_server_t **)
size_t network_server_connection_count (network_server_t *)
bool network_server_websocket_enabled (network_server_t *)
const network_server_config_t * network_server_config (network_server_t *)
asciichat_error_t network_server_adopt (network_server_t *, acip_transport_t *, const char *peer, bool secure)
asciichat_error_t network_server_adopt_negotiating (network_server_t *, acip_transport_t *, const char *peer, bool secure)
void network_server_foreach (network_server_t *, network_connection_visit_fn, void *)
acip_transport_t * network_connection_transport (network_connection_t *)
void * network_connection_context (network_connection_t *)
void network_connection_set_context (network_connection_t *, void *)
const char * network_connection_peer (network_connection_t *)
bool network_connection_secure (network_connection_t *)
network_connection_state_t network_connection_state (network_connection_t *)
void network_connection_ready (network_connection_t *)
void network_connection_request_stop (network_connection_t *)
crypto_handshake_context_t * network_connection_handshake (network_connection_t *)
asciichat_error_t network_connection_prepare_security (network_connection_t *, bool server, const char *password)
asciichat_error_t network_connection_adopt (acip_transport_t *, network_connection_t **)
asciichat_error_t network_connection_adopt_negotiating (acip_transport_t *, const char *peer, bool secure, network_connection_t **)
asciichat_error_t network_connection_open (const char *name, const char *address, uint16_t default_port, const network_connect_config_t *, network_connection_t **, connection_endpoint_t *)
void network_connection_destroy (network_connection_t **)
uint8_t network_connection_crypto_mode (network_connection_t *)
asciichat_error_t network_connection_run (network_connection_t *, const network_connection_callbacks_t *, void *)

Typedef Documentation

◆ network_connection_t

◆ network_connection_visit_fn

typedef void(* network_connection_visit_fn) (network_connection_t *, void *)

Iteration pins connections and application state, without holding registry locks across callbacks or sends. The callback must not wait for server shutdown.

Definition at line 74 of file include/ascii-chat/network/connection.h.

◆ network_server_t

Definition at line 9 of file include/ascii-chat/network/connection.h.

◆ quic_endpoint_t

QUIC endpoint for native ACIP and HTTP/3/WebTransport. Native ACIP transports are returned by quic_accept(); generic HTTP/3 request connections are consumed by the configured http_server and are never exposed as ACIP transports. A listener negotiates the selected ALPN on one UDP socket and requires the platform socket subsystem to be initialized.

Definition at line 10 of file include/ascii-chat/network/connection.h.

Enumeration Type Documentation

◆ network_connection_state_t

Enumerator
NETWORK_NEGOTIATING 
NETWORK_READY 
NETWORK_CLOSING 
NETWORK_CLOSED 

Definition at line 12 of file include/ascii-chat/network/connection.h.

Function Documentation

◆ network_connection_adopt()

asciichat_error_t network_connection_adopt ( acip_transport_t * transport,
network_connection_t ** out )

Wrap an already authenticated transport in the same ownership contract.

Definition at line 873 of file lib/network/connection.c.

873 {
874 if (!transport || !out)
875 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing connection adoption parameters");
876 *out = connection_create(NULL, transport, "peer", true, true);
877 return *out ? ASCIICHAT_OK : SET_ERRNO(ERROR_MEMORY, "Cannot own authenticated transport");
878}
#define SET_ERRNO(code,...)
@ ERROR_MEMORY
Definition error_codes.h:51
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
static bool size_t gotel_query_t * out
Definition queries.h:8

References ASCIICHAT_OK, ERROR_INVALID_PARAM, ERROR_MEMORY, out, and SET_ERRNO.

Referenced by session_participant_set_transport().

◆ network_connection_adopt_negotiating()

asciichat_error_t network_connection_adopt_negotiating ( acip_transport_t * transport,
const char * peer,
bool secure,
network_connection_t ** out )

Wrap a connected transport before application negotiation. Ownership transfers only on success. The caller drives negotiation before run().

Definition at line 879 of file lib/network/connection.c.

880 {
881 if (!transport || !out)
882 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing connection adoption parameters");
883 *out = connection_create(NULL, transport, peer, secure, false);
884 return *out ? ASCIICHAT_OK : SET_ERRNO(ERROR_MEMORY, "Cannot own negotiating transport");
885}

References ASCIICHAT_OK, ERROR_INVALID_PARAM, ERROR_MEMORY, out, and SET_ERRNO.

◆ network_connection_context()

void * network_connection_context ( network_connection_t * c)

Definition at line 87 of file lib/network/connection.c.

87 {
88 return c ? atomic_ptr_load(&c->context) : NULL;
89}

References network_connection::context.

◆ network_connection_crypto_mode()

◆ network_connection_destroy()

void network_connection_destroy ( network_connection_t ** owner)

Definition at line 886 of file lib/network/connection.c.

886 {
887 if (!owner || !*owner)
888 return;
889 connection_finish(*owner);
890 if ((*owner)->cleanup_failed)
891 return;
892 connection_free(*owner);
893 *owner = NULL;
894}

Referenced by acds_client_connect(), acds_client_disconnect(), discovery_session_destroy(), and session_connection_establish().

◆ network_connection_handshake()

crypto_handshake_context_t * network_connection_handshake ( network_connection_t * c)

Security storage follows connection ownership, including a retained fallback.

Definition at line 113 of file lib/network/connection.c.

113 {
114 if (c->adopted_security)
115 return &c->adopted_security->handshake;
116 c->security_claimed = true;
117 return &c->security.handshake;
118}
crypto_handshake_context_t handshake

References network_connection::adopted_security, acip_security::handshake, network_connection::security, and network_connection::security_claimed.

Referenced by client_connection_start(), client_crypto_init(), discovery_session_start(), and network_connection_establish().

◆ network_connection_open()

asciichat_error_t network_connection_open ( const char * name,
const char * address,
uint16_t default_port,
const network_connect_config_t * settings,
network_connection_t ** out,
connection_endpoint_t * resolved )

A NULL config uses backend defaults and the application's exit callback. A supplied config preserves its timeout, including zero, and also checks its cancellation callback before dialing and while waiting for establishment.

Definition at line 806 of file lib/network/connection.c.

808 {
809 ASCII_OTEL_SCOPE(CONNECTION_CREATE);
810 if (!out)
811 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing connection output");
812 *out = NULL;
813 if (connect_cancelled((void *)settings))
814 return SET_ERRNO(ERROR_NETWORK_CONNECT, "Connection establishment cancelled");
815 connection_endpoint_t endpoint;
816 asciichat_error_t result = connection_endpoint_resolve(address, port, &endpoint);
817 if (result != ASCIICHAT_OK)
818 return result;
819 acip_transport_t *transport = NULL;
821 ASCII_OTEL_ATTR_STRING("network.connection.endpoint_protocol",
822 endpoint.protocol == CONNECTION_ENDPOINT_WEBSOCKET ? "websocket"
823 : endpoint.protocol == CONNECTION_ENDPOINT_QUIC ? "quic"
824 : "tcp");
825 ASCII_OTEL_ATTR_INT("server.port", endpoint.port);
826 ASCII_OTEL_ATTR_INT("network.connection.timeout_ms", settings ? settings->timeout_ms
827 : endpoint.protocol == CONNECTION_ENDPOINT_WEBSOCKET ? 15000
828 : 3000);
829 if (endpoint.protocol == CONNECTION_ENDPOINT_QUIC) {
830 result = connection_open_quic(&endpoint, settings, &quic_endpoint, &transport);
831 if (result != ASCIICHAT_OK)
832 return result;
833 log_info("Connected to %s:%u using native QUIC", endpoint.host, (unsigned)endpoint.port);
834 } else if (endpoint.protocol == CONNECTION_ENDPOINT_WEBSOCKET) {
835 transport = acip_websocket_client_transport_create(name, endpoint.input, NULL);
836 } else {
837 result = connection_open_tcp(name, &endpoint, settings, NULL, &transport);
838 if (result != ASCIICHAT_OK)
839 return result;
840 }
841 if (!transport)
842 return SET_ERRNO(ERROR_NETWORK_CONNECT, "Cannot establish connection to %s", address);
843 if (endpoint.protocol == CONNECTION_ENDPOINT_WEBSOCKET) {
844 uint64_t deadline =
845 time_get_ns() + (settings ? (uint64_t)settings->timeout_ms * NS_PER_MS_INT : 15 * NS_PER_SEC_INT);
846 while (!acip_transport_is_connected(transport) && time_get_ns() < deadline && !connect_cancelled((void *)settings))
848 if (!acip_transport_is_connected(transport)) {
849 acip_transport_destroy(transport);
850 return SET_ERRNO(ERROR_NETWORK_CONNECT, "WebSocket establishment failed or cancelled");
851 }
852 }
853 network_connection_t *c = connection_create(NULL, transport, endpoint.host,
855 strncmp(endpoint.input, "wss://", sizeof("wss://") - 1) == 0,
856 false);
857 if (!c) {
858 acip_transport_destroy(transport);
859 if (quic_endpoint) {
862 }
863 return SET_ERRNO(ERROR_MEMORY, "Cannot allocate connection");
864 }
865 if (resolved)
866 *resolved = endpoint;
867 c->port = endpoint.port;
869 *out = c;
870 ascii_otel_metric(ASCII_OTEL_METRIC_CONNECTION_ESTABLISHED, 1);
871 return ASCIICHAT_OK;
872}
asciichat_error_t connection_endpoint_resolve(const char *input, uint16_t default_port, connection_endpoint_t *endpoint_out)
For connection endpoint, this is the live record that ties protocol, port, has_explicit_port together...
@ CONNECTION_ENDPOINT_QUIC
@ CONNECTION_ENDPOINT_WEBSOCKET
asciichat_error_t quic_endpoint_stop(quic_endpoint_t *endpoint)
Definition endpoint.c:308
asciichat_error_t quic_endpoint_destroy(quic_endpoint_t **endpoint)
Definition endpoint.c:353
unsigned long long uint64_t
Definition common.h:63
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ERROR_NETWORK_CONNECT
Definition error_codes.h:74
#define log_info(...)
Log an INFO message.
Definition log/log.h:608
#define NS_PER_SEC_INT
Definition time.h:169
#define NS_PER_MS_INT
Definition time.h:168
void platform_sleep_ms(unsigned int ms)
Sleep for a specified number of milliseconds.
struct acip_transport acip_transport_t
Forward declaration of ACIP transport.
Definition host.h:506
struct quic_endpoint quic_endpoint_t
struct network_connection network_connection_t
void ascii_otel_metric(ascii_otel_metric_t metric, double value)
Definition otel.c:161
#define ASCII_OTEL_SCOPE(id)
Definition otel.h:72
#define ASCII_OTEL_ATTR_INT(key, value)
Definition otel.h:67
#define ASCII_OTEL_ATTR_STRING(key, value)
Definition otel.h:66
connection_endpoint_protocol_t protocol
quic_endpoint_t * owned_quic_endpoint
void acip_transport_destroy(acip_transport_t *transport)
Destroy transport and free all resources.
acip_transport_t * acip_websocket_client_transport_create(const char *name, const char *url, crypto_context_t *crypto_ctx)
Create WebSocket client transport.

References acip_transport_destroy(), acip_websocket_client_transport_create(), ASCII_OTEL_ATTR_INT, ASCII_OTEL_ATTR_STRING, ascii_otel_metric(), ASCII_OTEL_SCOPE, ASCIICHAT_OK, CONNECTION_ENDPOINT_QUIC, connection_endpoint_resolve(), CONNECTION_ENDPOINT_WEBSOCKET, ERROR_INVALID_PARAM, ERROR_MEMORY, ERROR_NETWORK_CONNECT, connection_endpoint_t::host, connection_endpoint_t::input, log_info, NS_PER_MS_INT, NS_PER_SEC_INT, out, network_connection::owned_quic_endpoint, platform_sleep_ms(), connection_endpoint_t::port, network_connection::port, connection_endpoint_t::protocol, quic_endpoint_destroy(), quic_endpoint_stop(), SET_ERRNO, and network_connect_config_t::timeout_ms.

Referenced by acds_client_connect(), and network_connection_establish().

◆ network_connection_peer()

const char * network_connection_peer ( network_connection_t * c)

Definition at line 93 of file lib/network/connection.c.

93 {
94 return c->peer;
95}

References network_connection::peer.

◆ network_connection_prepare_security()

asciichat_error_t network_connection_prepare_security ( network_connection_t * c,
bool server,
const char * password )

Definition at line 119 of file lib/network/connection.c.

119 {
121 return SET_ERRNO(ERROR_INVALID_STATE, "Connection security already configured");
122 c->security_claimed = c->security_options = true;
123 /* QUIC protects its own endpoints, but ACIP encryption is also required
124 * for the application identity and intermediary trust boundary. */
125 bool transport_satisfies_acip_encryption = c->secure && acip_transport_get_type(c->transport) != ACIP_TRANSPORT_QUIC;
126 asciichat_error_t result =
127 acip_security_init_options(&c->security, server, transport_satisfies_acip_encryption, password);
128 if (result == ASCIICHAT_OK && !server) {
130 SAFE_STRNCPY(ctx->server_hostname, c->peer, sizeof(ctx->server_hostname));
131 SAFE_STRNCPY(ctx->server_ip, c->peer, sizeof(ctx->server_ip));
132 ctx->server_port = c->port;
133 }
134 return result;
135}
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:423
@ ERROR_INVALID_STATE
@ ACIP_TRANSPORT_QUIC
QUIC/UDP (future).
network_connection_state_t network_connection_state(network_connection_t *c)
asciichat_error_t acip_security_init_options(acip_security_t *security, bool server, bool transport_secure, const char *password_override)
Cryptographic handshake context structure.
acip_transport_t * transport

References acip_security_init_options(), ACIP_TRANSPORT_QUIC, ASCIICHAT_OK, ERROR_INVALID_STATE, acip_security::handshake, network_connection_state(), NETWORK_NEGOTIATING, network_connection::peer, network_connection::port, SAFE_STRNCPY, network_connection::secure, network_connection::security, network_connection::security_claimed, network_connection::security_options, crypto_handshake_context_t::server_hostname, crypto_handshake_context_t::server_ip, crypto_handshake_context_t::server_port, SET_ERRNO, and network_connection::transport.

Referenced by client_crypto_init().

◆ network_connection_ready()

void network_connection_ready ( network_connection_t * c)

Definition at line 102 of file lib/network/connection.c.

102 {
103 int expected = NETWORK_NEGOTIATING;
104 atomic_cas_int(&c->state, &expected, NETWORK_READY);
105}

References NETWORK_NEGOTIATING, NETWORK_READY, and network_connection::state.

Referenced by acds_client_connect(), and network_connection_establish().

◆ network_connection_request_stop()

void network_connection_request_stop ( network_connection_t * c)

Definition at line 106 of file lib/network/connection.c.

106 {
107 if (!c)
108 return;
109 atomic_store_int(&c->state, NETWORK_CLOSING);
110 acip_transport_interrupt(c->transport);
111}

References NETWORK_CLOSING, network_connection::state, and network_connection::transport.

Referenced by disconnect_client_for_bad_data(), handle_client_leave_packet(), and session_host_remove_client().

◆ network_connection_run()

asciichat_error_t network_connection_run ( network_connection_t * c,
const network_connection_callbacks_t * callbacks,
void * context )

Execute an outbound connection on its controlling worker. The owner joins that worker before destroy; this call retains all resources on return.

Definition at line 900 of file lib/network/connection.c.

901 {
902 if (!c || c->server || !callbacks || !callbacks->packet || c->opened)
903 return SET_ERRNO(ERROR_INVALID_STATE, "Connection already has an execution owner");
904 c->callbacks = *callbacks;
905 c->callback_context = context;
906 connection_receive(c);
907 return c->result;
908}
asciichat_error_t(* packet)(network_connection_t *, packet_type_t, const void *, size_t, void *)
network_server_t * server
network_connection_callbacks_t callbacks

References network_connection::callback_context, network_connection::callbacks, ERROR_INVALID_STATE, network_connection::opened, network_connection_callbacks_t::packet, network_connection::result, network_connection::server, and SET_ERRNO.

◆ network_connection_secure()

bool network_connection_secure ( network_connection_t * c)

Definition at line 96 of file lib/network/connection.c.

96 {
97 return c->secure;
98}

References network_connection::secure.

◆ network_connection_set_context()

void network_connection_set_context ( network_connection_t * c,
void * context )

Definition at line 90 of file lib/network/connection.c.

90 {
91 atomic_ptr_store(&c->context, context);
92}

References network_connection::context.

◆ network_connection_state()

network_connection_state_t network_connection_state ( network_connection_t * c)

Definition at line 99 of file lib/network/connection.c.

99 {
100 return atomic_load_int(&c->state);
101}

References network_connection::state.

Referenced by network_connection_prepare_security().

◆ network_connection_transport()

◆ network_server_adopt()

asciichat_error_t network_server_adopt ( network_server_t * s,
acip_transport_t * transport,
const char * peer,
bool secure )

Adopt an authenticated peer transport on success; the caller retains it on failure.

Definition at line 491 of file lib/network/connection.c.

492 {
493 return server_adopt(s, transport, peer, secure, true);
494}

Referenced by session_host_accept_peer().

◆ network_server_adopt_negotiating()

asciichat_error_t network_server_adopt_negotiating ( network_server_t * s,
acip_transport_t * transport,
const char * peer,
bool secure )

Adopt a connected transport before application authentication. The caller retains it on failure; on success the server owns it and drives negotiation.

Definition at line 495 of file lib/network/connection.c.

496 {
497 return server_adopt(s, transport, peer, secure, false);
498}

◆ network_server_config()

const network_server_config_t * network_server_config ( network_server_t * s)

Definition at line 695 of file lib/network/connection.c.

695 {
696 return s ? &s->config : NULL;
697}
network_server_config_t config

References network_server::config.

◆ network_server_connection_count()

size_t network_server_connection_count ( network_server_t * s)

Definition at line 684 of file lib/network/connection.c.

684 {
685 if (!s)
686 return 0;
687 mutex_lock(&s->registry_mutex);
688 size_t count = s->count;
689 mutex_unlock(&s->registry_mutex);
690 return count;
691}

References network_server::count, and network_server::registry_mutex.

Referenced by ui_status_gather().

◆ network_server_create()

asciichat_error_t network_server_create ( const network_server_config_t * config,
network_server_t ** out )

Definition at line 553 of file lib/network/connection.c.

553 {
554 if (!config || !out || !config->callbacks.packet)
555 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing network server configuration");
556 *out = NULL;
557 network_server_t *s = SAFE_CALLOC(1, sizeof(*s), network_server_t *);
558 if (!s)
559 return SET_ERRNO(ERROR_MEMORY, "Cannot allocate network server");
560 s->config = *config;
564 s->config.handshake_timeout_ms = 30000;
566 s->config.partial_timeout_ms = 5000;
567 asciichat_error_t result = mutex_init(&s->registry_mutex, "network_registry");
568 if (result != ASCIICHAT_OK) {
569 SAFE_FREE(s);
570 return result;
571 }
572 s->peers = thread_pool_create("network_peers");
573 if (!s->peers) {
574 mutex_destroy(&s->registry_mutex);
575 SAFE_FREE(s);
576 return SET_ERRNO(ERROR_THREAD, "Cannot create peer workers");
577 }
578 tcp_server_config_t tcp = {.port = config->port,
579 .ipv4_address = config->ipv4_address,
580 .ipv6_address = config->ipv6_address,
581 .bind_ipv4 = config->bind_ipv4,
582 .bind_ipv6 = config->bind_ipv6,
583 .event_handler = listener_accept,
584 .user_data = s,
585 .tick_fn = server_tick,
586 .tick_user_data = s};
587 result = tcp_server_init(&s->listener, &tcp);
588 s->listener_initialized = result == ASCIICHAT_OK;
589 if (result == ASCIICHAT_OK && config->websocket_enabled) {
590 websocket_server_config_t ws = {.port = config->websocket_port,
591 .bind_address = config->ipv4_address ? config->ipv4_address : config->ipv6_address,
592 .client_handler = websocket_accept,
593 .user_data = s,
594 .tls_cert_path = config->tls_cert_path,
595 .tls_key_path = config->tls_key_path};
596 result = websocket_server_init(&s->websocket, &ws);
597 s->websocket_initialized = result == ASCIICHAT_OK;
598 }
599 if (result != ASCIICHAT_OK) {
601 return result;
602 }
603 *out = s;
604 return ASCIICHAT_OK;
605}
#define MIN(a, b)
Return the minimum of two values.
Definition common.h:170
#define SAFE_FREE(ptr)
Definition common.h:377
#define SAFE_CALLOC(count, size, cast)
Definition common.h:275
@ ERROR_THREAD
struct network_server network_server_t
void network_server_destroy(network_server_t **owner)
#define NETWORK_CONNECTION_LIMIT
asciichat_error_t tcp_server_init(tcp_server_t *server, const tcp_server_config_t *config)
asciichat_error_t websocket_server_init(websocket_server_t *server, const websocket_server_config_t *config)
Initialize WebSocket server.
network_connection_callbacks_t callbacks
websocket_server_t websocket
thread_pool_t * peers
Listener settings and callbacks used to create a WebSocket server.
thread_pool_t * thread_pool_create(const char *pool_name)
Create a new thread pool (long-lived threads mode).
Definition thread_pool.c:92

References ASCIICHAT_OK, network_server_config_t::bind_ipv4, network_server_config_t::bind_ipv6, network_server_config_t::callbacks, network_server::config, ERROR_INVALID_PARAM, ERROR_MEMORY, ERROR_THREAD, network_server_config_t::handshake_timeout_ms, network_server_config_t::ipv4_address, network_server_config_t::ipv6_address, network_server::listener, network_server::listener_initialized, network_server_config_t::max_connections, MIN, NETWORK_CONNECTION_LIMIT, network_server_destroy(), out, network_connection_callbacks_t::packet, network_server_config_t::partial_timeout_ms, network_server::peers, network_server_config_t::port, network_server::registry_mutex, SAFE_CALLOC, SAFE_FREE, SET_ERRNO, tcp_server_init(), thread_pool_create(), network_server_config_t::tls_cert_path, network_server_config_t::tls_key_path, network_server::websocket, network_server_config_t::websocket_enabled, network_server::websocket_initialized, network_server_config_t::websocket_port, and websocket_server_init().

Referenced by session_host_start(), and session_server_like_run().

◆ network_server_destroy()

void network_server_destroy ( network_server_t ** owner)

Definition at line 669 of file lib/network/connection.c.

669 {
670 if (!owner || !*owner)
671 return;
672 network_server_t *s = *owner;
674 return;
678 mutex_destroy(&s->registry_mutex);
681 SAFE_FREE(*owner);
682 *owner = NULL;
683}
#define NAMED_UNREGISTER(ptr)
Unregister a pointer.
asciichat_error_t network_server_stop(network_server_t *s)
void tcp_server_destroy(tcp_server_t *server)
void thread_pool_destroy(thread_pool_t *pool)
Destroy a thread pool.

References ASCIICHAT_OK, network_server::executing, network_server::listener, network_server::listener_initialized, NAMED_UNREGISTER, network_server_stop(), network_server::peers, network_server::registry_mutex, SAFE_FREE, network_server::stopping, tcp_server_destroy(), and thread_pool_destroy().

Referenced by network_server_create(), session_host_start(), session_host_stop(), and session_server_like_run().

◆ network_server_foreach()

void network_server_foreach ( network_server_t * s,
network_connection_visit_fn visit,
void * context )

Definition at line 172 of file lib/network/connection.c.

172 {
173 if (!s || !visit)
174 return;
176 size_t count = 0;
177 mutex_lock(&s->registry_mutex);
178 for (network_connection_t *c = s->connections; c; c = c->next) {
179 if (atomic_load_int(&c->state) < NETWORK_CLOSING) {
180 atomic_fetch_add_int(&c->pins, 1);
181 snapshot[count++] = c;
182 }
183 }
184 mutex_unlock(&s->registry_mutex);
185 for (size_t i = 0; i < count; ++i) {
186 visit(snapshot[i], context);
187 atomic_fetch_sub_int(&snapshot[i]->pins, 1);
188 }
189}
network_connection_t * next
network_connection_t * connections

References network_server::connections, NETWORK_CLOSING, NETWORK_CONNECTION_LIMIT, network_connection::next, network_connection::pins, network_server::registry_mutex, and network_connection::state.

Referenced by broadcast_server_state_to_all_clients(), network_server_stop(), signaling_broadcast(), signaling_relay_ice(), and signaling_relay_sdp().

◆ network_server_request_stop()

void network_server_request_stop ( network_server_t * s)

Atomic-only request, including from a native signal handler.

Definition at line 626 of file lib/network/connection.c.

626 {
627 if (s)
628 atomic_store_bool(&s->stopping, true);
629}

References network_server::stopping.

Referenced by network_server_stop(), and session_host_stop().

◆ network_server_run()

asciichat_error_t network_server_run ( network_server_t * s)

Definition at line 618 of file lib/network/connection.c.

618 {
619 int expected = false;
620 if (!s || !atomic_cas_int(&s->executing, &expected, true))
621 return SET_ERRNO(ERROR_INVALID_STATE, "Network server already has an execution owner");
623 atomic_store_bool(&s->executing, false);
624 return result;
625}
asciichat_error_t tcp_server_run(tcp_server_t *server)

References ERROR_INVALID_STATE, network_server::executing, network_server::listener, SET_ERRNO, and tcp_server_run().

Referenced by session_server_like_run().

◆ network_server_start()

asciichat_error_t network_server_start ( network_server_t * s)

Definition at line 606 of file lib/network/connection.c.

606 {
607 if (!s || atomic_load_bool(&s->stopping))
608 return SET_ERRNO(ERROR_INVALID_STATE, "Network server stopped before startup");
610 asciichat_error_t result =
611 platform_thread_create(&s->websocket_thread, "websocket_io", websocket_run, &s->websocket);
612 if (result != ASCIICHAT_OK)
613 return result;
614 s->websocket_started = true;
615 }
616 return ASCIICHAT_OK;
617}
platform_thread_t websocket_thread

References ASCIICHAT_OK, ERROR_INVALID_STATE, SET_ERRNO, network_server::stopping, network_server::websocket, network_server::websocket_initialized, network_server::websocket_started, and network_server::websocket_thread.

Referenced by session_host_start(), and session_server_like_run().

◆ network_server_stop()

asciichat_error_t network_server_stop ( network_server_t * s)

Call after run returns (join its owner when running on another thread). Drains backend workers and connections, retaining dependencies on failure.

Definition at line 634 of file lib/network/connection.c.

634 {
635 if (!s)
636 return ASCIICHAT_OK;
638 if (atomic_load_bool(&s->executing))
639 return SET_ERRNO(ERROR_THREAD, "Join the network execution owner before releasing server dependencies");
640 network_server_foreach(s, stop_connection, NULL);
641 if (s->websocket_started) {
642 atomic_store_bool(&s->websocket.running, false);
644 asciichat_error_t result = thread_join(&s->websocket_thread, NULL);
645 if (result != ASCIICHAT_OK)
646 return result;
647 s->websocket_started = false;
648 }
649 if (s->websocket_initialized) {
651 s->websocket_initialized = false;
652 }
654 if (result != ASCIICHAT_OK)
655 return result;
657 while (c) {
658 network_connection_t *next = c->next;
659 if (c->cleanup_failed) {
660 connection_finish(c);
661 if (c->cleanup_failed)
662 return c->result;
663 connection_free(c);
664 }
665 c = next;
666 }
667 return s->count ? SET_ERRNO(ERROR_THREAD, "Connections still retain server dependencies") : ASCIICHAT_OK;
668}
void network_server_request_stop(network_server_t *s)
void network_server_foreach(network_server_t *s, network_connection_visit_fn visit, void *context)
void websocket_server_destroy(websocket_server_t *server)
Destroy WebSocket server and free resources.
void websocket_server_cancel_service(websocket_server_t *server)
Wake the WebSocket server event loop immediately.
asciichat_error_t thread_pool_stop_all(thread_pool_t *pool)
Stop all threads in the pool in stop_id order.

References ASCIICHAT_OK, network_connection::cleanup_failed, network_server::connections, network_server::count, ERROR_THREAD, network_server::executing, network_server_foreach(), network_server_request_stop(), network_connection::next, network_server::peers, network_connection::result, websocket_server::running, SET_ERRNO, thread_pool_stop_all(), network_server::websocket, network_server::websocket_initialized, websocket_server_cancel_service(), websocket_server_destroy(), network_server::websocket_started, and network_server::websocket_thread.

Referenced by network_server_destroy(), session_host_stop(), and session_server_like_run().

◆ network_server_websocket_enabled()

bool network_server_websocket_enabled ( network_server_t * s)

Definition at line 692 of file lib/network/connection.c.

692 {
693 return s && s->config.websocket_enabled;
694}

References network_server::config, and network_server_config_t::websocket_enabled.

Referenced by session_server_like_run().