ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
acds.c
Go to the documentation of this file.
1
13#include "options/acds.h"
14#include "options/builder.h"
15#include "options/common.h"
16
17#include "asciichat_errno.h"
18#include "common.h"
19#include "log/logging.h"
20#include "options/options.h"
21#include "options/validation.h"
22#include "util/ip.h"
23#include "util/path.h"
24#include "version.h"
25
26#ifdef _WIN32
27#include "platform/windows/getopt.h"
28#else
29#include <getopt.h>
30#endif
31
32#include <stdio.h>
33#include <stdlib.h>
34#include <string.h>
35
36// ============================================================================
37// ACDS Option Globals
38// ============================================================================
39
40int opt_acds_port = 27225;
43
44// ============================================================================
45// ACDS Option Parsing
46// ============================================================================
47
48asciichat_error_t parse_acds_options(int argc, char **argv, options_t *opts) {
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}
104
105// ============================================================================
106// ACDS Usage/Help Output
107// ============================================================================
108
109void usage_acds(FILE *desc) {
110 // Get config with program name and description
111 const options_config_t *config = options_preset_acds("acds", "ascii-chat discovery service");
112 if (!config) {
113 (void)fprintf(desc, "Error: Failed to create options config\n");
114 return;
115 }
116
117 (void)fprintf(desc, "%s - %s\n\n", config->program_name, config->description);
118 (void)fprintf(desc, "USAGE:\n");
119 (void)fprintf(desc, " %s [options...]\n\n", config->program_name);
120
121 // Print positional argument examples programmatically if they exist
122 if (config->num_positional_args > 0) {
123 const positional_arg_descriptor_t *pos_arg = &config->positional_args[0];
124 if (pos_arg->section_heading && pos_arg->examples && pos_arg->num_examples > 0) {
125 (void)fprintf(desc, "%s:\n", pos_arg->section_heading);
126 for (size_t i = 0; i < pos_arg->num_examples; i++) {
127 (void)fprintf(desc, " %s\n", pos_arg->examples[i]);
128 }
129 (void)fprintf(desc, "\n");
130 }
131 }
132
133 // Generate options from builder configuration
134 options_config_print_usage(config, desc);
135
136 // Clean up the config
138}
asciichat_error_t parse_acds_options(int argc, char **argv, options_t *opts)
Parse ACDS-specific command-line options.
Definition acds.c:48
⚠️‼️ Error and/or exit() when things go bad.
void options_config_print_usage(const options_config_t *config, FILE *stream)
Print usage/help text.
Definition builder.c:1236
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
Options builder API for flexible command-line option configuration.
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.
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:46
@ ASCIICHAT_OK
Definition error_codes.h:48
@ ERROR_CONFIG
Definition error_codes.h:54
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
#define OPTIONS_BUFF_SIZE
Buffer size for option string values.
Definition options.h:176
void usage_acds(FILE *desc)
Print ACDS usage information.
Definition acds.c:109
char opt_acds_database_path[OPTIONS_BUFF_SIZE]
SQLite database path (ACDS mode only)
Definition acds.c:41
char * get_config_dir(void)
Get configuration directory path with XDG_CONFIG_HOME support.
Definition path.c:223
🌍 IP Address Parsing and Formatting Utilities
📝 Logging API with multiple log levels and terminal output control
ACDS (Discovery Service) mode option parsing.
Common utilities and helpers for option parsing.
Validation functions for options parsing.
⚙️ Command-line options parsing and configuration management for ascii-chat
📂 Path Manipulation Utilities
Options configuration.
Definition builder.h:165
positional_arg_descriptor_t * positional_args
Array of positional argument descriptors.
Definition builder.h:172
const char * program_name
For usage header.
Definition builder.h:176
size_t num_positional_args
Number of positional arguments.
Definition builder.h:173
const char * description
For usage header.
Definition builder.h:177
Consolidated options structure.
Definition options.h:439
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
Positional argument descriptor.
Definition builder.h:136
const char * section_heading
Section heading for examples (e.g., "ADDRESS FORMATS")
Definition builder.h:142
const char ** examples
Array of example strings with descriptions.
Definition builder.h:143
size_t num_examples
Number of examples.
Definition builder.h:144
Common SIMD utilities and structures.