21 {
22
23 {"port",
24 'p',
25 OPTION_TYPE_CALLBACK,
26 offsetof(options_t, port),
27 NULL,
28 sizeof(int),
29 "Port to host a server or discovery-service on, or port to connect to a server as a client (default: 27224 for "
30 "server/client, 27225 for discovery-service).",
31 "NETWORK",
32 NULL,
33 false,
34 "ASCII_CHAT_PORT",
35 NULL,
37 false,
38 false,
39 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
40 {.numeric_range = {1, 65535, 1}, .input_type = OPTION_INPUT_NUMERIC},
42 {"websocket-port",
43 '\0',
44 OPTION_TYPE_INT,
45 offsetof(options_t, websocket_port),
46 NULL,
47 sizeof(int),
48 "WebSocket server port (default: 27226 for server, 27227 for discovery-service).",
49 "NETWORK",
50 NULL,
51 false,
52 "ASCII_CHAT_WEBSOCKET_PORT",
53 NULL,
54 NULL,
55 false,
56 false,
57 OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC,
58 {.numeric_range = {1, 65535, 1}, .input_type = OPTION_INPUT_NUMERIC},
60 {"max-clients",
61 '\0',
62 OPTION_TYPE_INT,
63 offsetof(options_t, max_clients),
64 &default_max_clients_value,
65 sizeof(int),
66 "Maximum concurrent clients.",
67 "NETWORK",
68 NULL,
69 false,
70 "ASCII_CHAT_MAX_CLIENTS",
71 NULL,
72 NULL,
73 false,
74 false,
75 OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC,
77 NULL},
78 {"reconnect-attempts",
79 '\0',
80 OPTION_TYPE_INT,
81 offsetof(options_t, reconnect_attempts),
82 &default_reconnect_attempts_value,
83 sizeof(int),
84 "Number of reconnection attempts before giving up (-1=infinite, 0=none).",
85 "NETWORK",
86 NULL,
87 false,
88 "ASCII_CHAT_RECONNECT_ATTEMPTS",
89 NULL,
90 NULL,
91 false,
92 false,
93 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
94 {.numeric_range = {-1, 99, 1}, .examples =
g_reconnect_examples, .input_type = OPTION_INPUT_NUMERIC},
95 NULL},
96 {"port-forwarding",
97 '\0',
98 OPTION_TYPE_BOOL,
99 offsetof(options_t, enable_upnp),
100 &default_enable_upnp_value,
102 "Use UPnP/NAT-PMP port mapping to open a port in your router to ascii-chat (might fail with some routers).",
103 "NETWORK",
104 NULL,
105 false,
106 "ASCII_CHAT_PORT_FORWARDING",
107 NULL,
108 NULL,
109 false,
110 false,
111 OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC,
112 {0},
113 NULL},
114 {"scan",
115 '\0',
116 OPTION_TYPE_BOOL,
117 offsetof(options_t, lan_discovery),
118 &default_lan_discovery_value,
120 "Scan for servers on local network via mDNS.",
121 "NETWORK",
122 NULL,
123 false,
124 "ASCII_CHAT_SCAN",
125 NULL,
126 NULL,
127 false,
128 false,
129 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
130 {0},
131 NULL},
132
133
134 {"compression-level",
135 '\0',
136 OPTION_TYPE_INT,
137 offsetof(options_t, compression_level),
138 &default_compression_level_value,
139 sizeof(int),
140 "zstd compression level (1-9).",
141 "NETWORK",
142 NULL,
143 false,
144 "ASCII_CHAT_COMPRESSION_LEVEL",
145 NULL,
146 NULL,
147 false,
148 false,
149 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
151 NULL},
152 {"no-compress",
153 '\0',
154 OPTION_TYPE_BOOL,
155 offsetof(options_t, no_compress),
156 &default_no_compress_value,
158 "Disable compression.",
159 "NETWORK",
160 NULL,
161 false,
162 "ASCII_CHAT_NO_COMPRESS",
163 NULL,
164 NULL,
165 false,
166 false,
167 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
168 {0},
169 NULL},
170
171
172 {"discovery-service",
173 '\0',
174 OPTION_TYPE_STRING,
175 offsetof(options_t, discovery_server),
176 OPT_ENDPOINT_DISCOVERY_SERVICE,
177 0,
178 "Discovery service endpoint (IP address or hostname).",
179 "NETWORK",
180 NULL,
181 false,
182 "ASCII_CHAT_DISCOVERY_SERVER",
183 NULL,
184 NULL,
185 false,
186 false,
187 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
188 {0},
189 NULL},
190 {"discovery-service-port",
191 '\0',
192 OPTION_TYPE_INT,
193 offsetof(options_t, discovery_port),
194 &default_discovery_port_value,
195 sizeof(int),
196 "Discovery service port (1-65535).",
197 "NETWORK",
198 NULL,
199 false,
200 "ASCII_CHAT_DISCOVERY_SERVICE_PORT",
201 NULL,
202 NULL,
203 false,
204 false,
205 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
206 {0},
207 NULL},
208 {"discovery-expose-ip",
209 '\0',
210 OPTION_TYPE_BOOL,
211 offsetof(options_t, discovery_expose_ip),
212 &default_discovery_expose_ip_value,
214 "Allow public IP disclosure in discovery sessions (requires confirmation).",
215 "NETWORK",
216 NULL,
217 false,
218 "ASCII_CHAT_DISCOVERY_EXPOSE_IP",
219 NULL,
220 NULL,
221 false,
222 false,
223 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
224 {0},
225 NULL},
226 {"discovery",
227 '\0',
228 OPTION_TYPE_BOOL,
229 offsetof(options_t, discovery),
230 &default_discovery_value,
232 "Enable discovery session registration.",
233 "NETWORK",
234 NULL,
235 false,
236 "ASCII_CHAT_DISCOVERY",
237 NULL,
238 NULL,
239 false,
240 false,
241 OPTION_MODE_SERVER,
242 {0},
243 NULL},
244
245
246 {"webrtc",
247 '\0',
248 OPTION_TYPE_BOOL,
249 offsetof(options_t, webrtc),
250 &default_webrtc_value,
252 "Make calls using WebRTC p2p connections.",
253 "NETWORK",
254 NULL,
255 false,
256 "ASCII_CHAT_WEBRTC",
257 NULL,
258 NULL,
259 false,
260 false,
261 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
262 {0},
263 NULL},
264 {"no-webrtc",
265 '\0',
266 OPTION_TYPE_BOOL,
267 offsetof(options_t, no_webrtc),
268 &default_no_webrtc_value,
270 "Disable WebRTC, use direct TCP only.",
271 "NETWORK",
272 NULL,
273 false,
274 "ASCII_CHAT_NO_WEBRTC",
275 NULL,
276 NULL,
277 false,
278 false,
279 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
280 {0},
281 NULL},
282 {"prefer-webrtc",
283 '\0',
284 OPTION_TYPE_BOOL,
285 offsetof(options_t, prefer_webrtc),
286 &default_prefer_webrtc_value,
288 "Try WebRTC before direct TCP.",
289 "NETWORK",
290 NULL,
291 false,
292 "ASCII_CHAT_PREFER_WEBRTC",
293 NULL,
294 NULL,
295 false,
296 false,
297 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
298 {0},
299 NULL},
300 {"webrtc-skip-stun",
301 '\0',
302 OPTION_TYPE_BOOL,
303 offsetof(options_t, webrtc_skip_stun),
304 &default_webrtc_skip_stun_value,
306 "Skip WebRTC+STUN stage, go straight to TURN relay.",
307 "NETWORK",
308 NULL,
309 false,
310 "ASCII_CHAT_WEBRTC_SKIP_STUN",
311 NULL,
312 NULL,
313 false,
314 false,
315 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
316 {0},
317 NULL},
318 {"webrtc-disable-turn",
319 '\0',
320 OPTION_TYPE_BOOL,
321 offsetof(options_t, webrtc_disable_turn),
322 &default_webrtc_disable_turn_value,
324 "Disable WebRTC+TURN relay, use STUN only.",
325 "NETWORK",
326 NULL,
327 false,
328 "ASCII_CHAT_WEBRTC_DISABLE_TURN",
329 NULL,
330 NULL,
331 false,
332 false,
333 OPTION_MODE_CLIENT | OPTION_MODE_DISCOVERY,
334 {0},
335 NULL},
336 {"webrtc-skip-host",
337 '\0',
338 OPTION_TYPE_BOOL,
339 offsetof(options_t, webrtc_skip_host),
340 &default_webrtc_skip_host_value,
342 "Skip host candidates, force STUN/TURN (for testing).",
343 "NETWORK",
344 NULL,
345 false,
346 "ASCII_CHAT_WEBRTC_SKIP_HOST",
347 NULL,
348 NULL,
349 false,
350 false,
351 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
352 {0},
353 NULL},
354 {"webrtc-ice-timeout",
355 '\0',
356 OPTION_TYPE_INT,
357 offsetof(options_t, webrtc_ice_timeout_ms),
358 &default_webrtc_ice_timeout_ms_value,
359 sizeof(int),
360 "ICE gathering timeout in milliseconds.",
361 "NETWORK",
362 NULL,
363 false,
364 "ASCII_CHAT_WEBRTC_ICE_TIMEOUT",
365 NULL,
366 NULL,
367 false,
368 false,
369 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
370 {0},
371 NULL},
372 {"webrtc-reconnect-attempts",
373 '\0',
374 OPTION_TYPE_INT,
375 offsetof(options_t, webrtc_reconnect_attempts),
376 &default_webrtc_reconnect_attempts_value,
377 sizeof(int),
378 "Number of WebRTC connection retry attempts.",
379 "NETWORK",
380 NULL,
381 false,
382 "ASCII_CHAT_WEBRTC_RECONNECT_ATTEMPTS",
383 NULL,
384 NULL,
385 false,
386 false,
387 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY,
388 {0},
389 NULL},
390 {"stun-servers",
391 '\0',
392 OPTION_TYPE_STRING,
393 offsetof(options_t, stun_servers),
394 OPT_STUN_SERVERS_DEFAULT,
395 0,
396 "Comma-separated list of WebRTC+STUN server URLs.",
397 "NETWORK",
398 NULL,
399 false,
400 "ASCII_CHAT_STUN_SERVERS",
401 NULL,
402 NULL,
403 false,
404 false,
405 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
406 {0},
407 NULL},
408 {"turn-servers",
409 '\0',
410 OPTION_TYPE_STRING,
411 offsetof(options_t, turn_servers),
412 OPT_TURN_SERVERS_DEFAULT,
413 0,
414 "Comma-separated list of WebRTC+TURN server URLs.",
415 "NETWORK",
416 NULL,
417 false,
418 "ASCII_CHAT_TURN_SERVERS",
419 NULL,
420 NULL,
421 false,
422 false,
423 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
424 {0},
425 NULL},
426 {"turn-username",
427 '\0',
428 OPTION_TYPE_STRING,
429 offsetof(options_t, turn_username),
430 OPT_TURN_USERNAME_DEFAULT,
431 0,
432 "Username for WebRTC+TURN authentication.",
433 "NETWORK",
434 NULL,
435 false,
436 "ASCII_CHAT_TURN_USERNAME",
437 NULL,
438 NULL,
439 false,
440 false,
441 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
442 {0},
443 NULL},
444 {"turn-credential",
445 '\0',
446 OPTION_TYPE_STRING,
447 offsetof(options_t, turn_credential),
448 OPT_TURN_CREDENTIAL_DEFAULT,
449 0,
450 "Credential/password for WebRTC+TURN authentication.",
451 "NETWORK",
452 NULL,
453 false,
454 "ASCII_CHAT_TURN_CREDENTIAL",
455 NULL,
456 NULL,
457 false,
458 false,
459 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
460 {0},
461 NULL},
462 {"turn-secret",
463 '\0',
464 OPTION_TYPE_STRING,
465 offsetof(options_t, turn_secret),
466 "",
467 0,
468 "Shared secret for dynamic WebRTC+TURN credential generation (HMAC-SHA1).",
469 "NETWORK",
470 NULL,
471 false,
472 "ASCII_CHAT_TURN_SECRET",
473 NULL,
474 NULL,
475 false,
476 false,
477 OPTION_MODE_CLIENT | OPTION_MODE_SERVER | OPTION_MODE_DISCOVERY_SVC | OPTION_MODE_DISCOVERY,
478 {0},
479 NULL},
480
481 REGISTRY_TERMINATOR()};
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.
bool parse_port_option(const char *arg, void *dest, char **error_msg)