ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
acds.h File Reference

ACDS (Discovery Service) mode option parsing. More...

Go to the source code of this file.

Functions

asciichat_error_t parse_acds_options (int argc, char **argv, options_t *opts)
 Parse ACDS-specific command-line options.
 

Variables

ASCIICHAT_API int opt_acds_port
 TCP listen port (ACDS mode only)
 
ASCIICHAT_API char opt_acds_database_path [OPTIONS_BUFF_SIZE]
 SQLite database path (ACDS mode only)
 
ASCIICHAT_API char opt_acds_key_path [OPTIONS_BUFF_SIZE]
 Ed25519 identity key path (ACDS mode only)
 

Detailed Description

ACDS (Discovery Service) mode option parsing.

ACDS-specific command-line option parsing and help text. The ACDS mode runs a discovery service for session management and WebRTC signaling.

ACDS-Specific Options:

  • Network: [address1] [address2] positional (0-2 bind addresses), --port
  • Database: --database (SQLite database path)
  • Identity: --key (Ed25519 identity key path)
  • Logging: --log-file, --log-level

Positional Arguments (Bind Addresses):

  • 0 arguments: Bind to all IPv4 (0.0.0.0) and IPv6 (::) interfaces
  • 1 argument: Bind only to this IPv4 OR IPv6 address
  • 2 arguments: Bind to both addresses (must be one IPv4 AND one IPv6, order-independent)

Dual-Stack Examples:

./acds # All interfaces (0.0.0.0 + ::)
./acds 0.0.0.0 # IPv4 only (all interfaces)
./acds :: # IPv6 only (all interfaces)
./acds 0.0.0.0 :: # Both (full dual-stack)
./acds :: 0.0.0.0 # Both (order-independent)
./acds 192.168.1.100 # Specific IPv4
./acds 192.168.1.100 ::1 # Specific IPv4 + localhost IPv6
See also
options.h
common.h

Definition in file options/acds.h.

Function Documentation

◆ parse_acds_options()

asciichat_error_t parse_acds_options ( int  argc,
char **  argv,
options_t opts 
)

Parse ACDS-specific command-line options.

Parses all ACDS mode options including:

  • Positional arguments: 0-2 bind addresses (IPv4/IPv6)
  • ACDS-specific flags (port, database, key)
  • Logging flags (log-file, log-level)

Parsing Logic:

  1. getopt_long() loop processes all flags
  2. After loop, parse 0-2 positional arguments for bind addresses
  3. Validate address types (one IPv4, one IPv6 if two provided)
  4. Set defaults for unspecified options

Address Auto-Detection: Uses is_valid_ipv4() and is_valid_ipv6() to determine address type automatically. Order-independent: 0.0.0.0 :: and :: 0.0.0.0 are equivalent.

Error Handling:

  • Invalid options: Prints error with typo suggestions
  • Missing required arguments: Prints usage hint
  • Multiple IPv4 or IPv6 addresses: Error (must be one of each)
  • Invalid IP format: Error with clear message
  • Returns ERROR_INVALID_PARAM on any validation failure
Parameters
argcArgument count from main()
argvArgument vector from main()
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on parse error
Note
Modifies global opt_* variables (opt_address, opt_address6, opt_acds_port, etc.)
Prints error messages to stderr on failure
Prints help text and exits if –help flag present

Positional Argument Validation:

// ✅ CORRECT - valid combinations
./acds # 0 args: defaults (all interfaces)
./acds 0.0.0.0 # 1 arg: IPv4 only
./acds :: # 1 arg: IPv6 only
./acds 0.0.0.0 :: # 2 args: IPv4 + IPv6
./acds :: 192.168.1.100 # 2 args: IPv6 + IPv4 (order OK)
// ❌ WRONG - invalid combinations
./acds 0.0.0.0 192.168.1.100 # Error: two IPv4 addresses
./acds :: ::1 # Error: two IPv6 addresses
./acds invalid-address # Error: invalid IP format
./acds 1 2 3 # Error: too many addresses (max 2)

Example usage:

int main(int argc, char **argv) {
if (err != ASCIICHAT_OK) {
return 1; // Error already printed
}
// Option globals are now populated:
log_info("Binding to IPv4: %s, IPv6: %s, port: %d",
log_info("Database: %s", opt_acds_database_path);
log_info("Identity key: %s", opt_acds_key_path);
// ... proceed with ACDS initialization
}
int main(int argc, char **argv)
Definition acds/main.c:55
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:46
@ ASCIICHAT_OK
Definition error_codes.h:48
#define log_info(...)
Log an INFO message.
char opt_acds_key_path[OPTIONS_BUFF_SIZE]
Ed25519 identity key path (ACDS mode only)
Definition acds.c:42
int opt_acds_port
TCP listen port (ACDS mode only)
Definition acds.c:40
asciichat_error_t options_init(int argc, char **argv)
Initialize options by parsing command-line arguments.
Definition options.c:144
char opt_acds_database_path[OPTIONS_BUFF_SIZE]
SQLite database path (ACDS mode only)
Definition acds.c:41
@ MODE_ACDS
Discovery service mode - session management and WebRTC signaling.
Definition options.h:430
ASCIICHAT_API char opt_address[OPTIONS_BUFF_SIZE]
ASCIICHAT_API char opt_address6[OPTIONS_BUFF_SIZE]
See also
acds_usage()
options_init()

Definition at line 48 of file acds.c.

48 {
49 const options_config_t *config = options_preset_acds("acds", "ascii-chat discovery service");
50 int remaining_argc;
51 char **remaining_argv;
52
53 // Apply defaults from preset before parsing command-line args
54 asciichat_error_t defaults_result = options_config_set_defaults(config, opts);
55 if (defaults_result != ASCIICHAT_OK) {
57 return defaults_result;
58 }
59
60 asciichat_error_t result = options_config_parse(config, argc, argv, opts, &remaining_argc, &remaining_argv);
61 if (result != ASCIICHAT_OK) {
63 return result;
64 }
65
66 // Check for unexpected remaining arguments
67 if (remaining_argc > 0) {
68 (void)fprintf(stderr, "Error: Unexpected arguments after options:\n");
69 for (int i = 0; i < remaining_argc; i++) {
70 (void)fprintf(stderr, " %s\n", remaining_argv[i]);
71 }
73 return option_error_invalid();
74 }
75
76 // Set default paths if not specified
77 if (opts->acds_database_path[0] == '\0') {
78 char *config_dir = get_config_dir();
79 if (!config_dir) {
81 return SET_ERRNO(ERROR_CONFIG, "Failed to get config directory for database path");
82 }
83 snprintf(opts->acds_database_path, sizeof(opts->acds_database_path), "%sacds.db", config_dir);
84 SAFE_FREE(config_dir);
85 }
86
87 if (opts->acds_key_path[0] == '\0') {
88 char *config_dir = get_config_dir();
89 if (!config_dir) {
91 return SET_ERRNO(ERROR_CONFIG, "Failed to get config directory for identity key path");
92 }
93 snprintf(opts->acds_key_path, sizeof(opts->acds_key_path), "%sacds_identity", config_dir);
94 SAFE_FREE(config_dir);
95 }
96
97 // Copy to global variables for backward compatibility
100
102 return ASCIICHAT_OK;
103}
asciichat_error_t options_config_set_defaults(const options_config_t *config, void *options_struct)
Set default values in options struct.
Definition builder.c:716
asciichat_error_t options_config_parse(const options_config_t *config, int argc, char **argv, void *options_struct, int *remaining_argc, char ***remaining_argv)
Parse command-line arguments.
Definition builder.c:1101
void options_config_destroy(options_config_t *config)
Free options config.
Definition builder.c:329
const options_config_t * options_preset_acds(const char *program_name, const char *description)
Get acds mode options preset.
Definition presets.c:571
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:358
#define SAFE_FREE(ptr)
Definition common.h:320
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it.
@ ERROR_CONFIG
Definition error_codes.h:54
char * get_config_dir(void)
Get configuration directory path with XDG_CONFIG_HOME support.
Definition path.c:223
Options configuration.
Definition builder.h:165
char acds_key_path[256]
ACDS identity key file path (default: ~/.ascii-chat/acds_identity)
Definition options.h:475
char acds_database_path[256]
ACDS database file path (default: ~/.ascii-chat/acds.db)
Definition options.h:476

References options_state::acds_database_path, options_state::acds_key_path, ASCIICHAT_OK, ERROR_CONFIG, get_config_dir(), opt_acds_database_path, opt_acds_key_path, options_config_destroy(), options_config_parse(), options_config_set_defaults(), options_preset_acds(), SAFE_FREE, SAFE_STRNCPY, and SET_ERRNO.

Referenced by options_init().