2 /* Copyright 1998, 2009 by the Massachusetts Institute of Technology.
3 * Copyright (C) 2007-2011 by Daniel Stenberg
5 * Permission to use, copy, modify, and distribute this
6 * software and its documentation for any purpose and without
7 * fee is hereby granted, provided that the above copyright
8 * notice appear in all copies and that both that copyright
9 * notice and this permission notice appear in supporting
10 * documentation, and that the name of M.I.T. not be used in
11 * advertising or publicity pertaining to distribution of the
12 * software without specific, written prior permission.
13 * M.I.T. makes no representations about the suitability of
14 * this software for any purpose. It is provided "as is"
15 * without express or implied warranty.
21 #include "ares_version.h" /* c-ares version defines */
22 #include "ares_build.h" /* c-ares build definitions */
23 #include "ares_rules.h" /* c-ares rules enforcement */
26 * Define WIN32 when build target is Win32 API
29 #if (defined(_WIN32) || defined(__WIN32__)) && \
30 !defined(WIN32) && !defined(__SYMBIAN32__)
34 #include <sys/types.h>
36 /* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
37 libc5-based Linux systems. Only include it on system that are known to
39 #if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
40 defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
41 defined(ANDROID) || defined(__ANDROID__)
42 #include <sys/select.h>
44 #if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
45 #include <sys/bsdskt.h>
49 # include <netinet/in.h>
50 # include <sys/socket.h>
52 #elif defined(_WIN32_WCE)
53 # ifndef WIN32_LEAN_AND_MEAN
54 # define WIN32_LEAN_AND_MEAN
59 # ifndef WIN32_LEAN_AND_MEAN
60 # define WIN32_LEAN_AND_MEAN
63 # include <winsock2.h>
64 # include <ws2tcpip.h>
66 # include <sys/socket.h>
67 # include <netinet/in.h>
75 ** c-ares external API function linkage decorations.
78 #if !defined(CARES_STATICLIB) && \
79 (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__))
80 /* __declspec function decoration for Win32 and Symbian DLL's */
81 # if defined(CARES_BUILDING_LIBRARY)
82 # define CARES_EXTERN __declspec(dllexport)
84 # define CARES_EXTERN __declspec(dllimport)
87 /* visibility function decoration for other cases */
88 # if !defined(CARES_SYMBOL_HIDING) || \
89 defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)
92 # define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN
97 #define ARES_SUCCESS 0
99 /* Server error codes (ARES_ENODATA indicates no relevant answer) */
100 #define ARES_ENODATA 1
101 #define ARES_EFORMERR 2
102 #define ARES_ESERVFAIL 3
103 #define ARES_ENOTFOUND 4
104 #define ARES_ENOTIMP 5
105 #define ARES_EREFUSED 6
107 /* Locally generated error codes */
108 #define ARES_EBADQUERY 7
109 #define ARES_EBADNAME 8
110 #define ARES_EBADFAMILY 9
111 #define ARES_EBADRESP 10
112 #define ARES_ECONNREFUSED 11
113 #define ARES_ETIMEOUT 12
115 #define ARES_EFILE 14
116 #define ARES_ENOMEM 15
117 #define ARES_EDESTRUCTION 16
118 #define ARES_EBADSTR 17
120 /* ares_getnameinfo error codes */
121 #define ARES_EBADFLAGS 18
123 /* ares_getaddrinfo error codes */
124 #define ARES_ENONAME 19
125 #define ARES_EBADHINTS 20
127 /* Uninitialized library error code */
128 #define ARES_ENOTINITIALIZED 21 /* introduced in 1.7.0 */
130 /* ares_library_init error codes */
131 #define ARES_ELOADIPHLPAPI 22 /* introduced in 1.7.0 */
132 #define ARES_EADDRGETNETWORKPARAMS 23 /* introduced in 1.7.0 */
134 /* More error codes */
135 #define ARES_ECANCELLED 24 /* introduced in 1.7.0 */
138 #define ARES_FLAG_USEVC (1 << 0)
139 #define ARES_FLAG_PRIMARY (1 << 1)
140 #define ARES_FLAG_IGNTC (1 << 2)
141 #define ARES_FLAG_NORECURSE (1 << 3)
142 #define ARES_FLAG_STAYOPEN (1 << 4)
143 #define ARES_FLAG_NOSEARCH (1 << 5)
144 #define ARES_FLAG_NOALIASES (1 << 6)
145 #define ARES_FLAG_NOCHECKRESP (1 << 7)
146 #define ARES_FLAG_EDNS (1 << 8)
148 /* Option mask values */
149 #define ARES_OPT_FLAGS (1 << 0)
150 #define ARES_OPT_TIMEOUT (1 << 1)
151 #define ARES_OPT_TRIES (1 << 2)
152 #define ARES_OPT_NDOTS (1 << 3)
153 #define ARES_OPT_UDP_PORT (1 << 4)
154 #define ARES_OPT_TCP_PORT (1 << 5)
155 #define ARES_OPT_SERVERS (1 << 6)
156 #define ARES_OPT_DOMAINS (1 << 7)
157 #define ARES_OPT_LOOKUPS (1 << 8)
158 #define ARES_OPT_SOCK_STATE_CB (1 << 9)
159 #define ARES_OPT_SORTLIST (1 << 10)
160 #define ARES_OPT_SOCK_SNDBUF (1 << 11)
161 #define ARES_OPT_SOCK_RCVBUF (1 << 12)
162 #define ARES_OPT_TIMEOUTMS (1 << 13)
163 #define ARES_OPT_ROTATE (1 << 14)
164 #define ARES_OPT_EDNSPSZ (1 << 15)
166 /* Nameinfo flag values */
167 #define ARES_NI_NOFQDN (1 << 0)
168 #define ARES_NI_NUMERICHOST (1 << 1)
169 #define ARES_NI_NAMEREQD (1 << 2)
170 #define ARES_NI_NUMERICSERV (1 << 3)
171 #define ARES_NI_DGRAM (1 << 4)
172 #define ARES_NI_TCP 0
173 #define ARES_NI_UDP ARES_NI_DGRAM
174 #define ARES_NI_SCTP (1 << 5)
175 #define ARES_NI_DCCP (1 << 6)
176 #define ARES_NI_NUMERICSCOPE (1 << 7)
177 #define ARES_NI_LOOKUPHOST (1 << 8)
178 #define ARES_NI_LOOKUPSERVICE (1 << 9)
179 /* Reserved for future use */
180 #define ARES_NI_IDN (1 << 10)
181 #define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11)
182 #define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12)
184 /* Addrinfo flag values */
185 #define ARES_AI_CANONNAME (1 << 0)
186 #define ARES_AI_NUMERICHOST (1 << 1)
187 #define ARES_AI_PASSIVE (1 << 2)
188 #define ARES_AI_NUMERICSERV (1 << 3)
189 #define ARES_AI_V4MAPPED (1 << 4)
190 #define ARES_AI_ALL (1 << 5)
191 #define ARES_AI_ADDRCONFIG (1 << 6)
192 /* Reserved for future use */
193 #define ARES_AI_IDN (1 << 10)
194 #define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11)
195 #define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12)
196 #define ARES_AI_CANONIDN (1 << 13)
198 #define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \
199 ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \
201 #define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this
203 #define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num)))
204 #define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
205 ARES_GETSOCK_MAXNUM)))
207 /* c-ares library initialization flag values */
208 #define ARES_LIB_INIT_NONE (0)
209 #define ARES_LIB_INIT_WIN32 (1 << 0)
210 #define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32)
214 * Typedef our socket type
217 #ifndef ares_socket_typedef
219 typedef SOCKET ares_socket_t;
220 #define ARES_SOCKET_BAD INVALID_SOCKET
222 typedef int ares_socket_t;
223 #define ARES_SOCKET_BAD -1
225 #define ares_socket_typedef
226 #endif /* ares_socket_typedef */
228 typedef void (*ares_sock_state_cb)(void *data,
229 ares_socket_t socket_fd,
235 /* NOTE about the ares_options struct to users and developers.
237 This struct will remain looking like this. It will not be extended nor
238 shrunk in future releases, but all new options will be set by ares_set_*()
239 options instead of with the ares_init_options() function.
241 Eventually (in a galaxy far far away), all options will be settable by
242 ares_set_*() options and the ares_init_options() function will become
245 When new options are added to c-ares, they are not added to this
246 struct. And they are not "saved" with the ares_save_options() function but
247 instead we encourage the use of the ares_dup() function. Needless to say,
248 if you add config options to c-ares you need to make sure ares_dup()
249 duplicates this new option.
252 struct ares_options {
254 int timeout; /* in seconds or milliseconds, depending on options */
257 unsigned short udp_port;
258 unsigned short tcp_port;
259 int socket_send_buffer_size;
260 int socket_receive_buffer_size;
261 struct in_addr *servers;
266 ares_sock_state_cb sock_state_cb;
267 void *sock_state_cb_data;
268 struct apattern *sortlist;
276 struct ares_channeldata;
278 typedef struct ares_channeldata *ares_channel;
280 typedef void (*ares_callback)(void *arg,
286 typedef void (*ares_host_callback)(void *arg,
289 struct hostent *hostent);
291 typedef void (*ares_nameinfo_callback)(void *arg,
297 typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd,
301 CARES_EXTERN int ares_library_init(int flags);
303 CARES_EXTERN void ares_library_cleanup(void);
305 CARES_EXTERN const char *ares_version(int *version);
307 CARES_EXTERN int ares_init(ares_channel *channelptr);
309 CARES_EXTERN int ares_init_options(ares_channel *channelptr,
310 struct ares_options *options,
313 CARES_EXTERN int ares_save_options(ares_channel channel,
314 struct ares_options *options,
317 CARES_EXTERN void ares_destroy_options(struct ares_options *options);
319 CARES_EXTERN int ares_dup(ares_channel *dest,
322 CARES_EXTERN void ares_destroy(ares_channel channel);
324 CARES_EXTERN void ares_cancel(ares_channel channel);
326 /* These next 3 configure local binding for the out-going socket
327 * connection. Use these to specify source IP and/or network device
328 * on multi-homed systems.
330 CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip);
332 /* local_ip6 should be 16 bytes in length */
333 CARES_EXTERN void ares_set_local_ip6(ares_channel channel,
334 const unsigned char* local_ip6);
336 /* local_dev_name should be null terminated. */
337 CARES_EXTERN void ares_set_local_dev(ares_channel channel,
338 const char* local_dev_name);
340 CARES_EXTERN void ares_set_socket_callback(ares_channel channel,
341 ares_sock_create_callback callback,
344 CARES_EXTERN void ares_send(ares_channel channel,
345 const unsigned char *qbuf,
347 ares_callback callback,
350 CARES_EXTERN void ares_query(ares_channel channel,
354 ares_callback callback,
357 CARES_EXTERN void ares_search(ares_channel channel,
361 ares_callback callback,
364 CARES_EXTERN void ares_gethostbyname(ares_channel channel,
367 ares_host_callback callback,
370 CARES_EXTERN int ares_gethostbyname_file(ares_channel channel,
373 struct hostent **host);
375 CARES_EXTERN void ares_gethostbyaddr(ares_channel channel,
379 ares_host_callback callback,
382 CARES_EXTERN void ares_getnameinfo(ares_channel channel,
383 const struct sockaddr *sa,
384 ares_socklen_t salen,
386 ares_nameinfo_callback callback,
389 CARES_EXTERN int ares_fds(ares_channel channel,
393 CARES_EXTERN int ares_getsock(ares_channel channel,
394 ares_socket_t *socks,
397 CARES_EXTERN struct timeval *ares_timeout(ares_channel channel,
398 struct timeval *maxtv,
401 CARES_EXTERN void ares_process(ares_channel channel,
405 CARES_EXTERN void ares_process_fd(ares_channel channel,
406 ares_socket_t read_fd,
407 ares_socket_t write_fd);
409 CARES_EXTERN int ares_create_query(const char *name,
418 CARES_EXTERN int ares_mkquery(const char *name,
426 CARES_EXTERN int ares_expand_name(const unsigned char *encoded,
427 const unsigned char *abuf,
432 CARES_EXTERN int ares_expand_string(const unsigned char *encoded,
433 const unsigned char *abuf,
439 * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr
440 * struct below when ares itself was built, but many apps would use this
441 * private version since the header checked a HAVE_* define for it. Starting
442 * with 1.7.0 we always declare and use our own to stop relying on the
445 struct ares_in6_addr {
447 unsigned char _S6_u8[16];
451 struct ares_addrttl {
452 struct in_addr ipaddr;
456 struct ares_addr6ttl {
457 struct ares_in6_addr ip6addr;
461 struct ares_srv_reply {
462 struct ares_srv_reply *next;
464 unsigned short priority;
465 unsigned short weight;
469 struct ares_mx_reply {
470 struct ares_mx_reply *next;
472 unsigned short priority;
475 struct ares_txt_reply {
476 struct ares_txt_reply *next;
478 size_t length; /* length excludes null termination */
481 struct ares_naptr_reply {
482 struct ares_naptr_reply *next;
483 unsigned char *flags;
484 unsigned char *service;
485 unsigned char *regexp;
487 unsigned short order;
488 unsigned short preference;
491 struct ares_soa_reply {
495 unsigned int refresh;
502 ** Parse the buffer, starting at *abuf and of length alen bytes, previously
503 ** obtained from an ares_search call. Put the results in *host, if nonnull.
504 ** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with
505 ** their TTLs in that array, and set *naddrttls to the number of addresses
509 CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf,
511 struct hostent **host,
512 struct ares_addrttl *addrttls,
515 CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf,
517 struct hostent **host,
518 struct ares_addr6ttl *addrttls,
521 CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf,
526 struct hostent **host);
528 CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf,
530 struct hostent **host);
532 CARES_EXTERN int ares_parse_srv_reply(const unsigned char* abuf,
534 struct ares_srv_reply** srv_out);
536 CARES_EXTERN int ares_parse_mx_reply(const unsigned char* abuf,
538 struct ares_mx_reply** mx_out);
540 CARES_EXTERN int ares_parse_txt_reply(const unsigned char* abuf,
542 struct ares_txt_reply** txt_out);
544 CARES_EXTERN int ares_parse_naptr_reply(const unsigned char* abuf,
546 struct ares_naptr_reply** naptr_out);
548 CARES_EXTERN int ares_parse_soa_reply(const unsigned char* abuf,
550 struct ares_soa_reply** soa_out);
552 CARES_EXTERN void ares_free_string(void *str);
554 CARES_EXTERN void ares_free_hostent(struct hostent *host);
556 CARES_EXTERN void ares_free_soa(struct ares_soa_reply *soa);
558 CARES_EXTERN void ares_free_data(void *dataptr);
560 CARES_EXTERN const char *ares_strerror(int code);
562 /* TODO: Hold port here as well. */
563 struct ares_addr_node {
564 struct ares_addr_node *next;
567 struct in_addr addr4;
568 struct ares_in6_addr addr6;
572 CARES_EXTERN int ares_set_servers(ares_channel channel,
573 struct ares_addr_node *servers);
575 /* Incomming string format: host[:port][,host[:port]]... */
576 CARES_EXTERN int ares_set_servers_csv(ares_channel channel,
577 const char* servers);
579 CARES_EXTERN int ares_get_servers(ares_channel channel,
580 struct ares_addr_node **servers);