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

Go to the source code of this file.

Functions

asciichat_error_t session_quic_listeners_open (int port, quic_endpoint_t **native, quic_endpoint_t **webtransport)
asciichat_error_t session_quic_listeners_close (quic_endpoint_t **native, quic_endpoint_t **webtransport)

Function Documentation

◆ session_quic_listeners_close()

asciichat_error_t session_quic_listeners_close ( quic_endpoint_t ** native,
quic_endpoint_t ** webtransport )

Definition at line 59 of file quic_listeners.c.

59 {
60 if (!native || !webtransport)
61 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing session QUIC listener outputs");
62 quic_endpoint_t **endpoints[] = {webtransport, native};
63 for (size_t i = 0; i < 2; ++i) {
64 if (!*endpoints[i])
65 continue;
66 asciichat_error_t result = quic_endpoint_stop(*endpoints[i]);
67 if (result == ASCIICHAT_OK)
68 result = quic_endpoint_destroy(endpoints[i]);
69 if (result != ASCIICHAT_OK)
70 return result;
71 }
72 return ASCIICHAT_OK;
73}
#define SET_ERRNO(code,...)
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
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
struct quic_endpoint quic_endpoint_t

References ASCIICHAT_OK, ERROR_INVALID_PARAM, quic_endpoint_destroy(), quic_endpoint_stop(), and SET_ERRNO.

Referenced by session_host_stop(), and session_server_like_run().

◆ session_quic_listeners_open()

asciichat_error_t session_quic_listeners_open ( int port,
quic_endpoint_t ** native,
quic_endpoint_t ** webtransport )

Definition at line 7 of file quic_listeners.c.

7 {
8 if (!native || !webtransport || *native || *webtransport || port < 1 || port > UINT16_MAX)
9 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid session QUIC listener state");
10 const char *native_address = GET_OPTION(quic_bind_address);
11 const char *browser_address = GET_OPTION(webtransport_bind_address);
12 const char *origin = GET_OPTION(webtransport_origin);
13 const char *path = GET_OPTION(webtransport_path);
14 const char *certificate = GET_OPTION(tls_cert);
15 const char *key = GET_OPTION(tls_key);
16 int quic_port = GET_OPTION(quic_port);
17 bool browser = *browser_address || *origin;
18 bool requested = *native_address || browser || quic_port;
19 if (!requested) {
20 if (*certificate || *key)
21 return SET_ERRNO(ERROR_USAGE, "TLS credentials require a secure network listener");
22 return ASCIICHAT_OK;
23 }
24 if (quic_port < 0 || quic_port > UINT16_MAX)
25 return SET_ERRNO(ERROR_USAGE, "QUIC port must be between 0 and 65535");
26 const char *address = *native_address ? native_address : browser_address;
27 if (!*address || !*certificate || !*key)
28 return SET_ERRNO(ERROR_USAGE, "QUIC requires a bind address, --tls-cert, and --tls-key");
29 if (browser && (!*origin || !*path))
30 return SET_ERRNO(ERROR_USAGE, "WebTransport requires --webtransport-origin and --webtransport-path");
31 if (*native_address && *browser_address && strcmp(native_address, browser_address))
32 return SET_ERRNO(ERROR_USAGE, "Native QUIC and WebTransport share --quic-port and must use the same bind address");
33 struct sockaddr_storage bind_address;
34 socklen_t bind_length = 0;
35 uint16_t selected_port = (uint16_t)(quic_port ? quic_port : port);
36 asciichat_error_t result = parse_numeric_socket_address(address, selected_port, &bind_address, &bind_length);
37 if (result != ASCIICHAT_OK)
38 return result;
39 quic_config_t config = {.certificate_file = certificate,
40 .private_key_file = key,
41 .webtransport_origin = browser ? origin : NULL,
42 .webtransport_path = browser ? path : NULL,
43 .enable_datagrams = true,
44 .accept_native = browser,
45 .prefer_audio_datagrams = GET_OPTION(quic_audio_datagrams),
46 .prefer_visual_datagrams = GET_OPTION(quic_visual_datagrams)};
47 // One endpoint owns the UDP socket and dispatches each connection by ALPN.
48 // Keep the second output empty so teardown and accept never alias ownership.
49 result = quic_endpoint_open((const struct sockaddr *)&bind_address, bind_length, true, &config, native);
50 if (result != ASCIICHAT_OK)
51 return result;
52 log_info("Native QUIC listener initialized on %s UDP port %u", address, selected_port);
53 if (browser)
54 log_info("WebTransport listener initialized on %s UDP port %u (shared QUIC listener)", address, selected_port);
55
56 return ASCIICHAT_OK;
57}
asciichat_error_t quic_endpoint_open(const struct sockaddr *address, socklen_t length, bool listener, const quic_config_t *config, quic_endpoint_t **out)
Definition endpoint.c:131
unsigned short uint16_t
Definition common.h:61
@ ERROR_USAGE
Definition error_codes.h:48
#define log_info(...)
Log an INFO message.
Definition log/log.h:608
#define GET_OPTION(field)
Safely get a specific option field (lock-free read).
Definition options.h:1336
asciichat_error_t parse_numeric_socket_address(const char *host, uint16_t port, struct sockaddr_storage *address, socklen_t *length)
Definition ip.c:154

References ASCIICHAT_OK, ERROR_INVALID_PARAM, ERROR_USAGE, GET_OPTION, log_info, parse_numeric_socket_address(), quic_endpoint_open(), and SET_ERRNO.

Referenced by session_host_start(), and session_server_like_run().