JDNS
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 
28 #ifndef JDNS_H
29 #define JDNS_H
30 
31 #include "jdns_export.h"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 typedef void (*jdns_object_dtor_func)(void *);
38 typedef 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 
49 typedef struct jdns_object
50 {
51  JDNS_OBJECT
53 
54 JDNS_EXPORT void *jdns_object_new(int size, void (*dtor)(void *),
55  void *(*cctor)(const void *));
56 JDNS_EXPORT void *jdns_object_copy(const void *a);
57 JDNS_EXPORT void jdns_object_delete(void *a);
58 JDNS_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 
65 typedef struct jdns_list
66 {
67  JDNS_OBJECT
68  int count;
69  void **item;
70  int valueList;
71  int autoDelete;
72 } jdns_list_t;
73 
74 JDNS_EXPORT jdns_list_t *jdns_list_new();
75 JDNS_EXPORT jdns_list_t *jdns_list_copy(const jdns_list_t *a);
76 JDNS_EXPORT void jdns_list_delete(jdns_list_t *a);
77 JDNS_EXPORT void jdns_list_clear(jdns_list_t *a);
78 JDNS_EXPORT void jdns_list_insert(jdns_list_t *a, void *item, int pos);
79 JDNS_EXPORT void jdns_list_insert_value(jdns_list_t *a, const void *item, int pos);
80 JDNS_EXPORT void jdns_list_remove(jdns_list_t *a, void *item);
81 JDNS_EXPORT void jdns_list_remove_at(jdns_list_t *a, int pos);
82 
83 typedef struct jdns_string
84 {
85  JDNS_OBJECT
86  unsigned char *data;
87  int size;
89 
90 JDNS_EXPORT jdns_string_t *jdns_string_new();
91 JDNS_EXPORT jdns_string_t *jdns_string_copy(const jdns_string_t *s);
92 JDNS_EXPORT void jdns_string_delete(jdns_string_t *s);
93 JDNS_EXPORT void jdns_string_set(jdns_string_t *s, const unsigned char *str,
94  int str_len);
95 JDNS_EXPORT void jdns_string_set_cstr(jdns_string_t *s, const char *str);
96 
97  // overlays jdns_list
98 typedef struct jdns_stringlist
99 {
100  JDNS_OBJECT
101  int count;
102  jdns_string_t **item;
104 
105 JDNS_EXPORT jdns_stringlist_t *jdns_stringlist_new();
106 JDNS_EXPORT jdns_stringlist_t *jdns_stringlist_copy(const jdns_stringlist_t *a);
107 JDNS_EXPORT void jdns_stringlist_delete(jdns_stringlist_t *a);
108 JDNS_EXPORT void jdns_stringlist_append(jdns_stringlist_t *a, const jdns_string_t *str);
109 
110 typedef 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;
120 
121 JDNS_EXPORT jdns_address_t *jdns_address_new();
122 JDNS_EXPORT jdns_address_t *jdns_address_copy(const jdns_address_t *a);
123 JDNS_EXPORT void jdns_address_delete(jdns_address_t *a);
124 JDNS_EXPORT void jdns_address_set_ipv4(jdns_address_t *a, unsigned long int ipv4);
125 JDNS_EXPORT void jdns_address_set_ipv6(jdns_address_t *a, const unsigned char *ipv6);
126 
130 JDNS_EXPORT int jdns_address_set_cstr(jdns_address_t *a, const char *str);
131 
135 JDNS_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
140 JDNS_EXPORT jdns_address_t *jdns_address_multicast4_new(); // 224.0.0.251
141 JDNS_EXPORT jdns_address_t *jdns_address_multicast6_new(); // FF02::FB
142 
143 typedef struct jdns_server
144 {
145  unsigned char *name;
149  int port;
150  int priority;
151 
155  int weight;
156 } jdns_server_t;
157 
158 JDNS_EXPORT jdns_server_t *jdns_server_new();
159 JDNS_EXPORT jdns_server_t *jdns_server_copy(const jdns_server_t *s);
160 JDNS_EXPORT void jdns_server_delete(jdns_server_t *s);
161 JDNS_EXPORT void jdns_server_set_name(jdns_server_t *s, const unsigned char *name);
162 
163 typedef struct jdns_nameserver
164 {
165  jdns_address_t *address;
166  int port;
168 
169 JDNS_EXPORT jdns_nameserver_t *jdns_nameserver_new();
170 JDNS_EXPORT jdns_nameserver_t *jdns_nameserver_copy(const jdns_nameserver_t *a);
171 JDNS_EXPORT void jdns_nameserver_delete(jdns_nameserver_t *a);
172 JDNS_EXPORT void jdns_nameserver_set(jdns_nameserver_t *a, const jdns_address_t *addr,
173  int port);
174 
175 typedef struct jdns_nameserverlist
176 {
177  int count;
178  jdns_nameserver_t **item;
180 
181 JDNS_EXPORT jdns_nameserverlist_t *jdns_nameserverlist_new();
182 JDNS_EXPORT jdns_nameserverlist_t *jdns_nameserverlist_copy(const jdns_nameserverlist_t *a);
183 JDNS_EXPORT void jdns_nameserverlist_delete(jdns_nameserverlist_t *a);
184 JDNS_EXPORT void jdns_nameserverlist_append(jdns_nameserverlist_t *a,
185  const jdns_address_t *addr, int port);
186 
187 typedef struct jdns_dnshost
188 {
189  jdns_string_t *name;
190  jdns_address_t *address;
192 
193 typedef struct jdns_dnshostlist
194 {
195  int count;
196  jdns_dnshost_t **item;
198 
199 typedef struct jdns_dnsparams
200 {
201  jdns_nameserverlist_t *nameservers;
202  jdns_stringlist_t *domains;
203  jdns_dnshostlist_t *hosts;
205 
206 JDNS_EXPORT jdns_dnsparams_t *jdns_dnsparams_new();
207 JDNS_EXPORT jdns_dnsparams_t *jdns_dnsparams_copy(jdns_dnsparams_t *a);
208 JDNS_EXPORT void jdns_dnsparams_delete(jdns_dnsparams_t *a);
209 JDNS_EXPORT void jdns_dnsparams_append_nameserver(jdns_dnsparams_t *a,
210  const jdns_address_t *addr, int port);
211 JDNS_EXPORT void jdns_dnsparams_append_domain(jdns_dnsparams_t *a,
212  const jdns_string_t *domain);
213 JDNS_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 
227 typedef 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  {
241  unsigned char *name;
243  struct
244  {
245  jdns_string_t *cpu;
246  jdns_string_t *os;
247  } hinfo; // for HINFO
248  } data;
249 } jdns_rr_t;
250 
251 JDNS_EXPORT jdns_rr_t *jdns_rr_new();
252 JDNS_EXPORT jdns_rr_t *jdns_rr_copy(const jdns_rr_t *r);
253 JDNS_EXPORT void jdns_rr_delete(jdns_rr_t *r);
254 JDNS_EXPORT void jdns_rr_set_owner(jdns_rr_t *r, const unsigned char *name);
255 JDNS_EXPORT void jdns_rr_set_record(jdns_rr_t *r, int type, const unsigned char *rdata,
256  int rdlength);
257 JDNS_EXPORT void jdns_rr_set_A(jdns_rr_t *r, const jdns_address_t *address);
258 JDNS_EXPORT void jdns_rr_set_AAAA(jdns_rr_t *r, const jdns_address_t *address);
259 JDNS_EXPORT void jdns_rr_set_MX(jdns_rr_t *r, const unsigned char *name, int priority);
260 JDNS_EXPORT void jdns_rr_set_SRV(jdns_rr_t *r, const unsigned char *name, int port,
261  int priority, int weight);
262 JDNS_EXPORT void jdns_rr_set_CNAME(jdns_rr_t *r, const unsigned char *name);
263 JDNS_EXPORT void jdns_rr_set_PTR(jdns_rr_t *r, const unsigned char *name);
264 JDNS_EXPORT void jdns_rr_set_TXT(jdns_rr_t *r, const jdns_stringlist_t *texts);
265 JDNS_EXPORT void jdns_rr_set_HINFO(jdns_rr_t *r, const jdns_string_t *cpu,
266  const jdns_string_t *os);
267 JDNS_EXPORT void jdns_rr_set_NS(jdns_rr_t *r, const unsigned char *name);
268 // note: only works on known types
269 JDNS_EXPORT int jdns_rr_verify(const jdns_rr_t *r);
270 
271 typedef 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;
280 
281 JDNS_EXPORT jdns_response_t *jdns_response_new();
282 JDNS_EXPORT jdns_response_t *jdns_response_copy(const jdns_response_t *r);
283 JDNS_EXPORT void jdns_response_delete(jdns_response_t *r);
284 JDNS_EXPORT void jdns_response_append_answer(jdns_response_t *r, const jdns_rr_t *rr);
285 JDNS_EXPORT void jdns_response_append_authority(jdns_response_t *r, const jdns_rr_t *rr);
286 JDNS_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 
305 typedef struct jdns_session jdns_session_t;
306 
307 typedef 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);
387 
388 typedef struct jdns_event
389 {
393  int type;
394 
398  int id;
399 
404  int status;
405 
410 } jdns_event_t;
411 
412 JDNS_EXPORT void jdns_event_delete(jdns_event_t *e);
413 
418 JDNS_EXPORT jdns_session_t *jdns_session_new(jdns_callbacks_t *callbacks);
419 
423 JDNS_EXPORT void jdns_session_delete(jdns_session_t *s);
424 
431 JDNS_EXPORT int jdns_init_unicast(jdns_session_t *s, const jdns_address_t *addr, int port);
432 
440 JDNS_EXPORT int jdns_init_multicast(jdns_session_t *s, const jdns_address_t *addr, int port, const jdns_address_t *maddr);
441 
445 JDNS_EXPORT void jdns_shutdown(jdns_session_t *s);
446 
451 JDNS_EXPORT void jdns_set_nameservers(jdns_session_t *s, const jdns_nameserverlist_t *nslist);
452 
456 JDNS_EXPORT void jdns_probe(jdns_session_t *s);
457 
464 JDNS_EXPORT int jdns_query(jdns_session_t *s, const unsigned char *name, int rtype);
465 
470 JDNS_EXPORT void jdns_cancel_query(jdns_session_t *s, int id);
471 
481 JDNS_EXPORT int jdns_publish(jdns_session_t *s, int mode, const jdns_rr_t *rec);
482 
491 JDNS_EXPORT void jdns_update_publish(jdns_session_t *s, int id, const jdns_rr_t *rec);
492 
497 JDNS_EXPORT void jdns_cancel_publish(jdns_session_t *s, int id);
498 
503 JDNS_EXPORT int jdns_step(jdns_session_t *s);
504 
509 JDNS_EXPORT int jdns_next_timer(jdns_session_t *s);
510 
515 JDNS_EXPORT void jdns_set_handle_readable(jdns_session_t *s, int handle);
516 
521 JDNS_EXPORT void jdns_set_handle_writable(jdns_session_t *s, int handle);
522 
527 JDNS_EXPORT jdns_event_t *jdns_next_event(jdns_session_t *s);
528 
533 
550 JDNS_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 jdns_dnsparams_t * jdns_system_dnsparams()
JDNS_EXPORT jdns_session_t * jdns_session_new(jdns_callbacks_t *callbacks)
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 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 int jdns_init_unicast(jdns_session_t *s, const jdns_address_t *addr, int port)
JDNS_EXPORT jdns_event_t * jdns_next_event(jdns_session_t *s)
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