2 /* Copyright 1998 by the Massachusetts Institute of Technology.
3 * Copyright (C) 2007-2013 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__) || defined(__OpenBSD__) || \
43 #include <sys/select.h>
45 #if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
46 #include <sys/bsdskt.h>
50 # include <netinet/in.h>
51 # include <sys/socket.h>
53 #elif defined(_WIN32_WCE)
54 # ifndef WIN32_LEAN_AND_MEAN
55 # define WIN32_LEAN_AND_MEAN
60 # ifndef WIN32_LEAN_AND_MEAN
61 # define WIN32_LEAN_AND_MEAN
64 # include <winsock2.h>
65 # include <ws2tcpip.h>
67 # include <sys/socket.h>
68 # include <netinet/in.h>
71 #if defined(ANDROID) || defined(__ANDROID__)
80 ** c-ares external API function linkage decorations.
83 #ifdef CARES_STATICLIB
85 #elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)
86 # if defined(CARES_BUILDING_LIBRARY)
87 # define CARES_EXTERN __declspec(dllexport)
89 # define CARES_EXTERN __declspec(dllimport)
91 #elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING)
92 # define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN
98 #define ARES_SUCCESS 0
100 /* Server error codes (ARES_ENODATA indicates no relevant answer) */
101 #define ARES_ENODATA 1
102 #define ARES_EFORMERR 2
103 #define ARES_ESERVFAIL 3
104 #define ARES_ENOTFOUND 4
105 #define ARES_ENOTIMP 5
106 #define ARES_EREFUSED 6
108 /* Locally generated error codes */
109 #define ARES_EBADQUERY 7
110 #define ARES_EBADNAME 8
111 #define ARES_EBADFAMILY 9
112 #define ARES_EBADRESP 10
113 #define ARES_ECONNREFUSED 11
114 #define ARES_ETIMEOUT 12
116 #define ARES_EFILE 14
117 #define ARES_ENOMEM 15
118 #define ARES_EDESTRUCTION 16
119 #define ARES_EBADSTR 17
121 /* ares_getnameinfo error codes */
122 #define ARES_EBADFLAGS 18
124 /* ares_getaddrinfo error codes */
125 #define ARES_ENONAME 19
126 #define ARES_EBADHINTS 20
128 /* Uninitialized library error code */
129 #define ARES_ENOTINITIALIZED 21 /* introduced in 1.7.0 */
131 /* ares_library_init error codes */
132 #define ARES_ELOADIPHLPAPI 22 /* introduced in 1.7.0 */
133 #define ARES_EADDRGETNETWORKPARAMS 23 /* introduced in 1.7.0 */
135 /* More error codes */
136 #define ARES_ECANCELLED 24 /* introduced in 1.7.0 */
138 /* More ares_getaddrinfo error codes */
139 #define ARES_ESERVICE 25 /* introduced in 1.?.0 */
142 #define ARES_FLAG_USEVC (1 << 0)
143 #define ARES_FLAG_PRIMARY (1 << 1)
144 #define ARES_FLAG_IGNTC (1 << 2)
145 #define ARES_FLAG_NORECURSE (1 << 3)
146 #define ARES_FLAG_STAYOPEN (1 << 4)
147 #define ARES_FLAG_NOSEARCH (1 << 5)
148 #define ARES_FLAG_NOALIASES (1 << 6)
149 #define ARES_FLAG_NOCHECKRESP (1 << 7)
150 #define ARES_FLAG_EDNS (1 << 8)
152 /* Option mask values */
153 #define ARES_OPT_FLAGS (1 << 0)
154 #define ARES_OPT_TIMEOUT (1 << 1)
155 #define ARES_OPT_TRIES (1 << 2)
156 #define ARES_OPT_NDOTS (1 << 3)
157 #define ARES_OPT_UDP_PORT (1 << 4)
158 #define ARES_OPT_TCP_PORT (1 << 5)
159 #define ARES_OPT_SERVERS (1 << 6)
160 #define ARES_OPT_DOMAINS (1 << 7)
161 #define ARES_OPT_LOOKUPS (1 << 8)
162 #define ARES_OPT_SOCK_STATE_CB (1 << 9)
163 #define ARES_OPT_SORTLIST (1 << 10)
164 #define ARES_OPT_SOCK_SNDBUF (1 << 11)
165 #define ARES_OPT_SOCK_RCVBUF (1 << 12)
166 #define ARES_OPT_TIMEOUTMS (1 << 13)
167 #define ARES_OPT_ROTATE (1 << 14)
168 #define ARES_OPT_EDNSPSZ (1 << 15)
169 #define ARES_OPT_NOROTATE (1 << 16)
170 #define ARES_OPT_RESOLVCONF (1 << 17)
172 /* Nameinfo flag values */
173 #define ARES_NI_NOFQDN (1 << 0)
174 #define ARES_NI_NUMERICHOST (1 << 1)
175 #define ARES_NI_NAMEREQD (1 << 2)
176 #define ARES_NI_NUMERICSERV (1 << 3)
177 #define ARES_NI_DGRAM (1 << 4)
178 #define ARES_NI_TCP 0
179 #define ARES_NI_UDP ARES_NI_DGRAM
180 #define ARES_NI_SCTP (1 << 5)
181 #define ARES_NI_DCCP (1 << 6)
182 #define ARES_NI_NUMERICSCOPE (1 << 7)
183 #define ARES_NI_LOOKUPHOST (1 << 8)
184 #define ARES_NI_LOOKUPSERVICE (1 << 9)
185 /* Reserved for future use */
186 #define ARES_NI_IDN (1 << 10)
187 #define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11)
188 #define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12)
190 /* Addrinfo flag values */
191 #define ARES_AI_CANONNAME (1 << 0)
192 #define ARES_AI_NUMERICHOST (1 << 1)
193 #define ARES_AI_PASSIVE (1 << 2)
194 #define ARES_AI_NUMERICSERV (1 << 3)
195 #define ARES_AI_V4MAPPED (1 << 4)
196 #define ARES_AI_ALL (1 << 5)
197 #define ARES_AI_ADDRCONFIG (1 << 6)
198 #define ARES_AI_NOSORT (1 << 7)
199 #define ARES_AI_ENVHOSTS (1 << 8)
200 /* Reserved for future use */
201 #define ARES_AI_IDN (1 << 10)
202 #define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11)
203 #define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12)
204 #define ARES_AI_CANONIDN (1 << 13)
206 #define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \
207 ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \
209 #define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this
211 #define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num)))
212 #define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
213 ARES_GETSOCK_MAXNUM)))
215 /* c-ares library initialization flag values */
216 #define ARES_LIB_INIT_NONE (0)
217 #define ARES_LIB_INIT_WIN32 (1 << 0)
218 #define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32)
222 * Typedef our socket type
225 #ifndef ares_socket_typedef
227 typedef SOCKET ares_socket_t;
228 #define ARES_SOCKET_BAD INVALID_SOCKET
230 typedef int ares_socket_t;
231 #define ARES_SOCKET_BAD -1
233 #define ares_socket_typedef
234 #endif /* ares_socket_typedef */
236 typedef void (*ares_sock_state_cb)(void *data,
237 ares_socket_t socket_fd,
243 /* NOTE about the ares_options struct to users and developers.
245 This struct will remain looking like this. It will not be extended nor
246 shrunk in future releases, but all new options will be set by ares_set_*()
247 options instead of with the ares_init_options() function.
249 Eventually (in a galaxy far far away), all options will be settable by
250 ares_set_*() options and the ares_init_options() function will become
253 When new options are added to c-ares, they are not added to this
254 struct. And they are not "saved" with the ares_save_options() function but
255 instead we encourage the use of the ares_dup() function. Needless to say,
256 if you add config options to c-ares you need to make sure ares_dup()
257 duplicates this new option.
260 struct ares_options {
262 int timeout; /* in seconds or milliseconds, depending on options */
265 unsigned short udp_port;
266 unsigned short tcp_port;
267 int socket_send_buffer_size;
268 int socket_receive_buffer_size;
269 struct in_addr *servers;
274 ares_sock_state_cb sock_state_cb;
275 void *sock_state_cb_data;
276 struct apattern *sortlist;
279 char *resolvconf_path;
285 struct ares_channeldata;
286 struct ares_addrinfo;
287 struct ares_addrinfo_hints;
289 typedef struct ares_channeldata *ares_channel;
291 typedef void (*ares_callback)(void *arg,
297 typedef void (*ares_host_callback)(void *arg,
300 struct hostent *hostent);
302 typedef void (*ares_nameinfo_callback)(void *arg,
308 typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd,
312 typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd,
316 typedef void (*ares_addrinfo_callback)(void *arg,
319 struct ares_addrinfo *res);
321 CARES_EXTERN int ares_library_init(int flags);
323 CARES_EXTERN int ares_library_init_mem(int flags,
324 void *(*amalloc)(size_t size),
325 void (*afree)(void *ptr),
326 void *(*arealloc)(void *ptr, size_t size));
328 #if defined(ANDROID) || defined(__ANDROID__)
329 CARES_EXTERN void ares_library_init_jvm(JavaVM *jvm);
330 CARES_EXTERN int ares_library_init_android(jobject connectivity_manager);
331 CARES_EXTERN int ares_library_android_initialized(void);
334 CARES_EXTERN int ares_library_initialized(void);
336 CARES_EXTERN void ares_library_cleanup(void);
338 CARES_EXTERN const char *ares_version(int *version);
340 CARES_EXTERN int ares_init(ares_channel *channelptr);
342 CARES_EXTERN int ares_init_options(ares_channel *channelptr,
343 struct ares_options *options,
346 CARES_EXTERN int ares_save_options(ares_channel channel,
347 struct ares_options *options,
350 CARES_EXTERN void ares_destroy_options(struct ares_options *options);
352 CARES_EXTERN int ares_dup(ares_channel *dest,
355 CARES_EXTERN void ares_destroy(ares_channel channel);
357 CARES_EXTERN void ares_cancel(ares_channel channel);
359 /* These next 3 configure local binding for the out-going socket
360 * connection. Use these to specify source IP and/or network device
361 * on multi-homed systems.
363 CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip);
365 /* local_ip6 should be 16 bytes in length */
366 CARES_EXTERN void ares_set_local_ip6(ares_channel channel,
367 const unsigned char* local_ip6);
369 /* local_dev_name should be null terminated. */
370 CARES_EXTERN void ares_set_local_dev(ares_channel channel,
371 const char* local_dev_name);
373 CARES_EXTERN void ares_set_socket_callback(ares_channel channel,
374 ares_sock_create_callback callback,
377 CARES_EXTERN void ares_set_socket_configure_callback(ares_channel channel,
378 ares_sock_config_callback callback,
381 CARES_EXTERN int ares_set_sortlist(ares_channel channel,
382 const char *sortstr);
384 CARES_EXTERN void ares_getaddrinfo(ares_channel channel,
387 const struct ares_addrinfo_hints* hints,
388 ares_addrinfo_callback callback,
391 CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai);
394 * Virtual function set to have user-managed socket IO.
395 * Note that all functions need to be defined, and when
396 * set, the library will not do any bind nor set any
397 * socket options, assuming the client handles these
398 * through either socket creation or the
399 * ares_sock_config_callback call.
402 struct ares_socket_functions {
403 ares_socket_t(*asocket)(int, int, int, void *);
404 int(*aclose)(ares_socket_t, void *);
405 int(*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t, void *);
406 ares_ssize_t(*arecvfrom)(ares_socket_t, void *, size_t, int, struct sockaddr *, ares_socklen_t *, void *);
407 ares_ssize_t(*asendv)(ares_socket_t, const struct iovec *, int, void *);
410 CARES_EXTERN void ares_set_socket_functions(ares_channel channel,
411 const struct ares_socket_functions * funcs,
414 CARES_EXTERN void ares_send(ares_channel channel,
415 const unsigned char *qbuf,
417 ares_callback callback,
420 CARES_EXTERN void ares_query(ares_channel channel,
424 ares_callback callback,
427 CARES_EXTERN void ares_search(ares_channel channel,
431 ares_callback callback,
434 CARES_EXTERN void ares_gethostbyname(ares_channel channel,
437 ares_host_callback callback,
440 CARES_EXTERN int ares_gethostbyname_file(ares_channel channel,
443 struct hostent **host);
445 CARES_EXTERN void ares_gethostbyaddr(ares_channel channel,
449 ares_host_callback callback,
452 CARES_EXTERN void ares_getnameinfo(ares_channel channel,
453 const struct sockaddr *sa,
454 ares_socklen_t salen,
456 ares_nameinfo_callback callback,
459 CARES_EXTERN int ares_fds(ares_channel channel,
463 CARES_EXTERN int ares_getsock(ares_channel channel,
464 ares_socket_t *socks,
467 CARES_EXTERN struct timeval *ares_timeout(ares_channel channel,
468 struct timeval *maxtv,
471 CARES_EXTERN void ares_process(ares_channel channel,
475 CARES_EXTERN void ares_process_fd(ares_channel channel,
476 ares_socket_t read_fd,
477 ares_socket_t write_fd);
479 CARES_EXTERN int ares_create_query(const char *name,
488 CARES_EXTERN int ares_mkquery(const char *name,
496 CARES_EXTERN int ares_expand_name(const unsigned char *encoded,
497 const unsigned char *abuf,
502 CARES_EXTERN int ares_expand_string(const unsigned char *encoded,
503 const unsigned char *abuf,
509 * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr
510 * struct below when ares itself was built, but many apps would use this
511 * private version since the header checked a HAVE_* define for it. Starting
512 * with 1.7.0 we always declare and use our own to stop relying on the
515 struct ares_in6_addr {
517 unsigned char _S6_u8[16];
521 struct ares_addrttl {
522 struct in_addr ipaddr;
526 struct ares_addr6ttl {
527 struct ares_in6_addr ip6addr;
531 struct ares_caa_reply {
532 struct ares_caa_reply *next;
534 unsigned char *property;
535 size_t plength; /* plength excludes null termination */
536 unsigned char *value;
537 size_t length; /* length excludes null termination */
540 struct ares_srv_reply {
541 struct ares_srv_reply *next;
543 unsigned short priority;
544 unsigned short weight;
548 struct ares_mx_reply {
549 struct ares_mx_reply *next;
551 unsigned short priority;
554 struct ares_txt_reply {
555 struct ares_txt_reply *next;
557 size_t length; /* length excludes null termination */
560 /* NOTE: This structure is a superset of ares_txt_reply
562 struct ares_txt_ext {
563 struct ares_txt_ext *next;
566 /* 1 - if start of new record
567 * 0 - if a chunk in the same record */
568 unsigned char record_start;
571 struct ares_naptr_reply {
572 struct ares_naptr_reply *next;
573 unsigned char *flags;
574 unsigned char *service;
575 unsigned char *regexp;
577 unsigned short order;
578 unsigned short preference;
581 struct ares_soa_reply {
585 unsigned int refresh;
592 * Similar to addrinfo, but with extra ttl and missing canonname.
594 struct ares_addrinfo_node {
600 ares_socklen_t ai_addrlen;
601 struct sockaddr *ai_addr;
602 struct ares_addrinfo_node *ai_next;
606 * alias - label of the resource record.
607 * name - value (canonical name) of the resource record.
608 * See RFC2181 10.1.1. CNAME terminology.
610 struct ares_addrinfo_cname {
614 struct ares_addrinfo_cname *next;
617 struct ares_addrinfo {
618 struct ares_addrinfo_cname *cnames;
619 struct ares_addrinfo_node *nodes;
622 struct ares_addrinfo_hints {
630 ** Parse the buffer, starting at *abuf and of length alen bytes, previously
631 ** obtained from an ares_search call. Put the results in *host, if nonnull.
632 ** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with
633 ** their TTLs in that array, and set *naddrttls to the number of addresses
637 CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf,
639 struct hostent **host,
640 struct ares_addrttl *addrttls,
643 CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf,
645 struct hostent **host,
646 struct ares_addr6ttl *addrttls,
649 CARES_EXTERN int ares_parse_caa_reply(const unsigned char* abuf,
651 struct ares_caa_reply** caa_out);
653 CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf,
658 struct hostent **host);
660 CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf,
662 struct hostent **host);
664 CARES_EXTERN int ares_parse_srv_reply(const unsigned char* abuf,
666 struct ares_srv_reply** srv_out);
668 CARES_EXTERN int ares_parse_mx_reply(const unsigned char* abuf,
670 struct ares_mx_reply** mx_out);
672 CARES_EXTERN int ares_parse_txt_reply(const unsigned char* abuf,
674 struct ares_txt_reply** txt_out);
676 CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char* abuf,
678 struct ares_txt_ext** txt_out);
680 CARES_EXTERN int ares_parse_naptr_reply(const unsigned char* abuf,
682 struct ares_naptr_reply** naptr_out);
684 CARES_EXTERN int ares_parse_soa_reply(const unsigned char* abuf,
686 struct ares_soa_reply** soa_out);
688 CARES_EXTERN void ares_free_string(void *str);
690 CARES_EXTERN void ares_free_hostent(struct hostent *host);
692 CARES_EXTERN void ares_free_data(void *dataptr);
694 CARES_EXTERN const char *ares_strerror(int code);
696 struct ares_addr_node {
697 struct ares_addr_node *next;
700 struct in_addr addr4;
701 struct ares_in6_addr addr6;
705 struct ares_addr_port_node {
706 struct ares_addr_port_node *next;
709 struct in_addr addr4;
710 struct ares_in6_addr addr6;
716 CARES_EXTERN int ares_set_servers(ares_channel channel,
717 struct ares_addr_node *servers);
718 CARES_EXTERN int ares_set_servers_ports(ares_channel channel,
719 struct ares_addr_port_node *servers);
721 /* Incomming string format: host[:port][,host[:port]]... */
722 CARES_EXTERN int ares_set_servers_csv(ares_channel channel,
723 const char* servers);
724 CARES_EXTERN int ares_set_servers_ports_csv(ares_channel channel,
725 const char* servers);
727 CARES_EXTERN int ares_get_servers(ares_channel channel,
728 struct ares_addr_node **servers);
729 CARES_EXTERN int ares_get_servers_ports(ares_channel channel,
730 struct ares_addr_port_node **servers);
732 CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst,
733 ares_socklen_t size);
735 CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst);