ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
mode_defaults.c File Reference

Mode-aware default value getters for options. More...

Go to the source code of this file.

Functions

const mode_descriptor_t * get_mode_descriptor (asciichat_mode_t mode)
 Get mode descriptor by mode.
 
const mode_descriptor_t * get_modes_by_group (const char *group, size_t *out_count)
 Get all mode descriptors grouped by category.
 
const void * get_default_log_file (asciichat_mode_t mode)
 Get mode-specific default value for –log-file.
 
const void * get_default_port (asciichat_mode_t mode)
 Get mode-specific default value for –port.
 
const void * get_default_websocket_port (asciichat_mode_t mode)
 Get mode-specific default value for –websocket-port.
 
void apply_mode_specific_defaults (options_t *opts)
 Apply mode-specific defaults to an options struct after mode detection.
 

Detailed Description

Mode-aware default value getters for options.

Provides mode-specific default values for options that vary by mode, and mode metadata (names, descriptions, groups) for UI generation.

Author
Zachary Fogg me@zf.nosp@m.o.gg
Date
February 2026

Definition in file options/registry/mode_defaults.c.

Function Documentation

◆ apply_mode_specific_defaults()

void apply_mode_specific_defaults ( options_t *  opts)

Apply mode-specific defaults to an options struct after mode detection.

This function updates options that have mode-dependent defaults (port and websocket_port) based on the detected mode. Log file paths are handled separately by options_get_log_filepath().

Parameters
optsOptions struct to update (must have detected_mode already set)

Definition at line 184 of file options/registry/mode_defaults.c.

184 {
185 if (!opts) {
186 return;
187 }
188
189 // Apply port default based on mode
190 const int *mode_port = (const int *)get_default_port(opts->detected_mode);
191 if (mode_port) {
192 // Only update if still at a generic default (27224 or 27225)
193 if (opts->port == OPT_PORT_INT_DEFAULT || opts->port == OPT_ACDS_PORT_INT_DEFAULT) {
194 opts->port = *mode_port;
195 }
196 }
197
198 // Apply websocket-port default based on mode
199 const int *mode_websocket_port = (const int *)get_default_websocket_port(opts->detected_mode);
200 if (mode_websocket_port) {
201 // Only update if still at a generic default (27226 or 27227)
204 opts->websocket_port = *mode_websocket_port;
205 }
206 }
207
208 // If TLS cert+key are provided and websocket-port was not explicitly set,
209 // default to 443 (standard HTTPS/WSS port) instead of the mode default.
210 if (opts->websocket_tls_cert[0] != '\0' && opts->websocket_tls_key[0] != '\0') {
213 opts->websocket_port = 443;
214 }
215 }
216}
#define OPT_ACDS_PORT_INT_DEFAULT
Default ACDS discovery service port (integer)
#define OPT_WEBSOCKET_PORT_ACDS_DEFAULT
Default WebSocket port for discovery-service mode (integer)
#define OPT_PORT_INT_DEFAULT
Default TCP port for client/server communication (integer)
#define OPT_WEBSOCKET_PORT_SERVER_DEFAULT
Default WebSocket port for server mode (integer)
const void * get_default_websocket_port(asciichat_mode_t mode)
Get mode-specific default value for –websocket-port.
const void * get_default_port(asciichat_mode_t mode)
Get mode-specific default value for –port.
asciichat_mode_t detected_mode
Mode detected from command-line arguments.
int websocket_port
WebSocket server port (server/discovery-service only)
char websocket_tls_cert[256]
WebSocket TLS certificate file path (server/discovery-service only)
char websocket_tls_key[256]
WebSocket TLS private key file path (server/discovery-service only)

References options_state::detected_mode, get_default_port(), get_default_websocket_port(), OPT_ACDS_PORT_INT_DEFAULT, OPT_PORT_INT_DEFAULT, OPT_WEBSOCKET_PORT_ACDS_DEFAULT, OPT_WEBSOCKET_PORT_SERVER_DEFAULT, options_state::port, options_state::websocket_port, options_state::websocket_tls_cert, and options_state::websocket_tls_key.

Referenced by options_init().

◆ get_default_log_file()

const void * get_default_log_file ( asciichat_mode_t  mode)

Get mode-specific default value for –log-file.

Returns empty string - the actual log file path is determined by options_get_log_filepath() which properly handles debug vs release builds and platform-specific temp directories.

Debug builds: Uses current working directory (server.log, client.log, etc.) Release builds: Uses $TMPDIR/ascii-chat/server.log, etc.

Definition at line 109 of file options/registry/mode_defaults.c.

109 {
110 (void)mode; // Unused
111 // Return empty string - let options_get_log_filepath() handle the defaults
112 return "";
113}

◆ get_default_port()

const void * get_default_port ( asciichat_mode_t  mode)

Get mode-specific default value for –port.

Parameters
modeThe mode to get the default for
Returns
Pointer to the default port number for this mode

Definition at line 127 of file options/registry/mode_defaults.c.

127 {
128 switch (mode) {
129 case MODE_SERVER:
130 return &g_port_server;
131 case MODE_CLIENT:
132 return &g_port_client;
134 return &g_port_discovery_service;
135 case MODE_DISCOVERY:
136 return &g_port_discovery;
137 case MODE_MIRROR:
138 case MODE_INVALID:
139 default:
140 // Fallback
141 return &g_port_server;
142 }
143}
@ MODE_CLIENT
Client mode - network client options.
@ MODE_DISCOVERY_SERVICE
Discovery server mode - session management and WebRTC signaling.
@ MODE_INVALID
Invalid mode.
@ MODE_SERVER
Server mode - network server options.
@ MODE_MIRROR
Mirror mode - local webcam viewing (no network)
@ MODE_DISCOVERY
Discovery mode - participant that can dynamically become host.

References MODE_CLIENT, MODE_DISCOVERY, MODE_DISCOVERY_SERVICE, MODE_INVALID, MODE_MIRROR, and MODE_SERVER.

Referenced by apply_mode_specific_defaults().

◆ get_default_websocket_port()

const void * get_default_websocket_port ( asciichat_mode_t  mode)

Get mode-specific default value for –websocket-port.

Parameters
modeThe mode to get the default for
Returns
Pointer to the default WebSocket port number for this mode

Definition at line 155 of file options/registry/mode_defaults.c.

155 {
156 switch (mode) {
157 case MODE_SERVER:
158 return &g_websocket_port_server;
160 return &g_websocket_port_discovery_service;
161 case MODE_CLIENT:
162 case MODE_MIRROR:
163 case MODE_DISCOVERY:
164 case MODE_INVALID:
165 default:
166 // Fallback (should not be used for client/mirror/discovery)
167 return &g_websocket_port_server;
168 }
169}

References MODE_CLIENT, MODE_DISCOVERY, MODE_DISCOVERY_SERVICE, MODE_INVALID, MODE_MIRROR, and MODE_SERVER.

Referenced by apply_mode_specific_defaults().

◆ get_mode_descriptor()

const mode_descriptor_t * get_mode_descriptor ( asciichat_mode_t  mode)

Get mode descriptor by mode.

Parameters
modeMode to look up
Returns
Pointer to mode descriptor, or NULL if not found

Definition at line 41 of file options/registry/mode_defaults.c.

41 {
42 for (size_t i = 0; g_mode_descriptors[i].name; i++) {
43 if (g_mode_descriptors[i].mode == mode) {
44 return &g_mode_descriptors[i];
45 }
46 }
47 return NULL;
48}
const char * name
Definition main.c:367

References mode_descriptor_t::name.

◆ get_modes_by_group()

const mode_descriptor_t * get_modes_by_group ( const char *  group,
size_t *  out_count 
)

Get all mode descriptors grouped by category.

Get all mode descriptors for a specific group.

Parameters
groupGroup name ("server-like" or "client-like")
out_countOUTPUT: Number of modes in this group
Returns
Array of mode descriptors, or NULL if group not found

Definition at line 56 of file options/registry/mode_defaults.c.

56 {
57 if (!group || !out_count) {
58 return NULL;
59 }
60
61 // Count matching modes
62 size_t count = 0;
63 for (size_t i = 0; g_mode_descriptors[i].name; i++) {
64 if (strcmp(g_mode_descriptors[i].group, group) == 0) {
65 count++;
66 }
67 }
68
69 if (count == 0) {
70 *out_count = 0;
71 return NULL;
72 }
73
74 // Allocate result array
75 mode_descriptor_t *result = SAFE_MALLOC((count + 1) * sizeof(mode_descriptor_t), mode_descriptor_t *);
76 size_t idx = 0;
77
78 // Fill result array
79 for (size_t i = 0; g_mode_descriptors[i].name && idx < count; i++) {
80 if (strcmp(g_mode_descriptors[i].group, group) == 0) {
81 result[idx++] = g_mode_descriptors[i];
82 }
83 }
84
85 // Add terminator
86 result[idx].mode = MODE_INVALID;
87 result[idx].name = NULL;
88 result[idx].description = NULL;
89 result[idx].group = NULL;
90
91 *out_count = count;
92 return result;
93}
#define SAFE_MALLOC(size, cast)
Definition common.h:264
Metadata for a mode.
Definition main.c:366
const char * group
const char * description
Definition main.c:368
asciichat_mode_t mode

References mode_descriptor_t::description, mode_descriptor_t::group, mode_descriptor_t::mode, MODE_INVALID, mode_descriptor_t::name, and SAFE_MALLOC.

Referenced by completions_generate_zsh().