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.
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:
- getopt_long() loop processes all flags
- After loop, parse 0-2 positional arguments for bind addresses
- Validate address types (one IPv4, one IPv6 if two provided)
- 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
-
| argc | Argument count from main() |
| argv | Argument 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:
./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)
./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) {
return 1;
}
log_info(
"Binding to IPv4: %s, IPv6: %s, port: %d",
}
int main(int argc, char **argv)
asciichat_error_t
Error and exit codes - unified status values (0-255)
#define log_info(...)
Log an INFO message.
char opt_acds_key_path[OPTIONS_BUFF_SIZE]
Ed25519 identity key path (ACDS mode only)
int opt_acds_port
TCP listen port (ACDS mode only)
asciichat_error_t options_init(int argc, char **argv)
Initialize options by parsing command-line arguments.
char opt_acds_database_path[OPTIONS_BUFF_SIZE]
SQLite database path (ACDS mode only)
@ MODE_ACDS
Discovery service mode - session management and WebRTC signaling.
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 {
50 int remaining_argc;
51 char **remaining_argv;
52
53
57 return defaults_result;
58 }
59
63 return result;
64 }
65
66
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
79 if (!config_dir) {
82 }
85 }
86
89 if (!config_dir) {
92 }
95 }
96
97
100
103}
asciichat_error_t options_config_set_defaults(const options_config_t *config, void *options_struct)
Set default values in options struct.
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.
void options_config_destroy(options_config_t *config)
Free options config.
const options_config_t * options_preset_acds(const char *program_name, const char *description)
Get acds mode options preset.
#define SAFE_STRNCPY(dst, src, size)
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it.
char * get_config_dir(void)
Get configuration directory path with XDG_CONFIG_HOME support.
char acds_key_path[256]
ACDS identity key file path (default: ~/.ascii-chat/acds_identity)
char acds_database_path[256]
ACDS database file path (default: ~/.ascii-chat/acds.db)
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().