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.c File Reference

mDNS service discovery UI wrapper for interactive server selection More...

Go to the source code of this file.

Data Structures

struct  mdns_snapshot_t
 TUI-based server selection with formatted display. More...
struct  mdns_refresh_t

Macros

#define TUI_MDNS_INPUT_BUFFER_SIZE   32
#define TUI_MDNS_HEADING_BUFFER_SIZE   128
#define TUI_MDNS_LINE_BUFFER_SIZE   512
#define TUI_MDNS_CLIPPED_BUFFER_SIZE   512
#define MDNS_LIVE_CAPACITY   128
#define MDNS_LIST_MAX_ROWS   12

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)
 TUI-based server selection with formatted display.
void ui_mdns_free_results (ui_mdns_server_t *servers)
 Free results from mDNS discovery.
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)
 This is the handoff point for mdns refresh. Callers fill mutex, stop, thread, running before passing it on; consumers read the values during the operation and return ownership only where the member contract explicitly says they do.

Detailed Description

mDNS service discovery UI wrapper for interactive server selection

Pure TUI wrapper that calls discovery_mdns_query() from discovery.c. Provides interactive terminal UI for server selection and address resolution.

Definition in file tui/mdns.c.

Macro Definition Documentation

◆ MDNS_LIST_MAX_ROWS

#define MDNS_LIST_MAX_ROWS   12

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

◆ MDNS_LIVE_CAPACITY

#define MDNS_LIVE_CAPACITY   128

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

Referenced by ui_mdns_select_live().

◆ TUI_MDNS_CLIPPED_BUFFER_SIZE

#define TUI_MDNS_CLIPPED_BUFFER_SIZE   512

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

◆ TUI_MDNS_HEADING_BUFFER_SIZE

#define TUI_MDNS_HEADING_BUFFER_SIZE   128

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

◆ TUI_MDNS_INPUT_BUFFER_SIZE

#define TUI_MDNS_INPUT_BUFFER_SIZE   32

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

◆ TUI_MDNS_LINE_BUFFER_SIZE

#define TUI_MDNS_LINE_BUFFER_SIZE   512

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

Function Documentation

◆ ui_mdns_free_results()

void ui_mdns_free_results ( ui_mdns_server_t * servers)

Free results from mDNS discovery.

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)

This is the handoff point for mdns refresh. Callers fill mutex, stop, thread, running before passing it on; consumers read the values during the operation and return ownership only where the member contract explicitly says they do.

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 )

TUI-based server selection with formatted display.

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().