JDNS
Loading...
Searching...
No Matches
jdns.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2005,2006 Justin Karneges
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
27
28#ifndef JDNS_H
29#define JDNS_H
30
31#include "jdns_export.h"
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37typedef void (*jdns_object_dtor_func)(void *);
38typedef void *(*jdns_object_cctor_func)(const void *);
39
40#define JDNS_OBJECT \
41 jdns_object_dtor_func dtor; \
42 jdns_object_cctor_func cctor;
43
44#define JDNS_OBJECT_NEW(name) \
45 (name##_t *)jdns_object_new(sizeof(name##_t), \
46 (jdns_object_dtor_func)name##_delete, \
47 (jdns_object_cctor_func)name##_copy);
48
49typedef struct jdns_object
50{
51 JDNS_OBJECT
52} jdns_object_t;
53
54JDNS_EXPORT void *jdns_object_new(int size, void (*dtor)(void *),
55 void *(*cctor)(const void *));
56JDNS_EXPORT void *jdns_object_copy(const void *a);
57JDNS_EXPORT void jdns_object_delete(void *a);
58JDNS_EXPORT void jdns_object_free(void *a);
59
60#define JDNS_LIST_DECLARE(name) \
61 JDNS_OBJECT \
62 int count; \
63 name##_t **item;
64
65typedef struct jdns_list
66{
67 JDNS_OBJECT
68 int count;
69 void **item;
70 int valueList;
71 int autoDelete;
72} jdns_list_t;
73
74JDNS_EXPORT jdns_list_t *jdns_list_new();
75JDNS_EXPORT jdns_list_t *jdns_list_copy(const jdns_list_t *a);
76JDNS_EXPORT void jdns_list_delete(jdns_list_t *a);
77JDNS_EXPORT void jdns_list_clear(jdns_list_t *a);
78JDNS_EXPORT void jdns_list_insert(jdns_list_t *a, void *item, int pos);
79JDNS_EXPORT void jdns_list_insert_value(jdns_list_t *a, const void *item, int pos);
80JDNS_EXPORT void jdns_list_remove(jdns_list_t *a, void *item);
81JDNS_EXPORT void jdns_list_remove_at(jdns_list_t *a, int pos);
82
83typedef struct jdns_string
84{
85 JDNS_OBJECT
86 unsigned char *data;
87 int size;
88} jdns_string_t;
89
90JDNS_EXPORT jdns_string_t *jdns_string_new();
91JDNS_EXPORT jdns_string_t *jdns_string_copy(const jdns_string_t *s);
92JDNS_EXPORT void jdns_string_delete(jdns_string_t *s);
93JDNS_EXPORT void jdns_string_set(jdns_string_t *s, const unsigned char *str,
94 int str_len);
95JDNS_EXPORT void jdns_string_set_cstr(jdns_string_t *s, const char *str);
96
97 // overlays jdns_list
98typedef struct jdns_stringlist
99{
100 JDNS_OBJECT
101 int count;
102 jdns_string_t **item;
103} jdns_stringlist_t;
104
105JDNS_EXPORT jdns_stringlist_t *jdns_stringlist_new();
106JDNS_EXPORT jdns_stringlist_t *jdns_stringlist_copy(const jdns_stringlist_t *a);
107JDNS_EXPORT void jdns_stringlist_delete(jdns_stringlist_t *a);
108JDNS_EXPORT void jdns_stringlist_append(jdns_stringlist_t *a, const jdns_string_t *str);
109
110typedef struct jdns_address
111{
112 int isIpv6;
113 union
114 {
115 unsigned long int v4;
116 unsigned char *v6; // 16 bytes
117 } addr;
118 char *c_str;
119} jdns_address_t;
120
121JDNS_EXPORT jdns_address_t *jdns_address_new();
122JDNS_EXPORT jdns_address_t *jdns_address_copy(const jdns_address_t *a);
123JDNS_EXPORT void jdns_address_delete(jdns_address_t *a);
124JDNS_EXPORT void jdns_address_set_ipv4(jdns_address_t *a, unsigned long int ipv4);
125JDNS_EXPORT void jdns_address_set_ipv6(jdns_address_t *a, const unsigned char *ipv6);
126
130JDNS_EXPORT int jdns_address_set_cstr(jdns_address_t *a, const char *str);
131
135JDNS_EXPORT int jdns_address_cmp(const jdns_address_t *a, const jdns_address_t *b);
136
137// convenient predefined addresses/ports
138#define JDNS_UNICAST_PORT 53
139#define JDNS_MULTICAST_PORT 5353
140JDNS_EXPORT jdns_address_t *jdns_address_multicast4_new(); // 224.0.0.251
141JDNS_EXPORT jdns_address_t *jdns_address_multicast6_new(); // FF02::FB
142
143typedef struct jdns_server
144{
145 unsigned char *name;
149 int port;
150 int priority;
151
156} jdns_server_t;
157
158JDNS_EXPORT jdns_server_t *jdns_server_new();
159JDNS_EXPORT jdns_server_t *jdns_server_copy(const jdns_server_t *s);
160JDNS_EXPORT void jdns_server_delete(jdns_server_t *s);
161JDNS_EXPORT void jdns_server_set_name(jdns_server_t *s, const unsigned char *name);
162
163typedef struct jdns_nameserver
164{
165 jdns_address_t *address;
166 int port;
167} jdns_nameserver_t;
168
169JDNS_EXPORT jdns_nameserver_t *jdns_nameserver_new();
170JDNS_EXPORT jdns_nameserver_t *jdns_nameserver_copy(const jdns_nameserver_t *a);
171JDNS_EXPORT void jdns_nameserver_delete(jdns_nameserver_t *a);
172JDNS_EXPORT void jdns_nameserver_set(jdns_nameserver_t *a, const jdns_address_t *addr,
173 int port);
174
176{
177 int count;
178 jdns_nameserver_t **item;
179} jdns_nameserverlist_t;
180
181JDNS_EXPORT jdns_nameserverlist_t *jdns_nameserverlist_new();
182JDNS_EXPORT jdns_nameserverlist_t *jdns_nameserverlist_copy(const jdns_nameserverlist_t *a);
183JDNS_EXPORT void jdns_nameserverlist_delete(jdns_nameserverlist_t *a);
184JDNS_EXPORT void jdns_nameserverlist_append(jdns_nameserverlist_t *a,
185 const jdns_address_t *addr, int port);
186
187typedef struct jdns_dnshost
188{
189 jdns_string_t *name;
190 jdns_address_t *address;
191} jdns_dnshost_t;
192
193typedef struct jdns_dnshostlist
194{
195 int count;
196 jdns_dnshost_t **item;
197} jdns_dnshostlist_t;
198
199typedef struct jdns_dnsparams
200{
201 jdns_nameserverlist_t *nameservers;
202 jdns_stringlist_t *domains;
203 jdns_dnshostlist_t *hosts;
204} jdns_dnsparams_t;
205
206JDNS_EXPORT jdns_dnsparams_t *jdns_dnsparams_new();
207JDNS_EXPORT jdns_dnsparams_t *jdns_dnsparams_copy(jdns_dnsparams_t *a);
208JDNS_EXPORT void jdns_dnsparams_delete(jdns_dnsparams_t *a);
209JDNS_EXPORT void jdns_dnsparams_append_nameserver(jdns_dnsparams_t *a,
210 const jdns_address_t *addr, int port);
211JDNS_EXPORT void jdns_dnsparams_append_domain(jdns_dnsparams_t *a,
212 const jdns_string_t *domain);
213JDNS_EXPORT void jdns_dnsparams_append_host(jdns_dnsparams_t *a,
214 const jdns_string_t *name, const jdns_address_t *address);
215
216#define JDNS_RTYPE_A 1
217#define JDNS_RTYPE_AAAA 28
218#define JDNS_RTYPE_MX 15
219#define JDNS_RTYPE_SRV 33
220#define JDNS_RTYPE_CNAME 5
221#define JDNS_RTYPE_PTR 12
222#define JDNS_RTYPE_TXT 16
223#define JDNS_RTYPE_HINFO 13
224#define JDNS_RTYPE_NS 2
225#define JDNS_RTYPE_ANY 255
226
227typedef struct jdns_rr
228{
229 unsigned char *owner;
230 int ttl;
231 int type;
232 int qclass;
233 int rdlength;
234 unsigned char *rdata;
235 int haveKnown;
236
237 union
238 {
239 jdns_address_t *address;
240 jdns_server_t *server;
241 unsigned char *name;
242 jdns_stringlist_t *texts;
243 struct
244 {
245 jdns_string_t *cpu;
246 jdns_string_t *os;
247 } hinfo; // for HINFO
248 } data;
249} jdns_rr_t;
250
251JDNS_EXPORT jdns_rr_t *jdns_rr_new();
252JDNS_EXPORT jdns_rr_t *jdns_rr_copy(const jdns_rr_t *r);
253JDNS_EXPORT void jdns_rr_delete(jdns_rr_t *r);
254JDNS_EXPORT void jdns_rr_set_owner(jdns_rr_t *r, const unsigned char *name);
255JDNS_EXPORT void jdns_rr_set_record(jdns_rr_t *r, int type, const unsigned char *rdata,
256 int rdlength);
257JDNS_EXPORT void jdns_rr_set_A(jdns_rr_t *r, const jdns_address_t *address);
258JDNS_EXPORT void jdns_rr_set_AAAA(jdns_rr_t *r, const jdns_address_t *address);
259JDNS_EXPORT void jdns_rr_set_MX(jdns_rr_t *r, const unsigned char *name, int priority);
260JDNS_EXPORT void jdns_rr_set_SRV(jdns_rr_t *r, const unsigned char *name, int port,
261 int priority, int weight);
262JDNS_EXPORT void jdns_rr_set_CNAME(jdns_rr_t *r, const unsigned char *name);
263JDNS_EXPORT void jdns_rr_set_PTR(jdns_rr_t *r, const unsigned char *name);
264JDNS_EXPORT void jdns_rr_set_TXT(jdns_rr_t *r, const jdns_stringlist_t *texts);
265JDNS_EXPORT void jdns_rr_set_HINFO(jdns_rr_t *r, const jdns_string_t *cpu,
266 const jdns_string_t *os);
267JDNS_EXPORT void jdns_rr_set_NS(jdns_rr_t *r, const unsigned char *name);
268// note: only works on known types
269JDNS_EXPORT int jdns_rr_verify(const jdns_rr_t *r);
270
271typedef struct jdns_response
272{
273 int answerCount;
274 jdns_rr_t **answerRecords;
275 int authorityCount;
276 jdns_rr_t **authorityRecords;
277 int additionalCount;
278 jdns_rr_t **additionalRecords;
279} jdns_response_t;
280
281JDNS_EXPORT jdns_response_t *jdns_response_new();
282JDNS_EXPORT jdns_response_t *jdns_response_copy(const jdns_response_t *r);
283JDNS_EXPORT void jdns_response_delete(jdns_response_t *r);
284JDNS_EXPORT void jdns_response_append_answer(jdns_response_t *r, const jdns_rr_t *rr);
285JDNS_EXPORT void jdns_response_append_authority(jdns_response_t *r, const jdns_rr_t *rr);
286JDNS_EXPORT void jdns_response_append_additional(jdns_response_t *r,
287 const jdns_rr_t *rr);
288
289#define JDNS_PUBLISH_SHARED 0x0001
290#define JDNS_PUBLISH_UNIQUE 0x0002
291
292#define JDNS_STEP_TIMER 0x0001
293#define JDNS_STEP_HANDLE 0x0002
294
295#define JDNS_EVENT_RESPONSE 0x0001
296#define JDNS_EVENT_PUBLISH 0x0002
297#define JDNS_EVENT_SHUTDOWN 0x0003
298
299#define JDNS_STATUS_SUCCESS 0x0001
300#define JDNS_STATUS_NXDOMAIN 0x0002
301#define JDNS_STATUS_ERROR 0x0003
302#define JDNS_STATUS_TIMEOUT 0x0004
303#define JDNS_STATUS_CONFLICT 0x0005
304
305typedef struct jdns_session jdns_session_t;
306
307typedef struct jdns_callbacks
308{
312 void *app;
313
319 int (*time_now)(jdns_session_t *s, void *app);
320
326 int (*rand_int)(jdns_session_t *s, void *app);
327
333 void (*debug_line)(jdns_session_t *s, void *app, const char *str);
334
348 int (*udp_bind)(jdns_session_t *s, void *app,
349 const jdns_address_t *addr, int port,
350 const jdns_address_t *maddr);
351
357 void (*udp_unbind)(jdns_session_t *s, void *app, int handle);
358
369 int (*udp_read)(jdns_session_t *s, void *app, int handle,
370 jdns_address_t *addr, int *port, unsigned char *buf,
371 int *bufsize);
372
383 int (*udp_write)(jdns_session_t *s, void *app, int handle,
384 const jdns_address_t *addr, int port, unsigned char *buf,
385 int bufsize);
386} jdns_callbacks_t;
387
388typedef struct jdns_event
389{
393 int type;
394
398 int id;
399
405
409 jdns_response_t *response;
410} jdns_event_t;
411
412JDNS_EXPORT void jdns_event_delete(jdns_event_t *e);
413
418JDNS_EXPORT jdns_session_t *jdns_session_new(jdns_callbacks_t *callbacks);
419
423JDNS_EXPORT void jdns_session_delete(jdns_session_t *s);
424
431JDNS_EXPORT int jdns_init_unicast(jdns_session_t *s, const jdns_address_t *addr, int port);
432
440JDNS_EXPORT int jdns_init_multicast(jdns_session_t *s, const jdns_address_t *addr, int port, const jdns_address_t *maddr);
441
445JDNS_EXPORT void jdns_shutdown(jdns_session_t *s);
446
451JDNS_EXPORT void jdns_set_nameservers(jdns_session_t *s, const jdns_nameserverlist_t *nslist);
452
456JDNS_EXPORT void jdns_probe(jdns_session_t *s);
457
464JDNS_EXPORT int jdns_query(jdns_session_t *s, const unsigned char *name, int rtype);
465
470JDNS_EXPORT void jdns_cancel_query(jdns_session_t *s, int id);
471
481JDNS_EXPORT int jdns_publish(jdns_session_t *s, int mode, const jdns_rr_t *rec);
482
491JDNS_EXPORT void jdns_update_publish(jdns_session_t *s, int id, const jdns_rr_t *rec);
492
497JDNS_EXPORT void jdns_cancel_publish(jdns_session_t *s, int id);
498
503JDNS_EXPORT int jdns_step(jdns_session_t *s);
504
509JDNS_EXPORT int jdns_next_timer(jdns_session_t *s);
510
515JDNS_EXPORT void jdns_set_handle_readable(jdns_session_t *s, int handle);
516
521JDNS_EXPORT void jdns_set_handle_writable(jdns_session_t *s, int handle);
522
527JDNS_EXPORT jdns_event_t *jdns_next_event(jdns_session_t *s);
528
532JDNS_EXPORT jdns_dnsparams_t *jdns_system_dnsparams();
533
550JDNS_EXPORT void jdns_set_hold_ids_enabled(jdns_session_t *s, int enabled);
551
552#ifdef __cplusplus
553}
554#endif
555
556#endif
JDNS_EXPORT int jdns_address_cmp(const jdns_address_t *a, const jdns_address_t *b)
JDNS_EXPORT void jdns_cancel_query(jdns_session_t *s, int id)
JDNS_EXPORT int jdns_publish(jdns_session_t *s, int mode, const jdns_rr_t *rec)
JDNS_EXPORT jdns_event_t * jdns_next_event(jdns_session_t *s)
JDNS_EXPORT int jdns_next_timer(jdns_session_t *s)
JDNS_EXPORT void jdns_set_hold_ids_enabled(jdns_session_t *s, int enabled)
JDNS_EXPORT void jdns_set_nameservers(jdns_session_t *s, const jdns_nameserverlist_t *nslist)
JDNS_EXPORT int jdns_query(jdns_session_t *s, const unsigned char *name, int rtype)
JDNS_EXPORT void jdns_set_handle_writable(jdns_session_t *s, int handle)
JDNS_EXPORT void jdns_probe(jdns_session_t *s)
JDNS_EXPORT void jdns_update_publish(jdns_session_t *s, int id, const jdns_rr_t *rec)
JDNS_EXPORT jdns_dnsparams_t * jdns_system_dnsparams()
JDNS_EXPORT int jdns_init_unicast(jdns_session_t *s, const jdns_address_t *addr, int port)
JDNS_EXPORT jdns_session_t * jdns_session_new(jdns_callbacks_t *callbacks)
JDNS_EXPORT void jdns_set_handle_readable(jdns_session_t *s, int handle)
JDNS_EXPORT void jdns_cancel_publish(jdns_session_t *s, int id)
JDNS_EXPORT void jdns_session_delete(jdns_session_t *s)
JDNS_EXPORT int jdns_init_multicast(jdns_session_t *s, const jdns_address_t *addr, int port, const jdns_address_t *maddr)
JDNS_EXPORT int jdns_address_set_cstr(jdns_address_t *a, const char *str)
JDNS_EXPORT int jdns_step(jdns_session_t *s)
JDNS_EXPORT void jdns_shutdown(jdns_session_t *s)
Preprocessor magic to allow export of library symbols.
Definition jdns.h:111
Definition jdns.h:308
int(* rand_int)(jdns_session_t *s, void *app)
Definition jdns.h:326
void(* debug_line)(jdns_session_t *s, void *app, const char *str)
Definition jdns.h:333
void(* udp_unbind)(jdns_session_t *s, void *app, int handle)
Definition jdns.h:357
int(* udp_write)(jdns_session_t *s, void *app, int handle, const jdns_address_t *addr, int port, unsigned char *buf, int bufsize)
Definition jdns.h:383
int(* time_now)(jdns_session_t *s, void *app)
Definition jdns.h:319
int(* udp_read)(jdns_session_t *s, void *app, int handle, jdns_address_t *addr, int *port, unsigned char *buf, int *bufsize)
Definition jdns.h:369
int(* udp_bind)(jdns_session_t *s, void *app, const jdns_address_t *addr, int port, const jdns_address_t *maddr)
Definition jdns.h:348
void * app
user-supplied context
Definition jdns.h:312
Definition jdns.h:188
Definition jdns.h:194
Definition jdns.h:200
Definition jdns.h:389
int id
query id or publish id
Definition jdns.h:398
int type
JDNS_EVENT.
Definition jdns.h:393
int status
for query, this can be SUCCESS, NXDOMAIN, ERROR, or TIMEOUT for publish, this can be SUCCESS,...
Definition jdns.h:404
jdns_response_t * response
for query
Definition jdns.h:409
Definition jdns.h:66
Definition jdns.h:164
Definition jdns.h:176
Definition jdns.h:50
Definition jdns.h:272
Definition jdns.h:228
jdns_server_t * server
for MX, SRV
Definition jdns.h:240
jdns_stringlist_t * texts
for TXT
Definition jdns.h:242
jdns_address_t * address
for A, AAAA
Definition jdns.h:239
unsigned char * name
for CNAME, PTR, NS
Definition jdns.h:241
Definition jdns.h:144
int port
SRV only.
Definition jdns.h:149
int weight
SRV only.
Definition jdns.h:155
Definition jdns.h:84
Definition jdns.h:99