ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
mdns.c File Reference

mDNS service discovery implementation for ascii-chat More...

Go to the source code of this file.

Data Structures

struct  asciichat_mdns_t
 Internal mDNS context structure. More...
 

Macros

#define MDNS_BUFFER_SIZE   (4 * 1024)
 mDNS packet buffer size (4KB should handle most service records)
 

Functions

asciichat_mdns_tasciichat_mdns_init (void)
 
void asciichat_mdns_destroy (asciichat_mdns_t *mdns)
 
asciichat_error_t asciichat_mdns_advertise (asciichat_mdns_t *mdns, const asciichat_mdns_service_t *service)
 
asciichat_error_t asciichat_mdns_unadvertise (asciichat_mdns_t *mdns, const char *service_name)
 
asciichat_error_t asciichat_mdns_query (asciichat_mdns_t *mdns, const char *service_type, asciichat_mdns_discovery_callback_fn callback, void *user_data)
 
asciichat_error_t asciichat_mdns_update (asciichat_mdns_t *mdns, int timeout_ms)
 
int asciichat_mdns_get_socket (asciichat_mdns_t *mdns)
 

Detailed Description

mDNS service discovery implementation for ascii-chat

Wraps the mdns library (https://github.com/mjansson/mdns) with ascii-chat specific API. This implementation provides service advertisement and discovery for LAN-based sessions.

Definition in file mdns.c.

Macro Definition Documentation

◆ MDNS_BUFFER_SIZE

#define MDNS_BUFFER_SIZE   (4 * 1024)

mDNS packet buffer size (4KB should handle most service records)

Definition at line 33 of file mdns.c.

Function Documentation

◆ asciichat_mdns_advertise()

asciichat_error_t asciichat_mdns_advertise ( asciichat_mdns_t mdns,
const asciichat_mdns_service_t *  service 
)

Definition at line 80 of file mdns.c.

80 {
81 if (!mdns || !service) {
82 return SET_ERRNO(ERROR_INVALID_PARAM, "mDNS context or service is NULL");
83 }
84
85 if (!service->name || !service->type || !service->host) {
86 return SET_ERRNO(ERROR_INVALID_PARAM, "Service name, type, or host is NULL");
87 }
88
89 log_debug("Advertising mDNS service: %s (%s:%d)", service->name, service->host, service->port);
90
91 /* TODO: Implement actual advertisement using mdns library
92 * This will involve creating service records and sending announcements
93 * The mdns library provides mdns_announce_* functions for this
94 */
95 return ASCIICHAT_OK;
96}

Referenced by acds_main().

◆ asciichat_mdns_destroy()

void asciichat_mdns_destroy ( asciichat_mdns_t mdns)

Definition at line 66 of file mdns.c.

66 {
67 if (!mdns) {
68 return;
69 }
70
71 if (mdns->socket_fd >= 0) {
72 mdns_socket_close(mdns->socket_fd);
73 }
74
75 SAFE_FREE(mdns->buffer);
76 SAFE_FREE(mdns);
77 log_debug("mDNS context shutdown");
78}
int socket_fd
Definition mdns.c:24
uint8_t * buffer
Definition mdns.c:27

References asciichat_mdns_t::buffer, and asciichat_mdns_t::socket_fd.

Referenced by acds_main(), discovery_mdns_query(), and server_main().

◆ asciichat_mdns_get_socket()

int asciichat_mdns_get_socket ( asciichat_mdns_t mdns)

Definition at line 284 of file mdns.c.

284 {
285 if (!mdns) {
286 return -1;
287 }
288 return mdns->socket_fd;
289}

References asciichat_mdns_t::socket_fd.

◆ asciichat_mdns_init()

asciichat_mdns_t * asciichat_mdns_init ( void  )

Definition at line 35 of file mdns.c.

35 {
36 asciichat_mdns_t *mdns = SAFE_MALLOC(sizeof(asciichat_mdns_t), asciichat_mdns_t *);
37 if (!mdns) {
38 SET_ERRNO(ERROR_MEMORY, "Failed to allocate mDNS context");
39 return NULL;
40 }
41
42 memset(mdns, 0, sizeof(asciichat_mdns_t));
43
44 /* Allocate I/O buffer for mDNS packets */
45 mdns->buffer = SAFE_MALLOC(MDNS_BUFFER_SIZE, uint8_t *);
46 if (!mdns->buffer) {
47 SAFE_FREE(mdns);
48 SET_ERRNO(ERROR_MEMORY, "Failed to allocate mDNS buffer");
49 return NULL;
50 }
52
53 /* Open IPv4 mDNS socket */
54 mdns->socket_fd = mdns_socket_open_ipv4(NULL);
55 if (mdns->socket_fd < 0) {
56 SAFE_FREE(mdns->buffer);
57 SAFE_FREE(mdns);
58 SET_ERRNO(ERROR_NETWORK_BIND, "Failed to open mDNS socket");
59 return NULL;
60 }
61
62 log_dev("mDNS context initialized (socket: %d, buffer: %zu bytes)", mdns->socket_fd, mdns->buffer_capacity);
63 return mdns;
64}
#define MDNS_BUFFER_SIZE
mDNS packet buffer size (4KB should handle most service records)
Definition mdns.c:33
Internal mDNS context structure.
Definition mdns.c:23
size_t buffer_capacity
Definition mdns.c:28

References asciichat_mdns_t::buffer, asciichat_mdns_t::buffer_capacity, MDNS_BUFFER_SIZE, and asciichat_mdns_t::socket_fd.

Referenced by acds_main(), discovery_mdns_query(), and server_main().

◆ asciichat_mdns_query()

asciichat_error_t asciichat_mdns_query ( asciichat_mdns_t mdns,
const char *  service_type,
asciichat_mdns_discovery_callback_fn  callback,
void *  user_data 
)

Definition at line 224 of file mdns.c.

225 {
226 if (!mdns || !service_type || !callback) {
227 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid mDNS query parameters");
228 }
229
230 /* Validate service type is non-empty and has minimum length
231 * Prevents underflow bug in mdns library when processing empty strings
232 */
233 size_t service_type_len = strlen(service_type);
234 if (service_type_len == 0) {
235 return SET_ERRNO(ERROR_INVALID_PARAM, "Service type cannot be empty");
236 }
237
238 mdns->callback = callback;
239 mdns->callback_data = user_data;
240
241 log_info("Starting mDNS query for: %s", service_type);
242
243 /* Send PTR query for service type (one-shot query)
244 * PTR query discovers all instances of a service type
245 * mdns_query_send returns the query ID for response filtering
246 */
247 int query_id = mdns_query_send(mdns->socket_fd, MDNS_RECORDTYPE_PTR, service_type, service_type_len, mdns->buffer,
248 mdns->buffer_capacity, 0);
249
250 if (query_id < 0) {
251 return SET_ERRNO(ERROR_NETWORK, "mDNS query send failed for %s (query_id=%d)", service_type, query_id);
252 }
253
254 mdns->query_id = (uint16_t)query_id;
255 log_debug("mDNS query sent for service type: %s (query_id: %d)", service_type, query_id);
256
257 return ASCIICHAT_OK;
258}
asciichat_mdns_discovery_callback_fn callback
Definition mdns.c:25
uint16_t query_id
Definition mdns.c:29
void * callback_data
Definition mdns.c:26

References asciichat_mdns_t::buffer, asciichat_mdns_t::buffer_capacity, asciichat_mdns_t::callback, asciichat_mdns_t::callback_data, asciichat_mdns_t::query_id, and asciichat_mdns_t::socket_fd.

Referenced by discovery_mdns_query().

◆ asciichat_mdns_unadvertise()

asciichat_error_t asciichat_mdns_unadvertise ( asciichat_mdns_t mdns,
const char *  service_name 
)

Definition at line 98 of file mdns.c.

98 {
99 if (!mdns || !service_name) {
100 return SET_ERRNO(ERROR_INVALID_PARAM, "mDNS context or service name is NULL");
101 }
102
103 log_info("Stopped advertising service: %s", service_name);
104
105 /* TODO: Implement actual unadvertisement
106 * This will involve sending goodbye records with TTL=0
107 */
108 return ASCIICHAT_OK;
109}

◆ asciichat_mdns_update()

asciichat_error_t asciichat_mdns_update ( asciichat_mdns_t mdns,
int  timeout_ms 
)

Definition at line 260 of file mdns.c.

260 {
261 if (!mdns) {
262 return SET_ERRNO(ERROR_INVALID_PARAM, "mDNS context is NULL");
263 }
264
265 /* Process incoming mDNS packets (responses from previous queries)
266 * mdns_query_recv processes all records received since last call
267 * The callback function (mdns_record_callback) is invoked for each record
268 */
269 int num_records =
270 mdns_query_recv(mdns->socket_fd, mdns->buffer, mdns->buffer_capacity, mdns_record_callback, mdns, mdns->query_id);
271
272 if (num_records < 0) {
273 return SET_ERRNO(ERROR_NETWORK, "Failed to receive mDNS query responses");
274 }
275
276 if (num_records > 0) {
277 log_debug("Processed %d mDNS records", num_records);
278 }
279
280 (void)timeout_ms;
281 return ASCIICHAT_OK;
282}

References asciichat_mdns_t::buffer, asciichat_mdns_t::buffer_capacity, asciichat_mdns_t::query_id, and asciichat_mdns_t::socket_fd.

Referenced by discovery_mdns_query().