36 bool quiet = (config && config->
quiet);
53 if (!servers || count <= 0) {
58 printf(
"\nAvailable ASCII-Chat servers on LAN:\n");
59 for (
int i = 0; i < count; i++) {
62 printf(
" %d. %s (%s:%u)\n", i + 1, srv->
name, addr, srv->
port);
66 printf(
"\nSelect server (1-%d) or press Enter to cancel: ", count);
71 if (fgets(input,
sizeof(input), stdin) == NULL) {
77 if (input[0] ==
'\n' || input[0] ==
'\r' || input[0] ==
'\0') {
83 long selection = strtol(input, &endptr, 10);
86 if (selection < 1 || selection > count) {
87 printf(
"ā ļø Invalid selection. Please enter a number between 1 and %d\n", count);
91 return (
int)(selection - 1);
97#define ANSI_CLEAR "\033[2J\033[H"
98#define ANSI_BOLD "\033[1m"
99#define ANSI_RESET "\033[0m"
100#define ANSI_CYAN "\033[36m"
101#define ANSI_GREEN "\033[32m"
102#define ANSI_YELLOW "\033[33m"
103#define ANSI_HIDE_CURSOR "\033[?25l"
104#define ANSI_SHOW_CURSOR "\033[?25h"
105#define ANSI_CLEAR_LINE "\033[K"
121 if (!servers || count <= 0) {
142 for (
int i = 0; i < count; i++) {
153 log_plain(
"%sā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ%s\n",
ANSI_BOLD,
ANSI_RESET);
157 log_plain(
"Enter server number (1-%d) or press Enter to cancel: ", count);
165 if (fgets(input,
sizeof(input), stdin) == NULL) {
170 if (input[0] ==
'\n' || input[0] ==
'\r' || input[0] ==
'\0') {
176 long selection = strtol(input, &endptr, 10);
179 if (selection < 1 || selection > count) {
200 return (
int)(selection - 1);
212 if (server->
ipv4[0] !=
'\0') {
215 if (server->
name[0] !=
'\0') {
218 if (server->
ipv6[0] !=
'\0') {
š Cross-platform abstraction layer umbrella header for ascii-chat
void discovery_mdns_free(discovery_tui_server_t *servers)
Free memory from mDNS discovery results.
discovery_tui_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.
Parallel mDNS and ACDS session discovery.
void discovery_tui_free_results(discovery_tui_server_t *servers)
Free results from mDNS discovery.
discovery_tui_server_t * discovery_tui_query(const discovery_tui_config_t *config, int *out_count)
TUI wrapper around core mDNS discovery.
int discovery_tui_prompt_selection(const discovery_tui_server_t *servers, int count)
Interactive server selection.
#define ANSI_CLEAR
ANSI escape codes for TUI.
int discovery_tui_select(const discovery_tui_server_t *servers, int count)
TUI-based server selection with formatted display.
const char * discovery_tui_get_best_address(const discovery_tui_server_t *server)
Get best address for a server.
TUI-based service discovery for ascii-chat client.
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it.
bool log_lock_terminal(void)
Lock terminal output for exclusive access by the calling thread.
#define log_plain(...)
Plain logging - writes to both log file and stderr without timestamps or log levels.
void log_unlock_terminal(bool previous_state)
Release terminal lock and flush buffered messages.
š Logging API with multiple log levels and terminal output control
Configuration for TUI discovery.
int max_servers
Maximum servers to collect (default: 20)
bool quiet
Suppress discovery messages (default: false)
int timeout_ms
Maximum time to wait for responses (default: 2000)
Discovered server information from mDNS.
char name[256]
Service instance name (e.g., "swift-river-canyon")
uint16_t port
Server port number.
char ipv6[46]
IPv6 address (if available)
char ipv4[16]
IPv4 address (if available)
char address[256]
Server address (IPv4, IPv6, or hostname)