xref: /third_party/node/deps/cares/include/ares.h (revision 1cb0ef41)
1/* MIT License
2 *
3 * Copyright (c) Massachusetts Institute of Technology
4 * Copyright (c) Daniel Stenberg
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 * SPDX-License-Identifier: MIT
26 */
27
28#ifndef ARES__H
29#define ARES__H
30
31#include "ares_version.h" /* c-ares version defines   */
32#include "ares_build.h"   /* c-ares build definitions */
33#include "ares_rules.h"   /* c-ares rules enforcement */
34
35/*
36 * Define WIN32 when build target is Win32 API
37 */
38
39#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \
40  !defined(__SYMBIAN32__)
41#  define WIN32
42#endif
43
44#include <sys/types.h>
45
46/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
47   libc5-based Linux systems. Only include it on system that are known to
48   require it! */
49#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
50  defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
51  defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) ||   \
52  defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__)
53#  include <sys/select.h>
54#endif
55#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
56#  include <sys/bsdskt.h>
57#endif
58
59#if defined(WATT32)
60#  include <netinet/in.h>
61#  include <sys/socket.h>
62#  include <tcp.h>
63#elif defined(_WIN32_WCE)
64#  ifndef WIN32_LEAN_AND_MEAN
65#    define WIN32_LEAN_AND_MEAN
66#  endif
67#  include <windows.h>
68#  include <winsock.h>
69#elif defined(WIN32)
70#  ifndef WIN32_LEAN_AND_MEAN
71#    define WIN32_LEAN_AND_MEAN
72#  endif
73#  include <windows.h>
74#  include <winsock2.h>
75#  include <ws2tcpip.h>
76/* To aid with linking against a static c-ares build, lets tell the microsoft
77 * compiler to pull in needed dependencies */
78#  ifdef _MSC_VER
79#    pragma comment(lib, "ws2_32")
80#    pragma comment(lib, "advapi32")
81#    pragma comment(lib, "iphlpapi")
82#  endif
83#else
84#  include <sys/socket.h>
85#  include <netinet/in.h>
86#endif
87
88#if defined(ANDROID) || defined(__ANDROID__)
89#  include <jni.h>
90#endif
91
92#ifdef __cplusplus
93extern "C" {
94#endif
95
96/*
97** c-ares external API function linkage decorations.
98*/
99
100#if defined(_WIN32) || defined(__CYGWIN__) || defined(__SYMBIAN32__)
101#  ifdef CARES_STATICLIB
102#    define CARES_EXTERN
103#  else
104#    ifdef CARES_BUILDING_LIBRARY
105#      define CARES_EXTERN __declspec(dllexport)
106#    else
107#      define CARES_EXTERN __declspec(dllimport)
108#    endif
109#  endif
110#else
111#  if defined(__GNUC__) && __GNUC__ >= 4
112#    define CARES_EXTERN __attribute__((visibility("default")))
113#  elif defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 900
114#    define CARES_EXTERN __attribute__((visibility("default")))
115#  elif defined(__SUNPRO_C)
116#    define CARES_EXTERN _global
117#  else
118#    define CARES_EXTERN
119#  endif
120#endif
121
122typedef enum {
123  ARES_SUCCESS = 0,
124
125  /* Server error codes (ARES_ENODATA indicates no relevant answer) */
126  ARES_ENODATA   = 1,
127  ARES_EFORMERR  = 2,
128  ARES_ESERVFAIL = 3,
129  ARES_ENOTFOUND = 4,
130  ARES_ENOTIMP   = 5,
131  ARES_EREFUSED  = 6,
132
133  /* Locally generated error codes */
134  ARES_EBADQUERY    = 7,
135  ARES_EBADNAME     = 8,
136  ARES_EBADFAMILY   = 9,
137  ARES_EBADRESP     = 10,
138  ARES_ECONNREFUSED = 11,
139  ARES_ETIMEOUT     = 12,
140  ARES_EOF          = 13,
141  ARES_EFILE        = 14,
142  ARES_ENOMEM       = 15,
143  ARES_EDESTRUCTION = 16,
144  ARES_EBADSTR      = 17,
145
146  /* ares_getnameinfo error codes */
147  ARES_EBADFLAGS = 18,
148
149  /* ares_getaddrinfo error codes */
150  ARES_ENONAME   = 19,
151  ARES_EBADHINTS = 20,
152
153  /* Uninitialized library error code */
154  ARES_ENOTINITIALIZED = 21, /* introduced in 1.7.0 */
155
156  /* ares_library_init error codes */
157  ARES_ELOADIPHLPAPI         = 22, /* introduced in 1.7.0 */
158  ARES_EADDRGETNETWORKPARAMS = 23, /* introduced in 1.7.0 */
159
160  /* More error codes */
161  ARES_ECANCELLED = 24, /* introduced in 1.7.0 */
162
163  /* More ares_getaddrinfo error codes */
164  ARES_ESERVICE = 25, /* ares_getaddrinfo() was passed a text service name that
165                       * is not recognized. introduced in 1.16.0 */
166
167  ARES_ENOSERVER = 26 /* No DNS servers were configured */
168} ares_status_t;
169
170typedef enum {
171  ARES_FALSE = 0,
172  ARES_TRUE  = 1
173} ares_bool_t;
174
175/*! Values for ARES_OPT_EVENT_THREAD */
176typedef enum {
177  /*! Default (best choice) event system */
178  ARES_EVSYS_DEFAULT = 0,
179  /*! Win32 IOCP/AFD_POLL event system */
180  ARES_EVSYS_WIN32 = 1,
181  /*! Linux epoll */
182  ARES_EVSYS_EPOLL = 2,
183  /*! BSD/MacOS kqueue */
184  ARES_EVSYS_KQUEUE = 3,
185  /*! POSIX poll() */
186  ARES_EVSYS_POLL = 4,
187  /*! last fallback on Unix-like systems, select() */
188  ARES_EVSYS_SELECT = 5
189} ares_evsys_t;
190
191/* Flag values */
192#define ARES_FLAG_USEVC       (1 << 0)
193#define ARES_FLAG_PRIMARY     (1 << 1)
194#define ARES_FLAG_IGNTC       (1 << 2)
195#define ARES_FLAG_NORECURSE   (1 << 3)
196#define ARES_FLAG_STAYOPEN    (1 << 4)
197#define ARES_FLAG_NOSEARCH    (1 << 5)
198#define ARES_FLAG_NOALIASES   (1 << 6)
199#define ARES_FLAG_NOCHECKRESP (1 << 7)
200#define ARES_FLAG_EDNS        (1 << 8)
201#define ARES_FLAG_NO_DFLT_SVR (1 << 9)
202
203/* Option mask values */
204#define ARES_OPT_FLAGS           (1 << 0)
205#define ARES_OPT_TIMEOUT         (1 << 1)
206#define ARES_OPT_TRIES           (1 << 2)
207#define ARES_OPT_NDOTS           (1 << 3)
208#define ARES_OPT_UDP_PORT        (1 << 4)
209#define ARES_OPT_TCP_PORT        (1 << 5)
210#define ARES_OPT_SERVERS         (1 << 6)
211#define ARES_OPT_DOMAINS         (1 << 7)
212#define ARES_OPT_LOOKUPS         (1 << 8)
213#define ARES_OPT_SOCK_STATE_CB   (1 << 9)
214#define ARES_OPT_SORTLIST        (1 << 10)
215#define ARES_OPT_SOCK_SNDBUF     (1 << 11)
216#define ARES_OPT_SOCK_RCVBUF     (1 << 12)
217#define ARES_OPT_TIMEOUTMS       (1 << 13)
218#define ARES_OPT_ROTATE          (1 << 14)
219#define ARES_OPT_EDNSPSZ         (1 << 15)
220#define ARES_OPT_NOROTATE        (1 << 16)
221#define ARES_OPT_RESOLVCONF      (1 << 17)
222#define ARES_OPT_HOSTS_FILE      (1 << 18)
223#define ARES_OPT_UDP_MAX_QUERIES (1 << 19)
224#define ARES_OPT_MAXTIMEOUTMS    (1 << 20)
225#define ARES_OPT_QUERY_CACHE     (1 << 21)
226#define ARES_OPT_EVENT_THREAD    (1 << 22)
227
228/* Nameinfo flag values */
229#define ARES_NI_NOFQDN        (1 << 0)
230#define ARES_NI_NUMERICHOST   (1 << 1)
231#define ARES_NI_NAMEREQD      (1 << 2)
232#define ARES_NI_NUMERICSERV   (1 << 3)
233#define ARES_NI_DGRAM         (1 << 4)
234#define ARES_NI_TCP           0
235#define ARES_NI_UDP           ARES_NI_DGRAM
236#define ARES_NI_SCTP          (1 << 5)
237#define ARES_NI_DCCP          (1 << 6)
238#define ARES_NI_NUMERICSCOPE  (1 << 7)
239#define ARES_NI_LOOKUPHOST    (1 << 8)
240#define ARES_NI_LOOKUPSERVICE (1 << 9)
241/* Reserved for future use */
242#define ARES_NI_IDN                      (1 << 10)
243#define ARES_NI_IDN_ALLOW_UNASSIGNED     (1 << 11)
244#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12)
245
246/* Addrinfo flag values */
247#define ARES_AI_CANONNAME   (1 << 0)
248#define ARES_AI_NUMERICHOST (1 << 1)
249#define ARES_AI_PASSIVE     (1 << 2)
250#define ARES_AI_NUMERICSERV (1 << 3)
251#define ARES_AI_V4MAPPED    (1 << 4)
252#define ARES_AI_ALL         (1 << 5)
253#define ARES_AI_ADDRCONFIG  (1 << 6)
254#define ARES_AI_NOSORT      (1 << 7)
255#define ARES_AI_ENVHOSTS    (1 << 8)
256/* Reserved for future use */
257#define ARES_AI_IDN                      (1 << 10)
258#define ARES_AI_IDN_ALLOW_UNASSIGNED     (1 << 11)
259#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12)
260#define ARES_AI_CANONIDN                 (1 << 13)
261
262#define ARES_AI_MASK                                           \
263  (ARES_AI_CANONNAME | ARES_AI_NUMERICHOST | ARES_AI_PASSIVE | \
264   ARES_AI_NUMERICSERV | ARES_AI_V4MAPPED | ARES_AI_ALL | ARES_AI_ADDRCONFIG)
265#define ARES_GETSOCK_MAXNUM                       \
266  16 /* ares_getsock() can return info about this \
267        many sockets */
268#define ARES_GETSOCK_READABLE(bits, num) (bits & (1 << (num)))
269#define ARES_GETSOCK_WRITABLE(bits, num) \
270  (bits & (1 << ((num) + ARES_GETSOCK_MAXNUM)))
271
272/* c-ares library initialization flag values */
273#define ARES_LIB_INIT_NONE  (0)
274#define ARES_LIB_INIT_WIN32 (1 << 0)
275#define ARES_LIB_INIT_ALL   (ARES_LIB_INIT_WIN32)
276
277
278/*
279 * Typedef our socket type
280 */
281
282#ifndef ares_socket_typedef
283#  ifdef WIN32
284typedef SOCKET ares_socket_t;
285#    define ARES_SOCKET_BAD INVALID_SOCKET
286#  else
287typedef int ares_socket_t;
288#    define ARES_SOCKET_BAD -1
289#  endif
290#  define ares_socket_typedef
291#endif /* ares_socket_typedef */
292
293typedef void (*ares_sock_state_cb)(void *data, ares_socket_t socket_fd,
294                                   int readable, int writable);
295
296struct apattern;
297
298/* NOTE about the ares_options struct to users and developers.
299
300   This struct will remain looking like this. It will not be extended nor
301   shrunk in future releases, but all new options will be set by ares_set_*()
302   options instead of with the ares_init_options() function.
303
304   Eventually (in a galaxy far far away), all options will be settable by
305   ares_set_*() options and the ares_init_options() function will become
306   deprecated.
307
308   When new options are added to c-ares, they are not added to this
309   struct. And they are not "saved" with the ares_save_options() function but
310   instead we encourage the use of the ares_dup() function. Needless to say,
311   if you add config options to c-ares you need to make sure ares_dup()
312   duplicates this new option.
313
314 */
315struct ares_options {
316  int            flags;
317  int            timeout; /* in seconds or milliseconds, depending on options */
318  int            tries;
319  int            ndots;
320  unsigned short udp_port; /* host byte order */
321  unsigned short tcp_port; /* host byte order */
322  int            socket_send_buffer_size;
323  int            socket_receive_buffer_size;
324  struct in_addr    *servers;
325  int                nservers;
326  char             **domains;
327  int                ndomains;
328  char              *lookups;
329  ares_sock_state_cb sock_state_cb;
330  void              *sock_state_cb_data;
331  struct apattern   *sortlist;
332  int                nsort;
333  int                ednspsz;
334  char              *resolvconf_path;
335  char              *hosts_path;
336  int                udp_max_queries;
337  int                maxtimeout; /* in milliseconds */
338  unsigned int qcache_max_ttl;   /* Maximum TTL for query cache, 0=disabled */
339  ares_evsys_t evsys;
340};
341
342struct hostent;
343struct timeval;
344struct sockaddr;
345struct ares_channeldata;
346struct ares_addrinfo;
347struct ares_addrinfo_hints;
348
349/* Legacy typedef, don't use, you can't specify "const" */
350typedef struct ares_channeldata *ares_channel;
351
352/* Current main channel typedef */
353typedef struct ares_channeldata  ares_channel_t;
354
355
356typedef void     (*ares_callback)(void *arg, int status, int timeouts,
357                              unsigned char *abuf, int alen);
358
359typedef void     (*ares_host_callback)(void *arg, int status, int timeouts,
360                                   struct hostent *hostent);
361
362typedef void     (*ares_nameinfo_callback)(void *arg, int status, int timeouts,
363                                       char *node, char *service);
364
365typedef int      (*ares_sock_create_callback)(ares_socket_t socket_fd, int type,
366                                         void *data);
367
368typedef int      (*ares_sock_config_callback)(ares_socket_t socket_fd, int type,
369                                         void *data);
370
371typedef void     (*ares_addrinfo_callback)(void *arg, int status, int timeouts,
372                                       struct ares_addrinfo *res);
373
374CARES_EXTERN int ares_library_init(int flags);
375
376CARES_EXTERN int ares_library_init_mem(int flags, void *(*amalloc)(size_t size),
377                                       void  (*afree)(void *ptr),
378                                       void *(*arealloc)(void  *ptr,
379                                                         size_t size));
380
381#if defined(ANDROID) || defined(__ANDROID__)
382CARES_EXTERN void ares_library_init_jvm(JavaVM *jvm);
383CARES_EXTERN int  ares_library_init_android(jobject connectivity_manager);
384CARES_EXTERN int  ares_library_android_initialized(void);
385#endif
386
387CARES_EXTERN int           ares_library_initialized(void);
388
389CARES_EXTERN void          ares_library_cleanup(void);
390
391CARES_EXTERN const char   *ares_version(int *version);
392
393CARES_EXTERN int           ares_init(ares_channel_t **channelptr);
394
395CARES_EXTERN int           ares_init_options(ares_channel_t           **channelptr,
396                                             const struct ares_options *options,
397                                             int                        optmask);
398
399CARES_EXTERN int           ares_save_options(ares_channel_t      *channel,
400                                             struct ares_options *options, int *optmask);
401
402CARES_EXTERN void          ares_destroy_options(struct ares_options *options);
403
404CARES_EXTERN int           ares_dup(ares_channel_t **dest, ares_channel_t *src);
405
406CARES_EXTERN ares_status_t ares_reinit(ares_channel_t *channel);
407
408CARES_EXTERN void          ares_destroy(ares_channel_t *channel);
409
410CARES_EXTERN void          ares_cancel(ares_channel_t *channel);
411
412/* These next 3 configure local binding for the out-going socket
413 * connection.  Use these to specify source IP and/or network device
414 * on multi-homed systems.
415 */
416CARES_EXTERN void          ares_set_local_ip4(ares_channel_t *channel,
417                                              unsigned int    local_ip);
418
419/* local_ip6 should be 16 bytes in length */
420CARES_EXTERN void          ares_set_local_ip6(ares_channel_t      *channel,
421                                              const unsigned char *local_ip6);
422
423/* local_dev_name should be null terminated. */
424CARES_EXTERN void          ares_set_local_dev(ares_channel_t *channel,
425                                              const char     *local_dev_name);
426
427CARES_EXTERN void          ares_set_socket_callback(ares_channel_t           *channel,
428                                                    ares_sock_create_callback callback,
429                                                    void                     *user_data);
430
431CARES_EXTERN void          ares_set_socket_configure_callback(
432           ares_channel_t *channel, ares_sock_config_callback callback, void *user_data);
433
434CARES_EXTERN int  ares_set_sortlist(ares_channel_t *channel,
435                                    const char     *sortstr);
436
437CARES_EXTERN void ares_getaddrinfo(ares_channel_t *channel, const char *node,
438                                   const char                       *service,
439                                   const struct ares_addrinfo_hints *hints,
440                                   ares_addrinfo_callback callback, void *arg);
441
442CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo *ai);
443
444/*
445 * Virtual function set to have user-managed socket IO.
446 * Note that all functions need to be defined, and when
447 * set, the library will not do any bind nor set any
448 * socket options, assuming the client handles these
449 * through either socket creation or the
450 * ares_sock_config_callback call.
451 */
452struct iovec;
453
454struct ares_socket_functions {
455  ares_socket_t (*asocket)(int, int, int, void *);
456  int           (*aclose)(ares_socket_t, void *);
457  int (*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t,
458                  void *);
459  ares_ssize_t (*arecvfrom)(ares_socket_t, void *, size_t, int,
460                            struct sockaddr *, ares_socklen_t *, void *);
461  ares_ssize_t (*asendv)(ares_socket_t, const struct iovec *, int, void *);
462};
463
464CARES_EXTERN void
465                  ares_set_socket_functions(ares_channel_t                     *channel,
466                                            const struct ares_socket_functions *funcs,
467                                            void                               *user_data);
468
469CARES_EXTERN void ares_send(ares_channel_t *channel, const unsigned char *qbuf,
470                            int qlen, ares_callback callback, void *arg);
471
472CARES_EXTERN void ares_query(ares_channel_t *channel, const char *name,
473                             int dnsclass, int type, ares_callback callback,
474                             void *arg);
475
476CARES_EXTERN void ares_search(ares_channel_t *channel, const char *name,
477                              int dnsclass, int type, ares_callback callback,
478                              void *arg);
479
480CARES_EXTERN void ares_gethostbyname(ares_channel_t *channel, const char *name,
481                                     int family, ares_host_callback callback,
482                                     void *arg);
483
484CARES_EXTERN int  ares_gethostbyname_file(ares_channel_t *channel,
485                                          const char *name, int family,
486                                          struct hostent **host);
487
488CARES_EXTERN void ares_gethostbyaddr(ares_channel_t *channel, const void *addr,
489                                     int addrlen, int family,
490                                     ares_host_callback callback, void *arg);
491
492CARES_EXTERN void ares_getnameinfo(ares_channel_t        *channel,
493                                   const struct sockaddr *sa,
494                                   ares_socklen_t salen, int flags,
495                                   ares_nameinfo_callback callback, void *arg);
496
497CARES_EXTERN int  ares_fds(ares_channel_t *channel, fd_set *read_fds,
498                           fd_set *write_fds);
499
500CARES_EXTERN int  ares_getsock(ares_channel_t *channel, ares_socket_t *socks,
501                               int numsocks);
502
503CARES_EXTERN struct timeval *ares_timeout(ares_channel_t *channel,
504                                          struct timeval *maxtv,
505                                          struct timeval *tv);
506
507CARES_EXTERN void ares_process(ares_channel_t *channel, fd_set *read_fds,
508                               fd_set *write_fds);
509
510CARES_EXTERN void ares_process_fd(ares_channel_t *channel,
511                                  ares_socket_t   read_fd,
512                                  ares_socket_t   write_fd);
513
514CARES_EXTERN int  ares_create_query(const char *name, int dnsclass, int type,
515                                    unsigned short id, int rd,
516                                    unsigned char **buf, int *buflen,
517                                    int max_udp_size);
518
519CARES_EXTERN int  ares_mkquery(const char *name, int dnsclass, int type,
520                               unsigned short id, int rd, unsigned char **buf,
521                               int *buflen);
522
523CARES_EXTERN int  ares_expand_name(const unsigned char *encoded,
524                                   const unsigned char *abuf, int alen, char **s,
525                                   long *enclen);
526
527CARES_EXTERN int  ares_expand_string(const unsigned char *encoded,
528                                     const unsigned char *abuf, int alen,
529                                     unsigned char **s, long *enclen);
530
531/*
532 * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr
533 * struct below when ares itself was built, but many apps would use this
534 * private version since the header checked a HAVE_* define for it. Starting
535 * with 1.7.0 we always declare and use our own to stop relying on the
536 * system's one.
537 */
538struct ares_in6_addr {
539  union {
540    unsigned char _S6_u8[16];
541  } _S6_un;
542};
543
544struct ares_addr {
545  int family;
546
547  union {
548    struct in_addr       addr4;
549    struct ares_in6_addr addr6;
550  } addr;
551};
552
553struct ares_addrttl {
554  struct in_addr ipaddr;
555  int            ttl;
556};
557
558struct ares_addr6ttl {
559  struct ares_in6_addr ip6addr;
560  int                  ttl;
561};
562
563struct ares_caa_reply {
564  struct ares_caa_reply *next;
565  int                    critical;
566  unsigned char         *property;
567  size_t                 plength; /* plength excludes null termination */
568  unsigned char         *value;
569  size_t                 length;  /* length excludes null termination */
570};
571
572struct ares_srv_reply {
573  struct ares_srv_reply *next;
574  char                  *host;
575  unsigned short         priority;
576  unsigned short         weight;
577  unsigned short         port;
578};
579
580struct ares_mx_reply {
581  struct ares_mx_reply *next;
582  char                 *host;
583  unsigned short        priority;
584};
585
586struct ares_txt_reply {
587  struct ares_txt_reply *next;
588  unsigned char         *txt;
589  size_t                 length; /* length excludes null termination */
590};
591
592/* NOTE: This structure is a superset of ares_txt_reply
593 */
594struct ares_txt_ext {
595  struct ares_txt_ext *next;
596  unsigned char       *txt;
597  size_t               length;
598  /* 1 - if start of new record
599   * 0 - if a chunk in the same record */
600  unsigned char        record_start;
601};
602
603struct ares_naptr_reply {
604  struct ares_naptr_reply *next;
605  unsigned char           *flags;
606  unsigned char           *service;
607  unsigned char           *regexp;
608  char                    *replacement;
609  unsigned short           order;
610  unsigned short           preference;
611};
612
613struct ares_soa_reply {
614  char        *nsname;
615  char        *hostmaster;
616  unsigned int serial;
617  unsigned int refresh;
618  unsigned int retry;
619  unsigned int expire;
620  unsigned int minttl;
621};
622
623struct ares_uri_reply {
624  struct ares_uri_reply *next;
625  unsigned short         priority;
626  unsigned short         weight;
627  char                  *uri;
628  int                    ttl;
629};
630
631/*
632 * Similar to addrinfo, but with extra ttl and missing canonname.
633 */
634struct ares_addrinfo_node {
635  int                        ai_ttl;
636  int                        ai_flags;
637  int                        ai_family;
638  int                        ai_socktype;
639  int                        ai_protocol;
640  ares_socklen_t             ai_addrlen;
641  struct sockaddr           *ai_addr;
642  struct ares_addrinfo_node *ai_next;
643};
644
645/*
646 * alias - label of the resource record.
647 * name - value (canonical name) of the resource record.
648 * See RFC2181 10.1.1. CNAME terminology.
649 */
650struct ares_addrinfo_cname {
651  int                         ttl;
652  char                       *alias;
653  char                       *name;
654  struct ares_addrinfo_cname *next;
655};
656
657struct ares_addrinfo {
658  struct ares_addrinfo_cname *cnames;
659  struct ares_addrinfo_node  *nodes;
660  char                       *name;
661};
662
663struct ares_addrinfo_hints {
664  int ai_flags;
665  int ai_family;
666  int ai_socktype;
667  int ai_protocol;
668};
669
670/*
671** Parse the buffer, starting at *abuf and of length alen bytes, previously
672** obtained from an ares_search call.  Put the results in *host, if nonnull.
673** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with
674** their TTLs in that array, and set *naddrttls to the number of addresses
675** so written.
676*/
677
678CARES_EXTERN int  ares_parse_a_reply(const unsigned char *abuf, int alen,
679                                     struct hostent     **host,
680                                     struct ares_addrttl *addrttls,
681                                     int                 *naddrttls);
682
683CARES_EXTERN int  ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
684                                        struct hostent      **host,
685                                        struct ares_addr6ttl *addrttls,
686                                        int                  *naddrttls);
687
688CARES_EXTERN int  ares_parse_caa_reply(const unsigned char *abuf, int alen,
689                                       struct ares_caa_reply **caa_out);
690
691CARES_EXTERN int  ares_parse_ptr_reply(const unsigned char *abuf, int alen,
692                                       const void *addr, int addrlen, int family,
693                                       struct hostent **host);
694
695CARES_EXTERN int  ares_parse_ns_reply(const unsigned char *abuf, int alen,
696                                      struct hostent **host);
697
698CARES_EXTERN int  ares_parse_srv_reply(const unsigned char *abuf, int alen,
699                                       struct ares_srv_reply **srv_out);
700
701CARES_EXTERN int  ares_parse_mx_reply(const unsigned char *abuf, int alen,
702                                      struct ares_mx_reply **mx_out);
703
704CARES_EXTERN int  ares_parse_txt_reply(const unsigned char *abuf, int alen,
705                                       struct ares_txt_reply **txt_out);
706
707CARES_EXTERN int  ares_parse_txt_reply_ext(const unsigned char *abuf, int alen,
708                                           struct ares_txt_ext **txt_out);
709
710CARES_EXTERN int  ares_parse_naptr_reply(const unsigned char *abuf, int alen,
711                                         struct ares_naptr_reply **naptr_out);
712
713CARES_EXTERN int  ares_parse_soa_reply(const unsigned char *abuf, int alen,
714                                       struct ares_soa_reply **soa_out);
715
716CARES_EXTERN int  ares_parse_uri_reply(const unsigned char *abuf, int alen,
717                                       struct ares_uri_reply **uri_out);
718
719CARES_EXTERN void ares_free_string(void *str);
720
721CARES_EXTERN void ares_free_hostent(struct hostent *host);
722
723CARES_EXTERN void ares_free_data(void *dataptr);
724
725CARES_EXTERN const char *ares_strerror(int code);
726
727struct ares_addr_node {
728  struct ares_addr_node *next;
729  int                    family;
730
731  union {
732    struct in_addr       addr4;
733    struct ares_in6_addr addr6;
734  } addr;
735};
736
737struct ares_addr_port_node {
738  struct ares_addr_port_node *next;
739  int                         family;
740
741  union {
742    struct in_addr       addr4;
743    struct ares_in6_addr addr6;
744  } addr;
745
746  int udp_port;
747  int tcp_port;
748};
749
750CARES_EXTERN int ares_set_servers(ares_channel_t              *channel,
751                                  const struct ares_addr_node *servers);
752CARES_EXTERN int
753                           ares_set_servers_ports(ares_channel_t                   *channel,
754                                                  const struct ares_addr_port_node *servers);
755
756/* Incoming string format: host[:port][,host[:port]]... */
757CARES_EXTERN int           ares_set_servers_csv(ares_channel_t *channel,
758                                                const char     *servers);
759CARES_EXTERN int           ares_set_servers_ports_csv(ares_channel_t *channel,
760                                                      const char     *servers);
761CARES_EXTERN char         *ares_get_servers_csv(ares_channel_t *channel);
762
763CARES_EXTERN int           ares_get_servers(ares_channel_t         *channel,
764                                            struct ares_addr_node **servers);
765CARES_EXTERN int           ares_get_servers_ports(ares_channel_t              *channel,
766                                                  struct ares_addr_port_node **servers);
767
768CARES_EXTERN const char   *ares_inet_ntop(int af, const void *src, char *dst,
769                                          ares_socklen_t size);
770
771CARES_EXTERN int           ares_inet_pton(int af, const char *src, void *dst);
772
773/*! Whether or not the c-ares library was built with threadsafety
774 *
775 *  \return ARES_TRUE if built with threadsafety, ARES_FALSE if not
776 */
777CARES_EXTERN ares_bool_t   ares_threadsafety(void);
778
779
780/*! Block until notified that there are no longer any queries in queue, or
781 *  the specified timeout has expired.
782 *
783 *  \param[in] channel    Initialized ares channel
784 *  \param[in] timeout_ms Number of milliseconds to wait for the queue to be
785 *                        empty. -1 for Infinite.
786 *  \return ARES_ENOTIMP if not built with threading support, ARES_ETIMEOUT
787 *          if requested timeout expires, ARES_SUCCESS when queue is empty.
788 */
789CARES_EXTERN ares_status_t ares_queue_wait_empty(ares_channel_t *channel,
790                                                 int             timeout_ms);
791
792
793/*! Retrieve the total number of active queries pending answers from servers.
794 *  Some c-ares requests may spawn multiple queries, such as ares_getaddrinfo()
795 *  when using AF_UNSPEC, which will be reflected in this number.
796 *
797 *  \param[in] channel Initialized ares channel
798 *  \return Number of active queries to servers
799 */
800CARES_EXTERN size_t        ares_queue_active_queries(ares_channel_t *channel);
801
802#ifdef __cplusplus
803}
804#endif
805
806/* DNS record parser, writer, and helpers */
807#include "ares_dns_record.h"
808
809#endif /* ARES__H */
810