1 2 /* Copyright 1998 by the Massachusetts Institute of Technology. 3 * Copyright (C) 2007-2013 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) || defined(__ANDROID__) || defined(__OpenBSD__) || \ 42 defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) 43 #include <sys/select.h> 44 #endif 45 #if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) 46 #include <sys/bsdskt.h> 47 #endif 48 49 #if defined(WATT32) 50 # include <netinet/in.h> 51 # include <sys/socket.h> 52 # include <tcp.h> 53 #elif defined(_WIN32_WCE) 54 # ifndef WIN32_LEAN_AND_MEAN 55 # define WIN32_LEAN_AND_MEAN 56 # endif 57 # include <windows.h> 58 # include <winsock.h> 59 #elif defined(WIN32) 60 # ifndef WIN32_LEAN_AND_MEAN 61 # define WIN32_LEAN_AND_MEAN 62 # endif 63 # include <windows.h> 64 # include <winsock2.h> 65 # include <ws2tcpip.h> 66 #else 67 # include <sys/socket.h> 68 # include <netinet/in.h> 69 #endif 70 71 #if defined(ANDROID) || defined(__ANDROID__) 72 #include <jni.h> 73 #endif 74 75 #ifdef __cplusplus 76 extern "C" { 77 #endif 78 79 /* 80 ** c-ares external API function linkage decorations. 81 */ 82 83 #ifdef CARES_STATICLIB 84 # define CARES_EXTERN 85 #elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) 86 # if defined(CARES_BUILDING_LIBRARY) 87 # define CARES_EXTERN __declspec(dllexport) 88 # else 89 # define CARES_EXTERN __declspec(dllimport) 90 # endif 91 #elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING) 92 # define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN 93 #else 94 # define CARES_EXTERN 95 #endif 96 97 98 #define ARES_SUCCESS 0 99 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 107 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 115 #define ARES_EOF 13 116 #define ARES_EFILE 14 117 #define ARES_ENOMEM 15 118 #define ARES_EDESTRUCTION 16 119 #define ARES_EBADSTR 17 120 121 /* ares_getnameinfo error codes */ 122 #define ARES_EBADFLAGS 18 123 124 /* ares_getaddrinfo error codes */ 125 #define ARES_ENONAME 19 126 #define ARES_EBADHINTS 20 127 128 /* Uninitialized library error code */ 129 #define ARES_ENOTINITIALIZED 21 /* introduced in 1.7.0 */ 130 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 */ 134 135 /* More error codes */ 136 #define ARES_ECANCELLED 24 /* introduced in 1.7.0 */ 137 138 /* More ares_getaddrinfo error codes */ 139 #define ARES_ESERVICE 25 /* introduced in 1.?.0 */ 140 141 /* Flag values */ 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) 151 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) 171 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) 189 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) 205 206 #define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \ 207 ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \ 208 ARES_AI_ADDRCONFIG) 209 #define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this 210 many sockets */ 211 #define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) 212 #define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ 213 ARES_GETSOCK_MAXNUM))) 214 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) 219 220 221 /* 222 * Typedef our socket type 223 */ 224 225 #ifndef ares_socket_typedef 226 #ifdef WIN32 227 typedef SOCKET ares_socket_t; 228 #define ARES_SOCKET_BAD INVALID_SOCKET 229 #else 230 typedef int ares_socket_t; 231 #define ARES_SOCKET_BAD -1 232 #endif 233 #define ares_socket_typedef 234 #endif /* ares_socket_typedef */ 235 236 typedef void (*ares_sock_state_cb)(void *data, 237 ares_socket_t socket_fd, 238 int readable, 239 int writable); 240 241 struct apattern; 242 243 /* NOTE about the ares_options struct to users and developers. 244 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. 248 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 251 deprecated. 252 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. 258 259 */ 260 struct ares_options { 261 int flags; 262 int timeout; /* in seconds or milliseconds, depending on options */ 263 int tries; 264 int ndots; 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; 270 int nservers; 271 char **domains; 272 int ndomains; 273 char *lookups; 274 ares_sock_state_cb sock_state_cb; 275 void *sock_state_cb_data; 276 struct apattern *sortlist; 277 int nsort; 278 int ednspsz; 279 char *resolvconf_path; 280 }; 281 282 struct hostent; 283 struct timeval; 284 struct sockaddr; 285 struct ares_channeldata; 286 struct ares_addrinfo; 287 struct ares_addrinfo_hints; 288 289 typedef struct ares_channeldata *ares_channel; 290 291 typedef void (*ares_callback)(void *arg, 292 int status, 293 int timeouts, 294 unsigned char *abuf, 295 int alen); 296 297 typedef void (*ares_host_callback)(void *arg, 298 int status, 299 int timeouts, 300 struct hostent *hostent); 301 302 typedef void (*ares_nameinfo_callback)(void *arg, 303 int status, 304 int timeouts, 305 char *node, 306 char *service); 307 308 typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, 309 int type, 310 void *data); 311 312 typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, 313 int type, 314 void *data); 315 316 typedef void (*ares_addrinfo_callback)(void *arg, 317 int status, 318 int timeouts, 319 struct ares_addrinfo *res); 320 321 CARES_EXTERN int ares_library_init(int flags); 322 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)); 327 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); 332 #endif 333 334 CARES_EXTERN int ares_library_initialized(void); 335 336 CARES_EXTERN void ares_library_cleanup(void); 337 338 CARES_EXTERN const char *ares_version(int *version); 339 340 CARES_EXTERN int ares_init(ares_channel *channelptr); 341 342 CARES_EXTERN int ares_init_options(ares_channel *channelptr, 343 struct ares_options *options, 344 int optmask); 345 346 CARES_EXTERN int ares_save_options(ares_channel channel, 347 struct ares_options *options, 348 int *optmask); 349 350 CARES_EXTERN void ares_destroy_options(struct ares_options *options); 351 352 CARES_EXTERN int ares_dup(ares_channel *dest, 353 ares_channel src); 354 355 CARES_EXTERN void ares_destroy(ares_channel channel); 356 357 CARES_EXTERN void ares_cancel(ares_channel channel); 358 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. 362 */ 363 CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip); 364 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); 368 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); 372 373 CARES_EXTERN void ares_set_socket_callback(ares_channel channel, 374 ares_sock_create_callback callback, 375 void *user_data); 376 377 CARES_EXTERN void ares_set_socket_configure_callback(ares_channel channel, 378 ares_sock_config_callback callback, 379 void *user_data); 380 381 CARES_EXTERN int ares_set_sortlist(ares_channel channel, 382 const char *sortstr); 383 384 CARES_EXTERN void ares_getaddrinfo(ares_channel channel, 385 const char* node, 386 const char* service, 387 const struct ares_addrinfo_hints* hints, 388 ares_addrinfo_callback callback, 389 void* arg); 390 391 CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai); 392 393 /* 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. 400 */ 401 struct iovec; 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 *); 408 }; 409 410 CARES_EXTERN void ares_set_socket_functions(ares_channel channel, 411 const struct ares_socket_functions * funcs, 412 void *user_data); 413 414 CARES_EXTERN void ares_send(ares_channel channel, 415 const unsigned char *qbuf, 416 int qlen, 417 ares_callback callback, 418 void *arg); 419 420 CARES_EXTERN void ares_query(ares_channel channel, 421 const char *name, 422 int dnsclass, 423 int type, 424 ares_callback callback, 425 void *arg); 426 427 CARES_EXTERN void ares_search(ares_channel channel, 428 const char *name, 429 int dnsclass, 430 int type, 431 ares_callback callback, 432 void *arg); 433 434 CARES_EXTERN void ares_gethostbyname(ares_channel channel, 435 const char *name, 436 int family, 437 ares_host_callback callback, 438 void *arg); 439 440 CARES_EXTERN int ares_gethostbyname_file(ares_channel channel, 441 const char *name, 442 int family, 443 struct hostent **host); 444 445 CARES_EXTERN void ares_gethostbyaddr(ares_channel channel, 446 const void *addr, 447 int addrlen, 448 int family, 449 ares_host_callback callback, 450 void *arg); 451 452 CARES_EXTERN void ares_getnameinfo(ares_channel channel, 453 const struct sockaddr *sa, 454 ares_socklen_t salen, 455 int flags, 456 ares_nameinfo_callback callback, 457 void *arg); 458 459 CARES_EXTERN int ares_fds(ares_channel channel, 460 fd_set *read_fds, 461 fd_set *write_fds); 462 463 CARES_EXTERN int ares_getsock(ares_channel channel, 464 ares_socket_t *socks, 465 int numsocks); 466 467 CARES_EXTERN struct timeval *ares_timeout(ares_channel channel, 468 struct timeval *maxtv, 469 struct timeval *tv); 470 471 CARES_EXTERN void ares_process(ares_channel channel, 472 fd_set *read_fds, 473 fd_set *write_fds); 474 475 CARES_EXTERN void ares_process_fd(ares_channel channel, 476 ares_socket_t read_fd, 477 ares_socket_t write_fd); 478 479 CARES_EXTERN int ares_create_query(const char *name, 480 int dnsclass, 481 int type, 482 unsigned short id, 483 int rd, 484 unsigned char **buf, 485 int *buflen, 486 int max_udp_size); 487 488 CARES_EXTERN int ares_mkquery(const char *name, 489 int dnsclass, 490 int type, 491 unsigned short id, 492 int rd, 493 unsigned char **buf, 494 int *buflen); 495 496 CARES_EXTERN int ares_expand_name(const unsigned char *encoded, 497 const unsigned char *abuf, 498 int alen, 499 char **s, 500 long *enclen); 501 502 CARES_EXTERN int ares_expand_string(const unsigned char *encoded, 503 const unsigned char *abuf, 504 int alen, 505 unsigned char **s, 506 long *enclen); 507 508 /* 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 513 * system's one. 514 */ 515 struct ares_in6_addr { 516 union { 517 unsigned char _S6_u8[16]; 518 } _S6_un; 519 }; 520 521 struct ares_addrttl { 522 struct in_addr ipaddr; 523 int ttl; 524 }; 525 526 struct ares_addr6ttl { 527 struct ares_in6_addr ip6addr; 528 int ttl; 529 }; 530 531 struct ares_caa_reply { 532 struct ares_caa_reply *next; 533 int critical; 534 unsigned char *property; 535 size_t plength; /* plength excludes null termination */ 536 unsigned char *value; 537 size_t length; /* length excludes null termination */ 538 }; 539 540 struct ares_srv_reply { 541 struct ares_srv_reply *next; 542 char *host; 543 unsigned short priority; 544 unsigned short weight; 545 unsigned short port; 546 }; 547 548 struct ares_mx_reply { 549 struct ares_mx_reply *next; 550 char *host; 551 unsigned short priority; 552 }; 553 554 struct ares_txt_reply { 555 struct ares_txt_reply *next; 556 unsigned char *txt; 557 size_t length; /* length excludes null termination */ 558 }; 559 560 /* NOTE: This structure is a superset of ares_txt_reply 561 */ 562 struct ares_txt_ext { 563 struct ares_txt_ext *next; 564 unsigned char *txt; 565 size_t length; 566 /* 1 - if start of new record 567 * 0 - if a chunk in the same record */ 568 unsigned char record_start; 569 }; 570 571 struct ares_naptr_reply { 572 struct ares_naptr_reply *next; 573 unsigned char *flags; 574 unsigned char *service; 575 unsigned char *regexp; 576 char *replacement; 577 unsigned short order; 578 unsigned short preference; 579 }; 580 581 struct ares_soa_reply { 582 char *nsname; 583 char *hostmaster; 584 unsigned int serial; 585 unsigned int refresh; 586 unsigned int retry; 587 unsigned int expire; 588 unsigned int minttl; 589 }; 590 591 struct ares_uri_reply { 592 struct ares_uri_reply *next; 593 unsigned short priority; 594 unsigned short weight; 595 char *uri; 596 int ttl; 597 }; 598 599 /* 600 * Similar to addrinfo, but with extra ttl and missing canonname. 601 */ 602 struct ares_addrinfo_node { 603 int ai_ttl; 604 int ai_flags; 605 int ai_family; 606 int ai_socktype; 607 int ai_protocol; 608 ares_socklen_t ai_addrlen; 609 struct sockaddr *ai_addr; 610 struct ares_addrinfo_node *ai_next; 611 }; 612 613 /* 614 * alias - label of the resource record. 615 * name - value (canonical name) of the resource record. 616 * See RFC2181 10.1.1. CNAME terminology. 617 */ 618 struct ares_addrinfo_cname { 619 int ttl; 620 char *alias; 621 char *name; 622 struct ares_addrinfo_cname *next; 623 }; 624 625 struct ares_addrinfo { 626 struct ares_addrinfo_cname *cnames; 627 struct ares_addrinfo_node *nodes; 628 char *name; 629 }; 630 631 struct ares_addrinfo_hints { 632 int ai_flags; 633 int ai_family; 634 int ai_socktype; 635 int ai_protocol; 636 }; 637 638 /* 639 ** Parse the buffer, starting at *abuf and of length alen bytes, previously 640 ** obtained from an ares_search call. Put the results in *host, if nonnull. 641 ** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with 642 ** their TTLs in that array, and set *naddrttls to the number of addresses 643 ** so written. 644 */ 645 646 CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, 647 int alen, 648 struct hostent **host, 649 struct ares_addrttl *addrttls, 650 int *naddrttls); 651 652 CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, 653 int alen, 654 struct hostent **host, 655 struct ares_addr6ttl *addrttls, 656 int *naddrttls); 657 658 CARES_EXTERN int ares_parse_caa_reply(const unsigned char* abuf, 659 int alen, 660 struct ares_caa_reply** caa_out); 661 662 CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, 663 int alen, 664 const void *addr, 665 int addrlen, 666 int family, 667 struct hostent **host); 668 669 CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, 670 int alen, 671 struct hostent **host); 672 673 CARES_EXTERN int ares_parse_srv_reply(const unsigned char* abuf, 674 int alen, 675 struct ares_srv_reply** srv_out); 676 677 CARES_EXTERN int ares_parse_mx_reply(const unsigned char* abuf, 678 int alen, 679 struct ares_mx_reply** mx_out); 680 681 CARES_EXTERN int ares_parse_txt_reply(const unsigned char* abuf, 682 int alen, 683 struct ares_txt_reply** txt_out); 684 685 CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char* abuf, 686 int alen, 687 struct ares_txt_ext** txt_out); 688 689 CARES_EXTERN int ares_parse_naptr_reply(const unsigned char* abuf, 690 int alen, 691 struct ares_naptr_reply** naptr_out); 692 693 CARES_EXTERN int ares_parse_soa_reply(const unsigned char* abuf, 694 int alen, 695 struct ares_soa_reply** soa_out); 696 697 CARES_EXTERN int ares_parse_uri_reply(const unsigned char* abuf, 698 int alen, 699 struct ares_uri_reply** uri_out); 700 701 CARES_EXTERN void ares_free_string(void *str); 702 703 CARES_EXTERN void ares_free_hostent(struct hostent *host); 704 705 CARES_EXTERN void ares_free_data(void *dataptr); 706 707 CARES_EXTERN const char *ares_strerror(int code); 708 709 struct ares_addr_node { 710 struct ares_addr_node *next; 711 int family; 712 union { 713 struct in_addr addr4; 714 struct ares_in6_addr addr6; 715 } addr; 716 }; 717 718 struct ares_addr_port_node { 719 struct ares_addr_port_node *next; 720 int family; 721 union { 722 struct in_addr addr4; 723 struct ares_in6_addr addr6; 724 } addr; 725 int udp_port; 726 int tcp_port; 727 }; 728 729 CARES_EXTERN int ares_set_servers(ares_channel channel, 730 struct ares_addr_node *servers); 731 CARES_EXTERN int ares_set_servers_ports(ares_channel channel, 732 struct ares_addr_port_node *servers); 733 734 /* Incomming string format: host[:port][,host[:port]]... */ 735 CARES_EXTERN int ares_set_servers_csv(ares_channel channel, 736 const char* servers); 737 CARES_EXTERN int ares_set_servers_ports_csv(ares_channel channel, 738 const char* servers); 739 740 CARES_EXTERN int ares_get_servers(ares_channel channel, 741 struct ares_addr_node **servers); 742 CARES_EXTERN int ares_get_servers_ports(ares_channel channel, 743 struct ares_addr_port_node **servers); 744 745 CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, 746 ares_socklen_t size); 747 748 CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst); 749 750 751 #ifdef __cplusplus 752 } 753 #endif 754 755 #endif /* ARES__H */ 756