ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
acds_client_io.c File Reference

Go to the source code of this file.

Macros

#define NETWORK_ACIP_ACDS_CLIENT_IO_ACDS_NAME_BUFFER_SIZE   64

Functions

void acds_client_config_init_defaults (acds_client_config_t *config)
 Initialize ACDS client configuration with defaults.
asciichat_error_t acds_client_connect (acds_client_t *client, const acds_client_config_t *config)
 Connect to ACDS server.
void acds_client_disconnect (acds_client_t *client)
 Disconnect from ACDS server.
asciichat_error_t acds_session_create (acds_client_t *client, const acds_session_create_params_t *params, acds_session_create_result_t *result)
 Create a new session on the discovery server.
asciichat_error_t acds_session_lookup (acds_client_t *client, const char *name, acds_session_lookup_result_t *result)
 Look up session by string.
asciichat_error_t acds_session_join (acds_client_t *client, const acds_session_join_params_t *params, acds_session_join_result_t *result)
 Join an existing session.

Macro Definition Documentation

◆ NETWORK_ACIP_ACDS_CLIENT_IO_ACDS_NAME_BUFFER_SIZE

#define NETWORK_ACIP_ACDS_CLIENT_IO_ACDS_NAME_BUFFER_SIZE   64

Definition at line 3 of file acds_client_io.c.

Referenced by acds_client_connect().

Function Documentation

◆ acds_client_config_init_defaults()

void acds_client_config_init_defaults ( acds_client_config_t * config)

Initialize ACDS client configuration with defaults.

Sets default values:

  • server_address: "127.0.0.1"
  • server_port: 27225
  • timeout_ms: 5000
Parameters
configConfiguration to initialize

Definition at line 78 of file acds_client_io.c.

78 {
79 if (!config) {
80 return;
81 }
82
83 memset(config, 0, sizeof(*config));
84 SAFE_STRNCPY(config->server_address, "127.0.0.1", sizeof(config->server_address));
86 config->timeout_ms = 5 * MS_PER_SEC_INT;
87}
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:423
#define ACIP_DISCOVERY_DEFAULT_PORT
Discovery server default port (use OPT_ACDS_PORT_INT_DEFAULT from options.h).
Definition acds.h:1102
#define MS_PER_SEC_INT
Definition time.h:176
char server_address[256]
ACDS server address (e.g., "discovery.ascii.chat" or "127.0.0.1").
uint32_t timeout_ms
Connection timeout in milliseconds.
uint16_t server_port
ACDS server port (default: 27225).

References ACIP_DISCOVERY_DEFAULT_PORT, MS_PER_SEC_INT, SAFE_STRNCPY, acds_client_config_t::server_address, acds_client_config_t::server_port, and acds_client_config_t::timeout_ms.

Referenced by client_crypto_init().

◆ acds_client_connect()

asciichat_error_t acds_client_connect ( acds_client_t * client,
const acds_client_config_t * config )

Connect to ACDS server.

Establishes TCP connection to the discovery server.

Parameters
clientClient handle (output)
configConnection configuration
Returns
ASCIICHAT_OK on success, error code on failure

Definition at line 93 of file acds_client_io.c.

93 {
94 if (!client || !config) {
95 return SET_ERRNO(ERROR_INVALID_PARAM, "client or config is NULL");
96 }
97
98 memset(client, 0, sizeof(*client));
99 memcpy(&client->config, config, sizeof(acds_client_config_t));
100 client->connected = false;
101
102 network_connect_config_t settings = {.timeout_ms = config->timeout_ms,
103 .should_exit_callback = config->should_exit_callback,
104 .callback_data = config->callback_data};
105 asciichat_error_t pconn_result = network_connection_open("acds", config->server_address, config->server_port,
106 &settings, &client->connection, NULL);
107 if (pconn_result == ASCIICHAT_OK) {
108 client->connected = true;
110
111 asciichat_error_t handshake_result = acds_client_handshake(client);
112 if (handshake_result != ASCIICHAT_OK) {
114 client->transport = NULL;
115 client->connected = false;
116 client->handshake_ctx = NULL;
117 return handshake_result;
118 }
119
121
122 /* Register ACDS client with named registry */
124 snprintf(acds_name, sizeof(acds_name), "acds_client:%s:%d", config->server_address, config->server_port);
125 NAMED_REGISTER(client, acds_name, "acds_client_t", "0x%tx", NULL);
126
127 log_info("Connected to ACDS server at %s:%d", config->server_address, config->server_port);
128 return ASCIICHAT_OK;
129 }
130
131 return pconn_result;
132}
#define NETWORK_ACIP_ACDS_CLIENT_IO_ACDS_NAME_BUFFER_SIZE
#define SET_ERRNO(code,...)
#define NAMED_REGISTER(ptr, name, type, fmt, parent_ptr)
Register any pointer with base name, type, format spec, and location (auto-suffix).
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
#define log_info(...)
Log an INFO message.
Definition log/log.h:608
void network_connection_destroy(network_connection_t **owner)
asciichat_error_t network_connection_open(const char *name, const char *address, uint16_t port, const network_connect_config_t *settings, network_connection_t **out, connection_endpoint_t *resolved)
void network_connection_ready(network_connection_t *c)
acip_transport_t * network_connection_transport(network_connection_t *c)
acds client config is intentionally a small, concrete record. Fields such as server_port,...
parallel_connect_should_exit_fn should_exit_callback
crypto_handshake_context_t * handshake_ctx
Borrowed from connection owner.
acds_client_config_t config
bool connected
Connection status.
network_connection_t * connection
acip_transport_t * transport
Transport used for the initial crypto handshake.
For network connect config, this is the live record that ties timeout_ms, callback_data,...

References ASCIICHAT_OK, acds_client_config_t::callback_data, acds_client_t::config, acds_client_t::connected, acds_client_t::connection, ERROR_INVALID_PARAM, acds_client_t::handshake_ctx, log_info, NAMED_REGISTER, NETWORK_ACIP_ACDS_CLIENT_IO_ACDS_NAME_BUFFER_SIZE, network_connection_destroy(), network_connection_open(), network_connection_ready(), network_connection_transport(), acds_client_config_t::server_address, acds_client_config_t::server_port, SET_ERRNO, acds_client_config_t::should_exit_callback, acds_client_config_t::timeout_ms, and acds_client_t::transport.

Referenced by client_crypto_init().

◆ acds_client_disconnect()

void acds_client_disconnect ( acds_client_t * client)

Disconnect from ACDS server.

Closes the connection and cleans up resources.

Parameters
clientClient handle

Definition at line 134 of file acds_client_io.c.

134 {
135 if (!client) {
136 return;
137 }
138
140 client->transport = NULL;
141 client->handshake_ctx = NULL;
142
143 client->connected = false;
144 log_debug("Disconnected from ACDS server");
145}
#define log_debug(...)
Log a DEBUG message.
Definition log/log.h:595

References acds_client_t::connected, acds_client_t::connection, acds_client_t::handshake_ctx, log_debug, network_connection_destroy(), and acds_client_t::transport.

Referenced by client_crypto_init().

◆ acds_session_create()

asciichat_error_t acds_session_create ( acds_client_t * client,
const acds_session_create_params_t * params,
acds_session_create_result_t * result )

Create a new session on the discovery server.

Sends SESSION_CREATE packet and receives SESSION_CREATED response.

Parameters
clientConnected ACDS client
paramsSession creation parameters
resultSession creation result (output)
Returns
ASCIICHAT_OK on success, error code on failure

Definition at line 165 of file acds_client_io.c.

166 {
167 if (!client || !client->connected || !params || !result)
168 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid discovery create parameters");
169 acds_protocol_t protocol;
170 acds_protocol_init(&protocol, client_protocol_send, client);
171 asciichat_error_t error = acds_protocol_create(&protocol, params, 0, 0);
172 if (error == ASCIICHAT_OK)
173 error = client_protocol_receive(client, &protocol);
174 if (error == ASCIICHAT_OK) {
175 memset(result, 0, sizeof(*result));
176 SAFE_STRNCPY(result->session_string, protocol.name, sizeof(result->session_string));
177 memcpy(result->session_id, protocol.created.session_id, sizeof(result->session_id));
178 result->expires_at = protocol.created.expires_at;
179 }
180 acds_protocol_destroy(&protocol);
181 return error;
182}
void acds_protocol_init(acds_protocol_t *p, acds_protocol_send_fn send, void *user_data)
void acds_protocol_destroy(acds_protocol_t *p)
asciichat_error_t acds_protocol_create(acds_protocol_t *p, const acds_session_create_params_t *params, uint8_t total_keys, uint8_t key_index)
struct acds_protocol acds_protocol_t
acip_session_created_t created
uint8_t session_id[16]
Session UUID.
char session_string[48+1]
Generated session string (null-terminated).
uint64_t expires_at
Expiration timestamp (Unix ms).

References acds_protocol_create(), acds_protocol_destroy(), acds_protocol_init(), ASCIICHAT_OK, acds_client_t::connected, acds_protocol::created, ERROR_INVALID_PARAM, acds_session_create_result_t::expires_at, acds_protocol::name, SAFE_STRNCPY, acds_session_create_result_t::session_id, acds_session_create_result_t::session_string, and SET_ERRNO.

◆ acds_session_join()

asciichat_error_t acds_session_join ( acds_client_t * client,
const acds_session_join_params_t * params,
acds_session_join_result_t * result )

Join an existing session.

Sends SESSION_JOIN packet and receives SESSION_JOINED response.

Parameters
clientConnected ACDS client
paramsJoin parameters
resultJoin result (output)
Returns
ASCIICHAT_OK on success, error code on failure

Definition at line 210 of file acds_client_io.c.

211 {
212 if (!client || !client->connected || !params || !result)
213 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid discovery join parameters");
214 acds_protocol_t protocol;
215 acds_protocol_init(&protocol, client_protocol_send, client);
216 memset(result, 0, sizeof(*result));
217 asciichat_error_t error = acds_protocol_join(&protocol, params);
218 if (error == ASCIICHAT_OK)
219 error = client_protocol_receive(client, &protocol);
220 result->success = protocol.joined.success;
221 result->error_code = protocol.joined.error_code;
222 SAFE_STRNCPY(result->error_message, protocol.joined.error_message, sizeof(result->error_message));
223 if (error == ASCIICHAT_OK) {
224 memcpy(result->participant_id, protocol.joined.participant_id, sizeof(result->participant_id));
225 memcpy(result->session_id, protocol.joined.session_id, sizeof(result->session_id));
226 result->session_type = protocol.joined.session_type;
227 SAFE_STRNCPY(result->server_address, protocol.joined.server_address, sizeof(result->server_address));
228 result->server_port = protocol.joined.server_port;
229 }
230 acds_protocol_destroy(&protocol);
231 return error;
232}
asciichat_error_t acds_protocol_join(acds_protocol_t *p, const acds_session_join_params_t *params)
acip_session_joined_t joined
uint8_t error_code
Error code (if !success).
uint8_t session_type
acds_session_type_t: 0=DIRECT_TCP, 1=WEBRTC (if success)
uint8_t participant_id[16]
Participant UUID (if success).
bool success
Join succeeded.
uint16_t server_port
Server port (if success).
char error_message[128+1]
Error message (if !success, null-terminated).
uint8_t session_id[16]
Session UUID (if success).
char server_address[64+1]
Server IP/hostname (if success, null-terminated).

References acds_protocol_destroy(), acds_protocol_init(), acds_protocol_join(), ASCIICHAT_OK, acds_client_t::connected, acds_session_join_result_t::error_code, ERROR_INVALID_PARAM, acds_session_join_result_t::error_message, acds_protocol::joined, acds_session_join_result_t::participant_id, SAFE_STRNCPY, acds_session_join_result_t::server_address, acds_session_join_result_t::server_port, acds_session_join_result_t::session_id, acds_session_join_result_t::session_type, SET_ERRNO, and acds_session_join_result_t::success.

◆ acds_session_lookup()

asciichat_error_t acds_session_lookup ( acds_client_t * client,
const char * session_string,
acds_session_lookup_result_t * result )

Look up session by string.

Sends SESSION_LOOKUP packet and receives SESSION_INFO response.

Parameters
clientConnected ACDS client
session_stringSession string to look up
resultLookup result (output)
Returns
ASCIICHAT_OK on success, error code on failure

Definition at line 183 of file acds_client_io.c.

183 {
184 if (!client || !client->connected || !name || !result)
185 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid discovery lookup parameters");
186 acds_protocol_t protocol;
187 acds_protocol_init(&protocol, client_protocol_send, client);
188 asciichat_error_t error = acds_protocol_lookup(&protocol, name);
189 if (error == ASCIICHAT_OK)
190 error = client_protocol_receive(client, &protocol);
191 if (error == ASCIICHAT_OK) {
192 memset(result, 0, sizeof(*result));
193 result->found = protocol.info.found;
194 if (result->found) {
195 memcpy(result->session_id, protocol.info.session_id, sizeof(result->session_id));
196 memcpy(result->host_pubkey, protocol.info.host_pubkey, sizeof(result->host_pubkey));
197 result->capabilities = protocol.info.capabilities;
198 result->max_participants = protocol.info.max_participants;
199 result->current_participants = protocol.info.current_participants;
200 result->has_password = protocol.info.has_password;
201 result->created_at = protocol.info.created_at;
202 result->expires_at = protocol.info.expires_at;
203 result->require_server_verify = protocol.info.require_server_verify;
204 result->require_client_verify = protocol.info.require_client_verify;
205 }
206 }
207 acds_protocol_destroy(&protocol);
208 return error;
209}
asciichat_error_t acds_protocol_lookup(acds_protocol_t *p, const char *name)
acip_session_info_t info
uint8_t capabilities
Session capabilities.
bool found
Session exists.
bool require_client_verify
ACDS policy: client must verify server identity.
bool has_password
Password required to join.
uint64_t expires_at
Expiration timestamp (Unix ms).
uint8_t max_participants
Maximum participants.
bool require_server_verify
ACDS policy: server must verify client identity.
uint64_t created_at
Creation timestamp (Unix ms).
uint8_t host_pubkey[32]
Host's Ed25519 public key.
uint8_t current_participants
Current participant count.
uint8_t session_id[16]
Session UUID (if found).

References acds_protocol_destroy(), acds_protocol_init(), acds_protocol_lookup(), ASCIICHAT_OK, acds_session_lookup_result_t::capabilities, acds_client_t::connected, acds_session_lookup_result_t::created_at, acds_session_lookup_result_t::current_participants, ERROR_INVALID_PARAM, acds_session_lookup_result_t::expires_at, acds_session_lookup_result_t::found, acds_session_lookup_result_t::has_password, acds_session_lookup_result_t::host_pubkey, acds_protocol::info, acds_session_lookup_result_t::max_participants, acds_session_lookup_result_t::require_client_verify, acds_session_lookup_result_t::require_server_verify, acds_session_lookup_result_t::session_id, and SET_ERRNO.

Referenced by client_crypto_init().