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

Mode-aware default value getters and mode metadata. More...

Go to the source code of this file.

Data Structures

struct  mode_descriptor_t
 Metadata for a mode. More...
 

Functions

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.
 
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 for a specific group.
 

Detailed Description

Mode-aware default value getters and mode metadata.

Provides mode-specific default values and metadata (names, descriptions, groups) for all application modes. Used by option parsing and completion generation.

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

Definition in file mode_defaults.h.

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.

Updates options that have mode-dependent defaults (like log_file, port, and websocket_port) based on the detected mode. Should be called after mode detection but before option parsing.

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

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.

Parameters
modeThe mode to get the default for
Returns
Pointer to the default log file path for this mode

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.

Returns metadata (name, description, group) for the given mode. Useful for UI generation and help text.

Parameters
modeMode to look up
Returns
Pointer to mode descriptor, or NULL if mode not found
Example
if (desc) {
printf("Mode: %s\nDescription: %s\nGroup: %s\n",
desc->name, desc->description, desc->group);
}
const mode_descriptor_t * get_mode_descriptor(asciichat_mode_t mode)
Get mode descriptor by mode.
Metadata for a mode.
Definition main.c:366
const char * name
Definition main.c:367
const char * group
const char * description
Definition main.c:368
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}

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 for a specific group.

Returns all modes in a given category (e.g., "server-like" or "client-like"). The returned array is allocated with SAFE_MALLOC and must be freed by caller.

Parameters
groupGroup name ("server-like" or "client-like")
out_countOUTPUT: Number of modes in this group
Returns
Array of mode descriptors (caller must free with SAFE_FREE), or NULL if group not found
Example
size_t count;
const mode_descriptor_t *server_modes = get_modes_by_group("server-like", &count);
if (server_modes) {
for (size_t i = 0; i < count; i++) {
printf("%s: %s\n", server_modes[i].name, server_modes[i].description);
}
SAFE_FREE(server_modes);
}
#define SAFE_FREE(ptr)
Definition common.h:376
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
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().