1
2/* Copyright 1998, 2009 by the Massachusetts Institute of Technology.
3 * Copyright (C) 2007-2011 by Daniel Stenberg
4 *
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.
16 */
17
18#ifndef ARES__H
19#define ARES__H
20
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 */
24
25/*
26 * Define WIN32 when build target is Win32 API
27 */
28
29#if (defined(_WIN32) || defined(__WIN32__)) && \
30   !defined(WIN32) && !defined(__SYMBIAN32__)
31#  define WIN32
32#endif
33
34#include <sys/types.h>
35
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
38   require it! */
39#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
40    defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
41    defined(__ANDROID__)
42#include <sys/select.h>
43#endif
44#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
45#include <sys/bsdskt.h>
46#endif
47
48#if defined(WATT32)
49#  include <netinet/in.h>
50#  include <sys/socket.h>
51#  include <tcp.h>
52#elif defined(_WIN32_WCE)
53#  ifndef WIN32_LEAN_AND_MEAN
54#    define WIN32_LEAN_AND_MEAN
55#  endif
56#  include <windows.h>
57#  include <winsock.h>
58#elif defined(WIN32)
59#  ifndef WIN32_LEAN_AND_MEAN
60#    define WIN32_LEAN_AND_MEAN
61#  endif
62#  include <windows.h>
63#  include <winsock2.h>
64#  include <ws2tcpip.h>
65#else
66#  include <sys/socket.h>
67#  include <netinet/in.h>
68#endif
69
70#ifdef  __cplusplus
71extern "C" {
72#endif
73
74/*
75** c-ares external API function linkage decorations.
76*/
77
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)
83#  else
84#    define CARES_EXTERN  __declspec(dllimport)
85#  endif
86#else
87   /* visibility function decoration for other cases */
88#  if !defined(CARES_SYMBOL_HIDING) || \
89     defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)
90#    define CARES_EXTERN
91#  else
92#    define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN
93#  endif
94#endif
95
96
97#define ARES_SUCCESS            0
98
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
106
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
114#define ARES_EOF                13
115#define ARES_EFILE              14
116#define ARES_ENOMEM             15
117#define ARES_EDESTRUCTION       16
118#define ARES_EBADSTR            17
119
120/* ares_getnameinfo error codes */
121#define ARES_EBADFLAGS          18
122
123/* ares_getaddrinfo error codes */
124#define ARES_ENONAME            19
125#define ARES_EBADHINTS          20
126
127/* Uninitialized library error code */
128#define ARES_ENOTINITIALIZED    21          /* introduced in 1.7.0 */
129
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 */
133
134/* More error codes */
135#define ARES_ECANCELLED         24          /* introduced in 1.7.0 */
136
137/* Flag values */
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
147/* Option mask values */
148#define ARES_OPT_FLAGS          (1 << 0)
149#define ARES_OPT_TIMEOUT        (1 << 1)
150#define ARES_OPT_TRIES          (1 << 2)
151#define ARES_OPT_NDOTS          (1 << 3)
152#define ARES_OPT_UDP_PORT       (1 << 4)
153#define ARES_OPT_TCP_PORT       (1 << 5)
154#define ARES_OPT_SERVERS        (1 << 6)
155#define ARES_OPT_DOMAINS        (1 << 7)
156#define ARES_OPT_LOOKUPS        (1 << 8)
157#define ARES_OPT_SOCK_STATE_CB  (1 << 9)
158#define ARES_OPT_SORTLIST       (1 << 10)
159#define ARES_OPT_SOCK_SNDBUF    (1 << 11)
160#define ARES_OPT_SOCK_RCVBUF    (1 << 12)
161#define ARES_OPT_TIMEOUTMS      (1 << 13)
162#define ARES_OPT_ROTATE         (1 << 14)
163
164/* Nameinfo flag values */
165#define ARES_NI_NOFQDN                  (1 << 0)
166#define ARES_NI_NUMERICHOST             (1 << 1)
167#define ARES_NI_NAMEREQD                (1 << 2)
168#define ARES_NI_NUMERICSERV             (1 << 3)
169#define ARES_NI_DGRAM                   (1 << 4)
170#define ARES_NI_TCP                     0
171#define ARES_NI_UDP                     ARES_NI_DGRAM
172#define ARES_NI_SCTP                    (1 << 5)
173#define ARES_NI_DCCP                    (1 << 6)
174#define ARES_NI_NUMERICSCOPE            (1 << 7)
175#define ARES_NI_LOOKUPHOST              (1 << 8)
176#define ARES_NI_LOOKUPSERVICE           (1 << 9)
177/* Reserved for future use */
178#define ARES_NI_IDN                     (1 << 10)
179#define ARES_NI_IDN_ALLOW_UNASSIGNED    (1 << 11)
180#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12)
181
182/* Addrinfo flag values */
183#define ARES_AI_CANONNAME               (1 << 0)
184#define ARES_AI_NUMERICHOST             (1 << 1)
185#define ARES_AI_PASSIVE                 (1 << 2)
186#define ARES_AI_NUMERICSERV             (1 << 3)
187#define ARES_AI_V4MAPPED                (1 << 4)
188#define ARES_AI_ALL                     (1 << 5)
189#define ARES_AI_ADDRCONFIG              (1 << 6)
190/* Reserved for future use */
191#define ARES_AI_IDN                     (1 << 10)
192#define ARES_AI_IDN_ALLOW_UNASSIGNED    (1 << 11)
193#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12)
194#define ARES_AI_CANONIDN                (1 << 13)
195
196#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \
197                      ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \
198                      ARES_AI_ADDRCONFIG)
199#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this
200                                  many sockets */
201#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num)))
202#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
203                                         ARES_GETSOCK_MAXNUM)))
204
205/* c-ares library initialization flag values */
206#define ARES_LIB_INIT_NONE   (0)
207#define ARES_LIB_INIT_WIN32  (1 << 0)
208#define ARES_LIB_INIT_ALL    (ARES_LIB_INIT_WIN32)
209
210
211/*
212 * Typedef our socket type
213 */
214
215#ifndef ares_socket_typedef
216#ifdef WIN32
217typedef SOCKET ares_socket_t;
218#define ARES_SOCKET_BAD INVALID_SOCKET
219#else
220typedef int ares_socket_t;
221#define ARES_SOCKET_BAD -1
222#endif
223#define ares_socket_typedef
224#endif /* ares_socket_typedef */
225
226typedef void (*ares_sock_state_cb)(void *data,
227                                   ares_socket_t socket_fd,
228                                   int readable,
229                                   int writable);
230
231struct apattern;
232
233/* NOTE about the ares_options struct to users and developers.
234
235   This struct will remain looking like this. It will not be extended nor
236   shrunk in future releases, but all new options will be set by ares_set_*()
237   options instead of with the ares_init_options() function.
238
239   Eventually (in a galaxy far far away), all options will be settable by
240   ares_set_*() options and the ares_init_options() function will become
241   deprecated.
242
243   When new options are added to c-ares, they are not added to this
244   struct. And they are not "saved" with the ares_save_options() function but
245   instead we encourage the use of the ares_dup() function. Needless to say,
246   if you add config options to c-ares you need to make sure ares_dup()
247   duplicates this new option.
248
249 */
250struct ares_options {
251  int flags;
252  int timeout; /* in seconds or milliseconds, depending on options */
253  int tries;
254  int ndots;
255  unsigned short udp_port;
256  unsigned short tcp_port;
257  int socket_send_buffer_size;
258  int socket_receive_buffer_size;
259  struct in_addr *servers;
260  int nservers;
261  char **domains;
262  int ndomains;
263  char *lookups;
264  ares_sock_state_cb sock_state_cb;
265  void *sock_state_cb_data;
266  struct apattern *sortlist;
267  int nsort;
268};
269
270struct hostent;
271struct timeval;
272struct sockaddr;
273struct ares_channeldata;
274
275typedef struct ares_channeldata *ares_channel;
276
277typedef void (*ares_callback)(void *arg,
278                              int status,
279                              int timeouts,
280                              unsigned char *abuf,
281                              int alen);
282
283typedef void (*ares_host_callback)(void *arg,
284                                   int status,
285                                   int timeouts,
286                                   struct hostent *hostent);
287
288typedef void (*ares_nameinfo_callback)(void *arg,
289                                       int status,
290                                       int timeouts,
291                                       char *node,
292                                       char *service);
293
294typedef int  (*ares_sock_create_callback)(ares_socket_t socket_fd,
295                                          int type,
296                                          void *data);
297
298CARES_EXTERN int ares_library_init(int flags);
299
300CARES_EXTERN void ares_library_cleanup(void);
301
302CARES_EXTERN const char *ares_version(int *version);
303
304CARES_EXTERN int ares_init(ares_channel *channelptr);
305
306CARES_EXTERN int ares_init_options(ares_channel *channelptr,
307                                   struct ares_options *options,
308                                   int optmask);
309
310CARES_EXTERN int ares_save_options(ares_channel channel,
311                                   struct ares_options *options,
312                                   int *optmask);
313
314CARES_EXTERN void ares_destroy_options(struct ares_options *options);
315
316CARES_EXTERN int ares_dup(ares_channel *dest,
317                          ares_channel src);
318
319CARES_EXTERN void ares_destroy(ares_channel channel);
320
321CARES_EXTERN void ares_cancel(ares_channel channel);
322
323/* These next 3 configure local binding for the out-going socket
324 * connection.  Use these to specify source IP and/or network device
325 * on multi-homed systems.
326 */
327CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip);
328
329/* local_ip6 should be 16 bytes in length */
330CARES_EXTERN void ares_set_local_ip6(ares_channel channel,
331                                     const unsigned char* local_ip6);
332
333/* local_dev_name should be null terminated. */
334CARES_EXTERN void ares_set_local_dev(ares_channel channel,
335                                     const char* local_dev_name);
336
337CARES_EXTERN void ares_set_socket_callback(ares_channel channel,
338                                           ares_sock_create_callback callback,
339                                           void *user_data);
340
341CARES_EXTERN void ares_send(ares_channel channel,
342                            const unsigned char *qbuf,
343                            int qlen,
344                            ares_callback callback,
345                            void *arg);
346
347CARES_EXTERN void ares_query(ares_channel channel,
348                             const char *name,
349                             int dnsclass,
350                             int type,
351                             ares_callback callback,
352                             void *arg);
353
354CARES_EXTERN void ares_search(ares_channel channel,
355                              const char *name,
356                              int dnsclass,
357                              int type,
358                              ares_callback callback,
359                              void *arg);
360
361CARES_EXTERN void ares_gethostbyname(ares_channel channel,
362                                     const char *name,
363                                     int family,
364                                     ares_host_callback callback,
365                                     void *arg);
366
367CARES_EXTERN int ares_gethostbyname_file(ares_channel channel,
368                                         const char *name,
369                                         int family,
370                                         struct hostent **host);
371
372CARES_EXTERN void ares_gethostbyaddr(ares_channel channel,
373                                     const void *addr,
374                                     int addrlen,
375                                     int family,
376                                     ares_host_callback callback,
377                                     void *arg);
378
379CARES_EXTERN void ares_getnameinfo(ares_channel channel,
380                                   const struct sockaddr *sa,
381                                   ares_socklen_t salen,
382                                   int flags,
383                                   ares_nameinfo_callback callback,
384                                   void *arg);
385
386CARES_EXTERN int ares_fds(ares_channel channel,
387                          fd_set *read_fds,
388                          fd_set *write_fds);
389
390CARES_EXTERN int ares_getsock(ares_channel channel,
391                              ares_socket_t *socks,
392                              int numsocks);
393
394CARES_EXTERN struct timeval *ares_timeout(ares_channel channel,
395                                          struct timeval *maxtv,
396                                          struct timeval *tv);
397
398CARES_EXTERN void ares_process(ares_channel channel,
399                               fd_set *read_fds,
400                               fd_set *write_fds);
401
402CARES_EXTERN void ares_process_fd(ares_channel channel,
403                                  ares_socket_t read_fd,
404                                  ares_socket_t write_fd);
405
406CARES_EXTERN int ares_mkquery(const char *name,
407                              int dnsclass,
408                              int type,
409                              unsigned short id,
410                              int rd,
411                              unsigned char **buf,
412                              int *buflen);
413
414CARES_EXTERN int ares_expand_name(const unsigned char *encoded,
415                                  const unsigned char *abuf,
416                                  int alen,
417                                  char **s,
418                                  long *enclen);
419
420CARES_EXTERN int ares_expand_string(const unsigned char *encoded,
421                                    const unsigned char *abuf,
422                                    int alen,
423                                    unsigned char **s,
424                                    long *enclen);
425
426/*
427 * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr
428 * struct below when ares itself was built, but many apps would use this
429 * private version since the header checked a HAVE_* define for it. Starting
430 * with 1.7.0 we always declare and use our own to stop relying on the
431 * system's one.
432 */
433struct ares_in6_addr {
434  union {
435    unsigned char _S6_u8[16];
436  } _S6_un;
437};
438
439struct ares_addrttl {
440  struct in_addr ipaddr;
441  int            ttl;
442};
443
444struct ares_addr6ttl {
445  struct ares_in6_addr ip6addr;
446  int             ttl;
447};
448
449struct ares_srv_reply {
450  struct ares_srv_reply  *next;
451  char                   *host;
452  unsigned short          priority;
453  unsigned short          weight;
454  unsigned short          port;
455};
456
457struct ares_mx_reply {
458  struct ares_mx_reply   *next;
459  char                   *host;
460  unsigned short          priority;
461};
462
463struct ares_txt_reply {
464  struct ares_txt_reply  *next;
465  unsigned char          *txt;
466  size_t                  length;  /* length excludes null termination */
467};
468
469/*
470** Parse the buffer, starting at *abuf and of length alen bytes, previously
471** obtained from an ares_search call.  Put the results in *host, if nonnull.
472** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with
473** their TTLs in that array, and set *naddrttls to the number of addresses
474** so written.
475*/
476
477CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf,
478                                    int alen,
479                                    struct hostent **host,
480                                    struct ares_addrttl *addrttls,
481                                    int *naddrttls);
482
483CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf,
484                                       int alen,
485                                       struct hostent **host,
486                                       struct ares_addr6ttl *addrttls,
487                                       int *naddrttls);
488
489CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf,
490                                      int alen,
491                                      const void *addr,
492                                      int addrlen,
493                                      int family,
494                                      struct hostent **host);
495
496CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf,
497                                     int alen,
498                                     struct hostent **host);
499
500CARES_EXTERN int ares_parse_srv_reply(const unsigned char* abuf,
501                                      int alen,
502                                      struct ares_srv_reply** srv_out);
503
504CARES_EXTERN int ares_parse_mx_reply(const unsigned char* abuf,
505                                      int alen,
506                                      struct ares_mx_reply** mx_out);
507
508CARES_EXTERN int ares_parse_txt_reply(const unsigned char* abuf,
509                                      int alen,
510                                      struct ares_txt_reply** txt_out);
511
512CARES_EXTERN void ares_free_string(void *str);
513
514CARES_EXTERN void ares_free_hostent(struct hostent *host);
515
516CARES_EXTERN void ares_free_data(void *dataptr);
517
518CARES_EXTERN const char *ares_strerror(int code);
519
520/* TODO:  Hold port here as well. */
521struct ares_addr_node {
522  struct ares_addr_node *next;
523  int family;
524  union {
525    struct in_addr       addr4;
526    struct ares_in6_addr addr6;
527  } addr;
528};
529
530CARES_EXTERN int ares_set_servers(ares_channel channel,
531                                  struct ares_addr_node *servers);
532
533/* Incomming string format: host[:port][,host[:port]]... */
534CARES_EXTERN int ares_set_servers_csv(ares_channel channel,
535                                      const char* servers);
536
537CARES_EXTERN int ares_get_servers(ares_channel channel,
538                                  struct ares_addr_node **servers);
539
540#ifdef  __cplusplus
541}
542#endif
543
544#endif /* ARES__H */
545