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

mDNS service discovery UI with terminal_screen rendering More...

Go to the source code of this file.

Data Structures

struct  ui_mdns_server_t
 Discovered server information from mDNS. More...
struct  ui_mdns_config_t
 Configuration for TUI discovery. More...

Macros

#define TUI_MDNS_NAME_BUFFER_SIZE   256
#define TUI_MDNS_SESSION_STRING_BUFFER_SIZE   256
#define TUI_MDNS_ADDRESS_BUFFER_SIZE   256
#define TUI_MDNS_IPV4_BUFFER_SIZE   16
#define TUI_MDNS_IPV6_BUFFER_SIZE   46

Functions

void ui_mdns_log_init (void)
 Discovered server information from mDNS.
void ui_mdns_log_destroy (void)
 Destroy mDNS discovery log buffer.
void ui_mdns_log_clear (void)
 Clear mDNS discovery log buffer.
void ui_mdns_log_append (const char *message)
 Append message to mDNS discovery log buffer.
ui_mdns_server_t * ui_mdns_query (const ui_mdns_config_t *config, int *out_count)
 Discover ascii-chat servers on the local network via mDNS.
void ui_mdns_free_results (ui_mdns_server_t *servers)
 Free results from TUI discovery query.
int ui_mdns_prompt_selection (const ui_mdns_server_t *servers, int count)
 Interactive server selection.
int ui_mdns_select (const ui_mdns_server_t *servers, int count)
int ui_mdns_select_until (const ui_mdns_server_t *servers, int count, uint64_t deadline)
int ui_mdns_select_live (const ui_mdns_server_t *servers, int count, uint64_t deadline, ui_mdns_server_t *chosen)
const char * ui_mdns_get_best_address (const ui_mdns_server_t *server)
 Get best address representation for a discovered server.

Detailed Description

mDNS service discovery UI with terminal_screen rendering

Implements interactive mDNS-based discovery of ascii-chat servers on the local network. Uses the shared terminal_screen infrastructure for consistent UI rendering with other modules.

Definition in file tui/mdns.h.

Macro Definition Documentation

◆ TUI_MDNS_ADDRESS_BUFFER_SIZE

#define TUI_MDNS_ADDRESS_BUFFER_SIZE   256

Definition at line 14 of file tui/mdns.h.

◆ TUI_MDNS_IPV4_BUFFER_SIZE

#define TUI_MDNS_IPV4_BUFFER_SIZE   16

Definition at line 15 of file tui/mdns.h.

◆ TUI_MDNS_IPV6_BUFFER_SIZE

#define TUI_MDNS_IPV6_BUFFER_SIZE   46

Definition at line 16 of file tui/mdns.h.

◆ TUI_MDNS_NAME_BUFFER_SIZE

#define TUI_MDNS_NAME_BUFFER_SIZE   256

Definition at line 12 of file tui/mdns.h.

◆ TUI_MDNS_SESSION_STRING_BUFFER_SIZE

#define TUI_MDNS_SESSION_STRING_BUFFER_SIZE   256

Definition at line 13 of file tui/mdns.h.

Function Documentation

◆ ui_mdns_free_results()

void ui_mdns_free_results ( ui_mdns_server_t * servers)

Free results from TUI discovery query.

Releases memory allocated by ui_mdns_query().

Parameters
serversPointer to server array (safe to pass NULL)
Note
Safe to call multiple times or with NULL pointer

Free results from TUI discovery query.

Definition at line 100 of file tui/mdns.c.

100 {
101 discovery_mdns_destroy(servers);
102}
void discovery_mdns_destroy(ui_mdns_server_t *servers)
Free memory from mDNS discovery results.
Definition discovery.c:288

References discovery_mdns_destroy().

◆ ui_mdns_get_best_address()

const char * ui_mdns_get_best_address ( const ui_mdns_server_t * server)

Get best address representation for a discovered server.

Returns the most suitable address representation (IPv4 > IPv6 > hostname) for connecting to a discovered server.

Selection Priority:

  1. IPv4 address (most universal)
  2. IPv6 address
  3. Advertised hostname (service labels are never connection destinations)
Parameters
serverDiscovered server
Returns
Pointer to best address string (points to field in server struct)

Get best address representation for a discovered server.

Get best address for a server

Definition at line 439 of file tui/mdns.c.

439 {
440 if (!server) {
441 return "";
442 }
443
444 // The service instance name is a display label, not a resolvable hostname.
445 if (server->ipv4[0] != '\0') {
446 return server->ipv4;
447 }
448 if (server->ipv6[0] != '\0') {
449 return server->ipv6;
450 }
451
452 return server->address; // Fallback to address field
453}
char ipv4[16]
IPv4 address (if available).
Definition tui/mdns.h:71
char ipv6[46]
IPv6 address (if available).
Definition tui/mdns.h:72
char address[256]
Server address (IPv4, IPv6, or hostname).
Definition tui/mdns.h:69

References ui_mdns_server_t::address, ui_mdns_server_t::ipv4, and ui_mdns_server_t::ipv6.

◆ ui_mdns_log_append()

void ui_mdns_log_append ( const char * message)

Append message to mDNS discovery log buffer.

Delegates to the logging system which automatically captures to session log buffer.

Parameters
messageLog message to append

Definition at line 68 of file tui/mdns.c.

68 {
69 if (message) {
70 log_info("%s", message);
71 }
72}
#define log_info(...)
Log an INFO message.
Definition log/log.h:608

References log_info.

◆ ui_mdns_log_clear()

void ui_mdns_log_clear ( void )

Clear mDNS discovery log buffer.

Delegates to terminal_screen log clear. Useful when starting fresh mDNS discovery screen.

Definition at line 64 of file tui/mdns.c.

64 {
66}
void terminal_screen_log_clear(void)
Clear buffered logs for terminal screens.

References terminal_screen_log_clear().

◆ ui_mdns_log_destroy()

void ui_mdns_log_destroy ( void )

Destroy mDNS discovery log buffer.

Delegates to terminal_screen log cleanup.

Definition at line 59 of file tui/mdns.c.

59 {
62}
void log_clear_session_log_buffer(void)
Unregister the session log buffer.
Definition log.c:2057
void terminal_screen_log_destroy(void)
Standard log cleanup for terminal screens.

References log_clear_session_log_buffer(), and terminal_screen_log_destroy().

◆ ui_mdns_log_init()

void ui_mdns_log_init ( void )

Discovered server information from mDNS.

Configuration for TUI discovery

Initialize log buffer for mDNS discovery UI

Delegates to terminal_screen log initialization. Call once at startup before rendering mDNS discovery screen.

Definition at line 52 of file tui/mdns.c.

52 {
54 if (buf) {
56 }
57}
struct session_log_buffer session_log_buffer_t
Thread-safe fixed-size history ring for session-screen log lines.
void log_set_session_log_buffer(session_log_buffer_t *buf)
Register a session log buffer with the logger.
Definition log.c:2048
session_log_buffer_t * terminal_screen_log_init(void)
Initialize session log buffer for terminal screens.

References log_set_session_log_buffer(), and terminal_screen_log_init().

◆ ui_mdns_prompt_selection()

int ui_mdns_prompt_selection ( const ui_mdns_server_t * servers,
int count )

Interactive server selection.

Interactive controller picker; Enter selects the highlighted row, Esc/q cancels. Redirected input never chooses a server implicitly. Returns -1 when a terminal is unavailable.

Definition at line 107 of file tui/mdns.c.

107 {
108 if (terminal_can_prompt_user(!GET_OPTION(snapshot_mode)))
109 return ui_mdns_select(servers, count);
110 if (!servers || count <= 0) {
111 return -1;
112 }
113
114 log_error("Cannot select a discovered server without an interactive terminal; specify a server address.");
115 return -1;
116}
#define log_error(...)
Log an ERROR message.
Definition log/log.h:634
#define GET_OPTION(field)
Safely get a specific option field (lock-free read).
Definition options.h:1336
int ui_mdns_select(const ui_mdns_server_t *servers, int count)
Definition tui/mdns.c:291

References GET_OPTION, log_error, and ui_mdns_select().

◆ ui_mdns_query()

ui_mdns_server_t * ui_mdns_query ( const ui_mdns_config_t * config,
int * out_count )

Discover ascii-chat servers on the local network via mDNS.

Performs an mDNS query for _ascii-chat._tcp services on the local network. Collects responses and returns discovered servers to the caller.

Behavior:

  • Sends multicast mDNS query for _ascii-chat._tcp.local services
  • Waits for responses for the specified timeout period
  • Collects all discovered servers with their addresses and ports
  • Returns array of discovered servers

Memory Management:

Error Handling:

  • Returns NULL and sets errno on initialization failure
  • Partial results returned if mDNS init fails but discovery was attempted
  • Network errors logged but don't prevent continuation

Threading:

  • Blocking operation - waits for full timeout period
  • Safe to call from main thread
  • Does not spawn background threads
Parameters
configDiscovery configuration (NULL uses defaults)
out_countOutput parameter: number of discovered servers
Returns
Array of discovered servers, or NULL on error Must be freed with ui_mdns_free_results()
Note
Timeout includes network round-trip time, so 2000ms allows ~1.5s of actual waiting
Returns empty array (non-NULL with count=0) if no servers found, not NULL

Example:

ui_mdns_config_t config = {.timeout_ms = 2000, .max_servers = 20};
int count = 0;
ui_mdns_server_t *servers = ui_mdns_query(&config, &count);
if (servers && count > 0) {
for (int i = 0; i < count; i++) {
printf("%d: %s (%s:%d)\n", i+1, servers[i].name, servers[i].address, servers[i].port);
}
// User selects server...
}
Configuration for TUI discovery.
Definition tui/mdns.h:79
Discovered server information from mDNS.
Definition tui/mdns.h:66
ui_mdns_server_t * ui_mdns_query(const ui_mdns_config_t *config, int *out_count)
TUI-based server selection with formatted display.
Definition tui/mdns.c:80
void ui_mdns_free_results(ui_mdns_server_t *servers)
Free results from mDNS discovery.
Definition tui/mdns.c:100

Discover ascii-chat servers on the local network via mDNS.

TUI wrapper around core mDNS discovery

Calls discovery_mdns_query() from discovery.c with TUI-friendly configuration.

Definition at line 80 of file tui/mdns.c.

80 {
81 if (!out_count) {
82 SET_ERRNO(ERROR_INVALID_PARAM, "out_count pointer is NULL");
83 return NULL;
84 }
85
86 *out_count = 0;
87
88 // Apply defaults if needed
89 int timeout_ms = (config && config->timeout_ms > 0) ? config->timeout_ms : 2000;
90 int max_servers = (config && config->max_servers > 0) ? config->max_servers : 20;
91 bool quiet = (config && config->quiet);
92
93 // Call the core mDNS discovery function from discovery.c
94 return discovery_mdns_query(timeout_ms, max_servers, quiet, out_count);
95}
#define SET_ERRNO(code,...)
ui_mdns_server_t * discovery_mdns_query(int timeout_ms, int max_servers, bool quiet, int *out_count)
Public mDNS query function used by both parallel discovery and TUI wrapper.
Definition discovery.c:192
@ ERROR_INVALID_PARAM
int max_servers
Maximum servers to collect (default: 20).
Definition tui/mdns.h:81
int timeout_ms
Maximum time to wait for responses (default: 2000).
Definition tui/mdns.h:80
bool quiet
Suppress discovery messages (default: false).
Definition tui/mdns.h:82

References discovery_mdns_query(), ERROR_INVALID_PARAM, ui_mdns_config_t::max_servers, ui_mdns_config_t::quiet, SET_ERRNO, and ui_mdns_config_t::timeout_ms.

◆ ui_mdns_select()

int ui_mdns_select ( const ui_mdns_server_t * servers,
int count )

Shared controller list: arrows/j/k move, Enter selects, digits choose by number, Esc/q cancels. Resizes retain the selection and scroll it into view. Returns -1 without waiting when no interactive terminal is available.

Definition at line 291 of file tui/mdns.c.

291 {
292 if (!servers || count <= 0)
293 return -1;
294 return ui_mdns_select_until(servers, count, ui_input_deadline(30));
295}
uint64_t ui_input_deadline(unsigned seconds)
Definition tui/input.c:48
int ui_mdns_select_until(const ui_mdns_server_t *servers, int count, uint64_t deadline)
Definition tui/mdns.c:415

References ui_input_deadline(), and ui_mdns_select_until().

Referenced by ui_mdns_prompt_selection().

◆ ui_mdns_select_live()

int ui_mdns_select_live ( const ui_mdns_server_t * servers,
int count,
uint64_t deadline,
ui_mdns_server_t * chosen )

Background LAN discovery while choosing; copies the selected endpoint into chosen. Returns 0 on selection, -1 on cancellation. Selection follows endpoint identity as the list changes; the worker is stopped and joined before returning.

Definition at line 419 of file tui/mdns.c.

419 {
420 if (!chosen || count < 0 || count > MDNS_LIVE_CAPACITY || (count && !servers))
421 return -1;
422 mdns_refresh_t refresh = {0};
423 refresh.count = count;
424 if (count)
425 memcpy(refresh.servers, servers, (size_t)count * sizeof(*servers));
426 if (mutex_init(&refresh.mutex, "lan_results") != 0)
427 return -1;
428 int selected = select_mdns_until(servers, count, deadline, &refresh, chosen);
429 mutex_destroy(&refresh.mutex);
430 return selected < 0 ? -1 : 0;
431}
mutex_t mutex
Definition tui/mdns.c:142
ui_mdns_server_t servers[128]
Definition tui/mdns.c:148
#define MDNS_LIVE_CAPACITY
Definition tui/mdns.c:139

References mdns_refresh_t::count, MDNS_LIVE_CAPACITY, mdns_refresh_t::mutex, and mdns_refresh_t::servers.

◆ ui_mdns_select_until()

int ui_mdns_select_until ( const ui_mdns_server_t * servers,
int count,
uint64_t deadline )

Select with a caller-owned absolute monotonic deadline, retained across refreshes.

Definition at line 415 of file tui/mdns.c.

415 {
416 return select_mdns_until(servers, count, deadline, NULL, NULL);
417}

Referenced by ui_mdns_select().