1*663afb9bSAndroid Build Coastguard Worker /* 2*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2006-2007 Niels Provos <[email protected]> 3*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson 4*663afb9bSAndroid Build Coastguard Worker * 5*663afb9bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*663afb9bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*663afb9bSAndroid Build Coastguard Worker * are met: 8*663afb9bSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 9*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*663afb9bSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 11*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 12*663afb9bSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 13*663afb9bSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products 14*663afb9bSAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*663afb9bSAndroid Build Coastguard Worker * 16*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17*663afb9bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*663afb9bSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*663afb9bSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20*663afb9bSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21*663afb9bSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*663afb9bSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*663afb9bSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*663afb9bSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*663afb9bSAndroid Build Coastguard Worker */ 27*663afb9bSAndroid Build Coastguard Worker 28*663afb9bSAndroid Build Coastguard Worker /* 29*663afb9bSAndroid Build Coastguard Worker * The original DNS code is due to Adam Langley with heavy 30*663afb9bSAndroid Build Coastguard Worker * modifications by Nick Mathewson. Adam put his DNS software in the 31*663afb9bSAndroid Build Coastguard Worker * public domain. You can find his original copyright below. Please, 32*663afb9bSAndroid Build Coastguard Worker * aware that the code as part of Libevent is governed by the 3-clause 33*663afb9bSAndroid Build Coastguard Worker * BSD license above. 34*663afb9bSAndroid Build Coastguard Worker * 35*663afb9bSAndroid Build Coastguard Worker * This software is Public Domain. To view a copy of the public domain dedication, 36*663afb9bSAndroid Build Coastguard Worker * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to 37*663afb9bSAndroid Build Coastguard Worker * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. 38*663afb9bSAndroid Build Coastguard Worker * 39*663afb9bSAndroid Build Coastguard Worker * I ask and expect, but do not require, that all derivative works contain an 40*663afb9bSAndroid Build Coastguard Worker * attribution similar to: 41*663afb9bSAndroid Build Coastguard Worker * Parts developed by Adam Langley <[email protected]> 42*663afb9bSAndroid Build Coastguard Worker * 43*663afb9bSAndroid Build Coastguard Worker * You may wish to replace the word "Parts" with something else depending on 44*663afb9bSAndroid Build Coastguard Worker * the amount of original code. 45*663afb9bSAndroid Build Coastguard Worker * 46*663afb9bSAndroid Build Coastguard Worker * (Derivative works does not include programs which link against, run or include 47*663afb9bSAndroid Build Coastguard Worker * the source verbatim in their source distributions) 48*663afb9bSAndroid Build Coastguard Worker */ 49*663afb9bSAndroid Build Coastguard Worker 50*663afb9bSAndroid Build Coastguard Worker /** @file event2/dns.h 51*663afb9bSAndroid Build Coastguard Worker * 52*663afb9bSAndroid Build Coastguard Worker * Welcome, gentle reader 53*663afb9bSAndroid Build Coastguard Worker * 54*663afb9bSAndroid Build Coastguard Worker * Async DNS lookups are really a whole lot harder than they should be, 55*663afb9bSAndroid Build Coastguard Worker * mostly stemming from the fact that the libc resolver has never been 56*663afb9bSAndroid Build Coastguard Worker * very good at them. Before you use this library you should see if libc 57*663afb9bSAndroid Build Coastguard Worker * can do the job for you with the modern async call getaddrinfo_a 58*663afb9bSAndroid Build Coastguard Worker * (see http://www.imperialviolet.org/page25.html#e498). Otherwise, 59*663afb9bSAndroid Build Coastguard Worker * please continue. 60*663afb9bSAndroid Build Coastguard Worker * 61*663afb9bSAndroid Build Coastguard Worker * The library keeps track of the state of nameservers and will avoid 62*663afb9bSAndroid Build Coastguard Worker * them when they go down. Otherwise it will round robin between them. 63*663afb9bSAndroid Build Coastguard Worker * 64*663afb9bSAndroid Build Coastguard Worker * Quick start guide: 65*663afb9bSAndroid Build Coastguard Worker * #include "evdns.h" 66*663afb9bSAndroid Build Coastguard Worker * void callback(int result, char type, int count, int ttl, 67*663afb9bSAndroid Build Coastguard Worker * void *addresses, void *arg); 68*663afb9bSAndroid Build Coastguard Worker * evdns_resolv_conf_parse(DNS_OPTIONS_ALL, "/etc/resolv.conf"); 69*663afb9bSAndroid Build Coastguard Worker * evdns_resolve("www.hostname.com", 0, callback, NULL); 70*663afb9bSAndroid Build Coastguard Worker * 71*663afb9bSAndroid Build Coastguard Worker * When the lookup is complete the callback function is called. The 72*663afb9bSAndroid Build Coastguard Worker * first argument will be one of the DNS_ERR_* defines in evdns.h. 73*663afb9bSAndroid Build Coastguard Worker * Hopefully it will be DNS_ERR_NONE, in which case type will be 74*663afb9bSAndroid Build Coastguard Worker * DNS_IPv4_A, count will be the number of IP addresses, ttl is the time 75*663afb9bSAndroid Build Coastguard Worker * which the data can be cached for (in seconds), addresses will point 76*663afb9bSAndroid Build Coastguard Worker * to an array of uint32_t's and arg will be whatever you passed to 77*663afb9bSAndroid Build Coastguard Worker * evdns_resolve. 78*663afb9bSAndroid Build Coastguard Worker * 79*663afb9bSAndroid Build Coastguard Worker * Searching: 80*663afb9bSAndroid Build Coastguard Worker * 81*663afb9bSAndroid Build Coastguard Worker * In order for this library to be a good replacement for glibc's resolver it 82*663afb9bSAndroid Build Coastguard Worker * supports searching. This involves setting a list of default domains, in 83*663afb9bSAndroid Build Coastguard Worker * which names will be queried for. The number of dots in the query name 84*663afb9bSAndroid Build Coastguard Worker * determines the order in which this list is used. 85*663afb9bSAndroid Build Coastguard Worker * 86*663afb9bSAndroid Build Coastguard Worker * Searching appears to be a single lookup from the point of view of the API, 87*663afb9bSAndroid Build Coastguard Worker * although many DNS queries may be generated from a single call to 88*663afb9bSAndroid Build Coastguard Worker * evdns_resolve. Searching can also drastically slow down the resolution 89*663afb9bSAndroid Build Coastguard Worker * of names. 90*663afb9bSAndroid Build Coastguard Worker * 91*663afb9bSAndroid Build Coastguard Worker * To disable searching: 92*663afb9bSAndroid Build Coastguard Worker * 1. Never set it up. If you never call evdns_resolv_conf_parse or 93*663afb9bSAndroid Build Coastguard Worker * evdns_search_add then no searching will occur. 94*663afb9bSAndroid Build Coastguard Worker * 95*663afb9bSAndroid Build Coastguard Worker * 2. If you do call evdns_resolv_conf_parse then don't pass 96*663afb9bSAndroid Build Coastguard Worker * DNS_OPTION_SEARCH (or DNS_OPTIONS_ALL, which implies it). 97*663afb9bSAndroid Build Coastguard Worker * 98*663afb9bSAndroid Build Coastguard Worker * 3. When calling evdns_resolve, pass the DNS_QUERY_NO_SEARCH flag. 99*663afb9bSAndroid Build Coastguard Worker * 100*663afb9bSAndroid Build Coastguard Worker * The order of searches depends on the number of dots in the name. If the 101*663afb9bSAndroid Build Coastguard Worker * number is greater than the ndots setting then the names is first tried 102*663afb9bSAndroid Build Coastguard Worker * globally. Otherwise each search domain is appended in turn. 103*663afb9bSAndroid Build Coastguard Worker * 104*663afb9bSAndroid Build Coastguard Worker * The ndots setting can either be set from a resolv.conf, or by calling 105*663afb9bSAndroid Build Coastguard Worker * evdns_search_ndots_set. 106*663afb9bSAndroid Build Coastguard Worker * 107*663afb9bSAndroid Build Coastguard Worker * For example, with ndots set to 1 (the default) and a search domain list of 108*663afb9bSAndroid Build Coastguard Worker * ["myhome.net"]: 109*663afb9bSAndroid Build Coastguard Worker * Query: www 110*663afb9bSAndroid Build Coastguard Worker * Order: www.myhome.net, www. 111*663afb9bSAndroid Build Coastguard Worker * 112*663afb9bSAndroid Build Coastguard Worker * Query: www.abc 113*663afb9bSAndroid Build Coastguard Worker * Order: www.abc., www.abc.myhome.net 114*663afb9bSAndroid Build Coastguard Worker * 115*663afb9bSAndroid Build Coastguard Worker * Internals: 116*663afb9bSAndroid Build Coastguard Worker * 117*663afb9bSAndroid Build Coastguard Worker * Requests are kept in two queues. The first is the inflight queue. In 118*663afb9bSAndroid Build Coastguard Worker * this queue requests have an allocated transaction id and nameserver. 119*663afb9bSAndroid Build Coastguard Worker * They will soon be transmitted if they haven't already been. 120*663afb9bSAndroid Build Coastguard Worker * 121*663afb9bSAndroid Build Coastguard Worker * The second is the waiting queue. The size of the inflight ring is 122*663afb9bSAndroid Build Coastguard Worker * limited and all other requests wait in waiting queue for space. This 123*663afb9bSAndroid Build Coastguard Worker * bounds the number of concurrent requests so that we don't flood the 124*663afb9bSAndroid Build Coastguard Worker * nameserver. Several algorithms require a full walk of the inflight 125*663afb9bSAndroid Build Coastguard Worker * queue and so bounding its size keeps thing going nicely under huge 126*663afb9bSAndroid Build Coastguard Worker * (many thousands of requests) loads. 127*663afb9bSAndroid Build Coastguard Worker * 128*663afb9bSAndroid Build Coastguard Worker * If a nameserver loses too many requests it is considered down and we 129*663afb9bSAndroid Build Coastguard Worker * try not to use it. After a while we send a probe to that nameserver 130*663afb9bSAndroid Build Coastguard Worker * (a lookup for google.com) and, if it replies, we consider it working 131*663afb9bSAndroid Build Coastguard Worker * again. If the nameserver fails a probe we wait longer to try again 132*663afb9bSAndroid Build Coastguard Worker * with the next probe. 133*663afb9bSAndroid Build Coastguard Worker */ 134*663afb9bSAndroid Build Coastguard Worker 135*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT2_DNS_H_INCLUDED_ 136*663afb9bSAndroid Build Coastguard Worker #define EVENT2_DNS_H_INCLUDED_ 137*663afb9bSAndroid Build Coastguard Worker 138*663afb9bSAndroid Build Coastguard Worker #include <event2/visibility.h> 139*663afb9bSAndroid Build Coastguard Worker 140*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 141*663afb9bSAndroid Build Coastguard Worker extern "C" { 142*663afb9bSAndroid Build Coastguard Worker #endif 143*663afb9bSAndroid Build Coastguard Worker 144*663afb9bSAndroid Build Coastguard Worker /* For integer types. */ 145*663afb9bSAndroid Build Coastguard Worker #include <event2/util.h> 146*663afb9bSAndroid Build Coastguard Worker 147*663afb9bSAndroid Build Coastguard Worker /** Error codes 0-5 are as described in RFC 1035. */ 148*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_NONE 0 149*663afb9bSAndroid Build Coastguard Worker /** The name server was unable to interpret the query */ 150*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_FORMAT 1 151*663afb9bSAndroid Build Coastguard Worker /** The name server was unable to process this query due to a problem with the 152*663afb9bSAndroid Build Coastguard Worker * name server */ 153*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_SERVERFAILED 2 154*663afb9bSAndroid Build Coastguard Worker /** The domain name does not exist */ 155*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_NOTEXIST 3 156*663afb9bSAndroid Build Coastguard Worker /** The name server does not support the requested kind of query */ 157*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_NOTIMPL 4 158*663afb9bSAndroid Build Coastguard Worker /** The name server refuses to reform the specified operation for policy 159*663afb9bSAndroid Build Coastguard Worker * reasons */ 160*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_REFUSED 5 161*663afb9bSAndroid Build Coastguard Worker /** The reply was truncated or ill-formatted */ 162*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_TRUNCATED 65 163*663afb9bSAndroid Build Coastguard Worker /** An unknown error occurred */ 164*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_UNKNOWN 66 165*663afb9bSAndroid Build Coastguard Worker /** Communication with the server timed out */ 166*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_TIMEOUT 67 167*663afb9bSAndroid Build Coastguard Worker /** The request was canceled because the DNS subsystem was shut down. */ 168*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_SHUTDOWN 68 169*663afb9bSAndroid Build Coastguard Worker /** The request was canceled via a call to evdns_cancel_request */ 170*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_CANCEL 69 171*663afb9bSAndroid Build Coastguard Worker /** There were no answers and no error condition in the DNS packet. 172*663afb9bSAndroid Build Coastguard Worker * This can happen when you ask for an address that exists, but a record 173*663afb9bSAndroid Build Coastguard Worker * type that doesn't. */ 174*663afb9bSAndroid Build Coastguard Worker #define DNS_ERR_NODATA 70 175*663afb9bSAndroid Build Coastguard Worker 176*663afb9bSAndroid Build Coastguard Worker #define DNS_IPv4_A 1 177*663afb9bSAndroid Build Coastguard Worker #define DNS_PTR 2 178*663afb9bSAndroid Build Coastguard Worker #define DNS_IPv6_AAAA 3 179*663afb9bSAndroid Build Coastguard Worker 180*663afb9bSAndroid Build Coastguard Worker #define DNS_QUERY_NO_SEARCH 1 181*663afb9bSAndroid Build Coastguard Worker 182*663afb9bSAndroid Build Coastguard Worker /* Allow searching */ 183*663afb9bSAndroid Build Coastguard Worker #define DNS_OPTION_SEARCH 1 184*663afb9bSAndroid Build Coastguard Worker /* Parse "nameserver" and add default if no such section */ 185*663afb9bSAndroid Build Coastguard Worker #define DNS_OPTION_NAMESERVERS 2 186*663afb9bSAndroid Build Coastguard Worker /* Parse additional options like: 187*663afb9bSAndroid Build Coastguard Worker * - timeout: 188*663afb9bSAndroid Build Coastguard Worker * - getaddrinfo-allow-skew: 189*663afb9bSAndroid Build Coastguard Worker * - max-timeouts: 190*663afb9bSAndroid Build Coastguard Worker * - max-inflight: 191*663afb9bSAndroid Build Coastguard Worker * - attempts: 192*663afb9bSAndroid Build Coastguard Worker * - randomize-case: 193*663afb9bSAndroid Build Coastguard Worker * - initial-probe-timeout: 194*663afb9bSAndroid Build Coastguard Worker */ 195*663afb9bSAndroid Build Coastguard Worker #define DNS_OPTION_MISC 4 196*663afb9bSAndroid Build Coastguard Worker /* Load hosts file (i.e. "/etc/hosts") */ 197*663afb9bSAndroid Build Coastguard Worker #define DNS_OPTION_HOSTSFILE 8 198*663afb9bSAndroid Build Coastguard Worker /** 199*663afb9bSAndroid Build Coastguard Worker * All above: 200*663afb9bSAndroid Build Coastguard Worker * - DNS_OPTION_SEARCH 201*663afb9bSAndroid Build Coastguard Worker * - DNS_OPTION_NAMESERVERS 202*663afb9bSAndroid Build Coastguard Worker * - DNS_OPTION_MISC 203*663afb9bSAndroid Build Coastguard Worker * - DNS_OPTION_HOSTSFILE 204*663afb9bSAndroid Build Coastguard Worker */ 205*663afb9bSAndroid Build Coastguard Worker #define DNS_OPTIONS_ALL ( \ 206*663afb9bSAndroid Build Coastguard Worker DNS_OPTION_SEARCH | \ 207*663afb9bSAndroid Build Coastguard Worker DNS_OPTION_NAMESERVERS | \ 208*663afb9bSAndroid Build Coastguard Worker DNS_OPTION_MISC | \ 209*663afb9bSAndroid Build Coastguard Worker DNS_OPTION_HOSTSFILE | \ 210*663afb9bSAndroid Build Coastguard Worker 0 \ 211*663afb9bSAndroid Build Coastguard Worker ) 212*663afb9bSAndroid Build Coastguard Worker /* Do not "default" nameserver (i.e. "127.0.0.1:53") if there is no nameservers 213*663afb9bSAndroid Build Coastguard Worker * in resolv.conf, (iff DNS_OPTION_NAMESERVERS is set) */ 214*663afb9bSAndroid Build Coastguard Worker #define DNS_OPTION_NAMESERVERS_NO_DEFAULT 16 215*663afb9bSAndroid Build Coastguard Worker 216*663afb9bSAndroid Build Coastguard Worker /* Obsolete name for DNS_QUERY_NO_SEARCH */ 217*663afb9bSAndroid Build Coastguard Worker #define DNS_NO_SEARCH DNS_QUERY_NO_SEARCH 218*663afb9bSAndroid Build Coastguard Worker 219*663afb9bSAndroid Build Coastguard Worker /** 220*663afb9bSAndroid Build Coastguard Worker * The callback that contains the results from a lookup. 221*663afb9bSAndroid Build Coastguard Worker * - result is one of the DNS_ERR_* values (DNS_ERR_NONE for success) 222*663afb9bSAndroid Build Coastguard Worker * - type is either DNS_IPv4_A or DNS_PTR or DNS_IPv6_AAAA 223*663afb9bSAndroid Build Coastguard Worker * - count contains the number of addresses of form type 224*663afb9bSAndroid Build Coastguard Worker * - ttl is the number of seconds the resolution may be cached for. 225*663afb9bSAndroid Build Coastguard Worker * - addresses needs to be cast according to type. It will be an array of 226*663afb9bSAndroid Build Coastguard Worker * 4-byte sequences for ipv4, or an array of 16-byte sequences for ipv6, 227*663afb9bSAndroid Build Coastguard Worker * or a nul-terminated string for PTR. 228*663afb9bSAndroid Build Coastguard Worker */ 229*663afb9bSAndroid Build Coastguard Worker typedef void (*evdns_callback_type) (int result, char type, int count, int ttl, void *addresses, void *arg); 230*663afb9bSAndroid Build Coastguard Worker 231*663afb9bSAndroid Build Coastguard Worker struct evdns_base; 232*663afb9bSAndroid Build Coastguard Worker struct event_base; 233*663afb9bSAndroid Build Coastguard Worker 234*663afb9bSAndroid Build Coastguard Worker /** Flag for evdns_base_new: process resolv.conf. */ 235*663afb9bSAndroid Build Coastguard Worker #define EVDNS_BASE_INITIALIZE_NAMESERVERS 1 236*663afb9bSAndroid Build Coastguard Worker /** Flag for evdns_base_new: Do not prevent the libevent event loop from 237*663afb9bSAndroid Build Coastguard Worker * exiting when we have no active dns requests. */ 238*663afb9bSAndroid Build Coastguard Worker #define EVDNS_BASE_DISABLE_WHEN_INACTIVE 0x8000 239*663afb9bSAndroid Build Coastguard Worker /** Flag for evdns_base_new: If EVDNS_BASE_INITIALIZE_NAMESERVERS isset, do not 240*663afb9bSAndroid Build Coastguard Worker * add default nameserver if there are no nameservers in resolv.conf 241*663afb9bSAndroid Build Coastguard Worker * @see DNS_OPTION_NAMESERVERS_NO_DEFAULT */ 242*663afb9bSAndroid Build Coastguard Worker #define EVDNS_BASE_NAMESERVERS_NO_DEFAULT 0x10000 243*663afb9bSAndroid Build Coastguard Worker 244*663afb9bSAndroid Build Coastguard Worker /** 245*663afb9bSAndroid Build Coastguard Worker Initialize the asynchronous DNS library. 246*663afb9bSAndroid Build Coastguard Worker 247*663afb9bSAndroid Build Coastguard Worker This function initializes support for non-blocking name resolution by 248*663afb9bSAndroid Build Coastguard Worker calling evdns_resolv_conf_parse() on UNIX and 249*663afb9bSAndroid Build Coastguard Worker evdns_config_windows_nameservers() on Windows. 250*663afb9bSAndroid Build Coastguard Worker 251*663afb9bSAndroid Build Coastguard Worker @param event_base the event base to associate the dns client with 252*663afb9bSAndroid Build Coastguard Worker @param flags any of EVDNS_BASE_INITIALIZE_NAMESERVERS| 253*663afb9bSAndroid Build Coastguard Worker EVDNS_BASE_DISABLE_WHEN_INACTIVE|EVDNS_BASE_NAMESERVERS_NO_DEFAULT 254*663afb9bSAndroid Build Coastguard Worker @return evdns_base object if successful, or NULL if an error occurred. 255*663afb9bSAndroid Build Coastguard Worker @see evdns_base_free() 256*663afb9bSAndroid Build Coastguard Worker */ 257*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 258*663afb9bSAndroid Build Coastguard Worker struct evdns_base * evdns_base_new(struct event_base *event_base, int initialize_nameservers); 259*663afb9bSAndroid Build Coastguard Worker 260*663afb9bSAndroid Build Coastguard Worker 261*663afb9bSAndroid Build Coastguard Worker /** 262*663afb9bSAndroid Build Coastguard Worker Shut down the asynchronous DNS resolver and terminate all active requests. 263*663afb9bSAndroid Build Coastguard Worker 264*663afb9bSAndroid Build Coastguard Worker If the 'fail_requests' option is enabled, all active requests will return 265*663afb9bSAndroid Build Coastguard Worker an empty result with the error flag set to DNS_ERR_SHUTDOWN. Otherwise, 266*663afb9bSAndroid Build Coastguard Worker the requests will be silently discarded. 267*663afb9bSAndroid Build Coastguard Worker 268*663afb9bSAndroid Build Coastguard Worker @param evdns_base the evdns base to free 269*663afb9bSAndroid Build Coastguard Worker @param fail_requests if zero, active requests will be aborted; if non-zero, 270*663afb9bSAndroid Build Coastguard Worker active requests will return DNS_ERR_SHUTDOWN. 271*663afb9bSAndroid Build Coastguard Worker @see evdns_base_new() 272*663afb9bSAndroid Build Coastguard Worker */ 273*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 274*663afb9bSAndroid Build Coastguard Worker void evdns_base_free(struct evdns_base *base, int fail_requests); 275*663afb9bSAndroid Build Coastguard Worker 276*663afb9bSAndroid Build Coastguard Worker /** 277*663afb9bSAndroid Build Coastguard Worker Remove all hosts entries that have been loaded into the event_base via 278*663afb9bSAndroid Build Coastguard Worker evdns_base_load_hosts or via event_base_resolv_conf_parse. 279*663afb9bSAndroid Build Coastguard Worker 280*663afb9bSAndroid Build Coastguard Worker @param evdns_base the evdns base to remove outdated host addresses from 281*663afb9bSAndroid Build Coastguard Worker */ 282*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 283*663afb9bSAndroid Build Coastguard Worker void evdns_base_clear_host_addresses(struct evdns_base *base); 284*663afb9bSAndroid Build Coastguard Worker 285*663afb9bSAndroid Build Coastguard Worker /** 286*663afb9bSAndroid Build Coastguard Worker Convert a DNS error code to a string. 287*663afb9bSAndroid Build Coastguard Worker 288*663afb9bSAndroid Build Coastguard Worker @param err the DNS error code 289*663afb9bSAndroid Build Coastguard Worker @return a string containing an explanation of the error code 290*663afb9bSAndroid Build Coastguard Worker */ 291*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 292*663afb9bSAndroid Build Coastguard Worker const char *evdns_err_to_string(int err); 293*663afb9bSAndroid Build Coastguard Worker 294*663afb9bSAndroid Build Coastguard Worker 295*663afb9bSAndroid Build Coastguard Worker /** 296*663afb9bSAndroid Build Coastguard Worker Add a nameserver. 297*663afb9bSAndroid Build Coastguard Worker 298*663afb9bSAndroid Build Coastguard Worker The address should be an IPv4 address in network byte order. 299*663afb9bSAndroid Build Coastguard Worker The type of address is chosen so that it matches in_addr.s_addr. 300*663afb9bSAndroid Build Coastguard Worker 301*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to add the name server 302*663afb9bSAndroid Build Coastguard Worker @param address an IP address in network byte order 303*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 304*663afb9bSAndroid Build Coastguard Worker @see evdns_base_nameserver_ip_add() 305*663afb9bSAndroid Build Coastguard Worker */ 306*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 307*663afb9bSAndroid Build Coastguard Worker int evdns_base_nameserver_add(struct evdns_base *base, 308*663afb9bSAndroid Build Coastguard Worker unsigned long int address); 309*663afb9bSAndroid Build Coastguard Worker 310*663afb9bSAndroid Build Coastguard Worker /** 311*663afb9bSAndroid Build Coastguard Worker Get the number of configured nameservers. 312*663afb9bSAndroid Build Coastguard Worker 313*663afb9bSAndroid Build Coastguard Worker This returns the number of configured nameservers (not necessarily the 314*663afb9bSAndroid Build Coastguard Worker number of running nameservers). This is useful for double-checking 315*663afb9bSAndroid Build Coastguard Worker whether our calls to the various nameserver configuration functions 316*663afb9bSAndroid Build Coastguard Worker have been successful. 317*663afb9bSAndroid Build Coastguard Worker 318*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 319*663afb9bSAndroid Build Coastguard Worker @return the number of configured nameservers 320*663afb9bSAndroid Build Coastguard Worker @see evdns_base_nameserver_add() 321*663afb9bSAndroid Build Coastguard Worker */ 322*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 323*663afb9bSAndroid Build Coastguard Worker int evdns_base_count_nameservers(struct evdns_base *base); 324*663afb9bSAndroid Build Coastguard Worker 325*663afb9bSAndroid Build Coastguard Worker /** 326*663afb9bSAndroid Build Coastguard Worker Remove all configured nameservers, and suspend all pending resolves. 327*663afb9bSAndroid Build Coastguard Worker 328*663afb9bSAndroid Build Coastguard Worker Resolves will not necessarily be re-attempted until evdns_base_resume() is called. 329*663afb9bSAndroid Build Coastguard Worker 330*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 331*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 332*663afb9bSAndroid Build Coastguard Worker @see evdns_base_resume() 333*663afb9bSAndroid Build Coastguard Worker */ 334*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 335*663afb9bSAndroid Build Coastguard Worker int evdns_base_clear_nameservers_and_suspend(struct evdns_base *base); 336*663afb9bSAndroid Build Coastguard Worker 337*663afb9bSAndroid Build Coastguard Worker 338*663afb9bSAndroid Build Coastguard Worker /** 339*663afb9bSAndroid Build Coastguard Worker Resume normal operation and continue any suspended resolve requests. 340*663afb9bSAndroid Build Coastguard Worker 341*663afb9bSAndroid Build Coastguard Worker Re-attempt resolves left in limbo after an earlier call to 342*663afb9bSAndroid Build Coastguard Worker evdns_base_clear_nameservers_and_suspend(). 343*663afb9bSAndroid Build Coastguard Worker 344*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 345*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 346*663afb9bSAndroid Build Coastguard Worker @see evdns_base_clear_nameservers_and_suspend() 347*663afb9bSAndroid Build Coastguard Worker */ 348*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 349*663afb9bSAndroid Build Coastguard Worker int evdns_base_resume(struct evdns_base *base); 350*663afb9bSAndroid Build Coastguard Worker 351*663afb9bSAndroid Build Coastguard Worker /** 352*663afb9bSAndroid Build Coastguard Worker Add a nameserver by string address. 353*663afb9bSAndroid Build Coastguard Worker 354*663afb9bSAndroid Build Coastguard Worker This function parses a n IPv4 or IPv6 address from a string and adds it as a 355*663afb9bSAndroid Build Coastguard Worker nameserver. It supports the following formats: 356*663afb9bSAndroid Build Coastguard Worker - [IPv6Address]:port 357*663afb9bSAndroid Build Coastguard Worker - [IPv6Address] 358*663afb9bSAndroid Build Coastguard Worker - IPv6Address 359*663afb9bSAndroid Build Coastguard Worker - IPv4Address:port 360*663afb9bSAndroid Build Coastguard Worker - IPv4Address 361*663afb9bSAndroid Build Coastguard Worker 362*663afb9bSAndroid Build Coastguard Worker If no port is specified, it defaults to 53. 363*663afb9bSAndroid Build Coastguard Worker 364*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 365*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 366*663afb9bSAndroid Build Coastguard Worker @see evdns_base_nameserver_add() 367*663afb9bSAndroid Build Coastguard Worker */ 368*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 369*663afb9bSAndroid Build Coastguard Worker int evdns_base_nameserver_ip_add(struct evdns_base *base, 370*663afb9bSAndroid Build Coastguard Worker const char *ip_as_string); 371*663afb9bSAndroid Build Coastguard Worker 372*663afb9bSAndroid Build Coastguard Worker /** 373*663afb9bSAndroid Build Coastguard Worker Add a nameserver by sockaddr. 374*663afb9bSAndroid Build Coastguard Worker **/ 375*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 376*663afb9bSAndroid Build Coastguard Worker int 377*663afb9bSAndroid Build Coastguard Worker evdns_base_nameserver_sockaddr_add(struct evdns_base *base, 378*663afb9bSAndroid Build Coastguard Worker const struct sockaddr *sa, ev_socklen_t len, unsigned flags); 379*663afb9bSAndroid Build Coastguard Worker 380*663afb9bSAndroid Build Coastguard Worker struct evdns_request; 381*663afb9bSAndroid Build Coastguard Worker 382*663afb9bSAndroid Build Coastguard Worker /** 383*663afb9bSAndroid Build Coastguard Worker Lookup an A record for a given name. 384*663afb9bSAndroid Build Coastguard Worker 385*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 386*663afb9bSAndroid Build Coastguard Worker @param name a DNS hostname 387*663afb9bSAndroid Build Coastguard Worker @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. 388*663afb9bSAndroid Build Coastguard Worker @param callback a callback function to invoke when the request is completed 389*663afb9bSAndroid Build Coastguard Worker @param ptr an argument to pass to the callback function 390*663afb9bSAndroid Build Coastguard Worker @return an evdns_request object if successful, or NULL if an error occurred. 391*663afb9bSAndroid Build Coastguard Worker @see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request() 392*663afb9bSAndroid Build Coastguard Worker */ 393*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 394*663afb9bSAndroid Build Coastguard Worker struct evdns_request *evdns_base_resolve_ipv4(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr); 395*663afb9bSAndroid Build Coastguard Worker 396*663afb9bSAndroid Build Coastguard Worker /** 397*663afb9bSAndroid Build Coastguard Worker Lookup an AAAA record for a given name. 398*663afb9bSAndroid Build Coastguard Worker 399*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 400*663afb9bSAndroid Build Coastguard Worker @param name a DNS hostname 401*663afb9bSAndroid Build Coastguard Worker @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. 402*663afb9bSAndroid Build Coastguard Worker @param callback a callback function to invoke when the request is completed 403*663afb9bSAndroid Build Coastguard Worker @param ptr an argument to pass to the callback function 404*663afb9bSAndroid Build Coastguard Worker @return an evdns_request object if successful, or NULL if an error occurred. 405*663afb9bSAndroid Build Coastguard Worker @see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request() 406*663afb9bSAndroid Build Coastguard Worker */ 407*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 408*663afb9bSAndroid Build Coastguard Worker struct evdns_request *evdns_base_resolve_ipv6(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr); 409*663afb9bSAndroid Build Coastguard Worker 410*663afb9bSAndroid Build Coastguard Worker struct in_addr; 411*663afb9bSAndroid Build Coastguard Worker struct in6_addr; 412*663afb9bSAndroid Build Coastguard Worker 413*663afb9bSAndroid Build Coastguard Worker /** 414*663afb9bSAndroid Build Coastguard Worker Lookup a PTR record for a given IP address. 415*663afb9bSAndroid Build Coastguard Worker 416*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 417*663afb9bSAndroid Build Coastguard Worker @param in an IPv4 address 418*663afb9bSAndroid Build Coastguard Worker @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. 419*663afb9bSAndroid Build Coastguard Worker @param callback a callback function to invoke when the request is completed 420*663afb9bSAndroid Build Coastguard Worker @param ptr an argument to pass to the callback function 421*663afb9bSAndroid Build Coastguard Worker @return an evdns_request object if successful, or NULL if an error occurred. 422*663afb9bSAndroid Build Coastguard Worker @see evdns_resolve_reverse_ipv6(), evdns_cancel_request() 423*663afb9bSAndroid Build Coastguard Worker */ 424*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 425*663afb9bSAndroid Build Coastguard Worker struct evdns_request *evdns_base_resolve_reverse(struct evdns_base *base, const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); 426*663afb9bSAndroid Build Coastguard Worker 427*663afb9bSAndroid Build Coastguard Worker 428*663afb9bSAndroid Build Coastguard Worker /** 429*663afb9bSAndroid Build Coastguard Worker Lookup a PTR record for a given IPv6 address. 430*663afb9bSAndroid Build Coastguard Worker 431*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 432*663afb9bSAndroid Build Coastguard Worker @param in an IPv6 address 433*663afb9bSAndroid Build Coastguard Worker @param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query. 434*663afb9bSAndroid Build Coastguard Worker @param callback a callback function to invoke when the request is completed 435*663afb9bSAndroid Build Coastguard Worker @param ptr an argument to pass to the callback function 436*663afb9bSAndroid Build Coastguard Worker @return an evdns_request object if successful, or NULL if an error occurred. 437*663afb9bSAndroid Build Coastguard Worker @see evdns_resolve_reverse_ipv6(), evdns_cancel_request() 438*663afb9bSAndroid Build Coastguard Worker */ 439*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 440*663afb9bSAndroid Build Coastguard Worker struct evdns_request *evdns_base_resolve_reverse_ipv6(struct evdns_base *base, const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); 441*663afb9bSAndroid Build Coastguard Worker 442*663afb9bSAndroid Build Coastguard Worker /** 443*663afb9bSAndroid Build Coastguard Worker Cancels a pending DNS resolution request. 444*663afb9bSAndroid Build Coastguard Worker 445*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base that was used to make the request 446*663afb9bSAndroid Build Coastguard Worker @param req the evdns_request that was returned by calling a resolve function 447*663afb9bSAndroid Build Coastguard Worker @see evdns_base_resolve_ipv4(), evdns_base_resolve_ipv6, evdns_base_resolve_reverse 448*663afb9bSAndroid Build Coastguard Worker */ 449*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 450*663afb9bSAndroid Build Coastguard Worker void evdns_cancel_request(struct evdns_base *base, struct evdns_request *req); 451*663afb9bSAndroid Build Coastguard Worker 452*663afb9bSAndroid Build Coastguard Worker /** 453*663afb9bSAndroid Build Coastguard Worker Set the value of a configuration option. 454*663afb9bSAndroid Build Coastguard Worker 455*663afb9bSAndroid Build Coastguard Worker The currently available configuration options are: 456*663afb9bSAndroid Build Coastguard Worker 457*663afb9bSAndroid Build Coastguard Worker ndots, timeout, max-timeouts, max-inflight, attempts, randomize-case, 458*663afb9bSAndroid Build Coastguard Worker bind-to, initial-probe-timeout, getaddrinfo-allow-skew, 459*663afb9bSAndroid Build Coastguard Worker so-rcvbuf, so-sndbuf. 460*663afb9bSAndroid Build Coastguard Worker 461*663afb9bSAndroid Build Coastguard Worker In versions before Libevent 2.0.3-alpha, the option name needed to end with 462*663afb9bSAndroid Build Coastguard Worker a colon. 463*663afb9bSAndroid Build Coastguard Worker 464*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 465*663afb9bSAndroid Build Coastguard Worker @param option the name of the configuration option to be modified 466*663afb9bSAndroid Build Coastguard Worker @param val the value to be set 467*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 468*663afb9bSAndroid Build Coastguard Worker */ 469*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 470*663afb9bSAndroid Build Coastguard Worker int evdns_base_set_option(struct evdns_base *base, const char *option, const char *val); 471*663afb9bSAndroid Build Coastguard Worker 472*663afb9bSAndroid Build Coastguard Worker 473*663afb9bSAndroid Build Coastguard Worker /** 474*663afb9bSAndroid Build Coastguard Worker Parse a resolv.conf file. 475*663afb9bSAndroid Build Coastguard Worker 476*663afb9bSAndroid Build Coastguard Worker The 'flags' parameter determines what information is parsed from the 477*663afb9bSAndroid Build Coastguard Worker resolv.conf file. See the man page for resolv.conf for the format of this 478*663afb9bSAndroid Build Coastguard Worker file. 479*663afb9bSAndroid Build Coastguard Worker 480*663afb9bSAndroid Build Coastguard Worker The following directives are not parsed from the file: sortlist, rotate, 481*663afb9bSAndroid Build Coastguard Worker no-check-names, inet6, debug. 482*663afb9bSAndroid Build Coastguard Worker 483*663afb9bSAndroid Build Coastguard Worker If this function encounters an error, the possible return values are: 1 = 484*663afb9bSAndroid Build Coastguard Worker failed to open file, 2 = failed to stat file, 3 = file too large, 4 = out of 485*663afb9bSAndroid Build Coastguard Worker memory, 5 = short read from file, 6 = no nameservers listed in the file 486*663afb9bSAndroid Build Coastguard Worker 487*663afb9bSAndroid Build Coastguard Worker @param base the evdns_base to which to apply this operation 488*663afb9bSAndroid Build Coastguard Worker @param flags any of DNS_OPTION_NAMESERVERS|DNS_OPTION_SEARCH|DNS_OPTION_MISC| 489*663afb9bSAndroid Build Coastguard Worker DNS_OPTION_HOSTSFILE|DNS_OPTIONS_ALL|DNS_OPTION_NAMESERVERS_NO_DEFAULT 490*663afb9bSAndroid Build Coastguard Worker @param filename the path to the resolv.conf file 491*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or various positive error codes if an error 492*663afb9bSAndroid Build Coastguard Worker occurred (see above) 493*663afb9bSAndroid Build Coastguard Worker @see resolv.conf(3), evdns_config_windows_nameservers() 494*663afb9bSAndroid Build Coastguard Worker */ 495*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 496*663afb9bSAndroid Build Coastguard Worker int evdns_base_resolv_conf_parse(struct evdns_base *base, int flags, const char *const filename); 497*663afb9bSAndroid Build Coastguard Worker 498*663afb9bSAndroid Build Coastguard Worker /** 499*663afb9bSAndroid Build Coastguard Worker Load an /etc/hosts-style file from 'hosts_fname' into 'base'. 500*663afb9bSAndroid Build Coastguard Worker 501*663afb9bSAndroid Build Coastguard Worker If hosts_fname is NULL, add minimal entries for localhost, and nothing 502*663afb9bSAndroid Build Coastguard Worker else. 503*663afb9bSAndroid Build Coastguard Worker 504*663afb9bSAndroid Build Coastguard Worker Note that only evdns_getaddrinfo uses the /etc/hosts entries. 505*663afb9bSAndroid Build Coastguard Worker 506*663afb9bSAndroid Build Coastguard Worker This function does not replace previously loaded hosts entries; to do that, 507*663afb9bSAndroid Build Coastguard Worker call evdns_base_clear_host_addresses first. 508*663afb9bSAndroid Build Coastguard Worker 509*663afb9bSAndroid Build Coastguard Worker Return 0 on success, negative on failure. 510*663afb9bSAndroid Build Coastguard Worker */ 511*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 512*663afb9bSAndroid Build Coastguard Worker int evdns_base_load_hosts(struct evdns_base *base, const char *hosts_fname); 513*663afb9bSAndroid Build Coastguard Worker 514*663afb9bSAndroid Build Coastguard Worker #if defined(EVENT_IN_DOXYGEN_) || defined(_WIN32) 515*663afb9bSAndroid Build Coastguard Worker /** 516*663afb9bSAndroid Build Coastguard Worker Obtain nameserver information using the Windows API. 517*663afb9bSAndroid Build Coastguard Worker 518*663afb9bSAndroid Build Coastguard Worker Attempt to configure a set of nameservers based on platform settings on 519*663afb9bSAndroid Build Coastguard Worker a win32 host. Preferentially tries to use GetNetworkParams; if that fails, 520*663afb9bSAndroid Build Coastguard Worker looks in the registry. 521*663afb9bSAndroid Build Coastguard Worker 522*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 523*663afb9bSAndroid Build Coastguard Worker @see evdns_resolv_conf_parse() 524*663afb9bSAndroid Build Coastguard Worker */ 525*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 526*663afb9bSAndroid Build Coastguard Worker int evdns_base_config_windows_nameservers(struct evdns_base *); 527*663afb9bSAndroid Build Coastguard Worker #define EVDNS_BASE_CONFIG_WINDOWS_NAMESERVERS_IMPLEMENTED 528*663afb9bSAndroid Build Coastguard Worker #endif 529*663afb9bSAndroid Build Coastguard Worker 530*663afb9bSAndroid Build Coastguard Worker 531*663afb9bSAndroid Build Coastguard Worker /** 532*663afb9bSAndroid Build Coastguard Worker Clear the list of search domains. 533*663afb9bSAndroid Build Coastguard Worker */ 534*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 535*663afb9bSAndroid Build Coastguard Worker void evdns_base_search_clear(struct evdns_base *base); 536*663afb9bSAndroid Build Coastguard Worker 537*663afb9bSAndroid Build Coastguard Worker 538*663afb9bSAndroid Build Coastguard Worker /** 539*663afb9bSAndroid Build Coastguard Worker Add a domain to the list of search domains 540*663afb9bSAndroid Build Coastguard Worker 541*663afb9bSAndroid Build Coastguard Worker @param domain the domain to be added to the search list 542*663afb9bSAndroid Build Coastguard Worker */ 543*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 544*663afb9bSAndroid Build Coastguard Worker void evdns_base_search_add(struct evdns_base *base, const char *domain); 545*663afb9bSAndroid Build Coastguard Worker 546*663afb9bSAndroid Build Coastguard Worker 547*663afb9bSAndroid Build Coastguard Worker /** 548*663afb9bSAndroid Build Coastguard Worker Set the 'ndots' parameter for searches. 549*663afb9bSAndroid Build Coastguard Worker 550*663afb9bSAndroid Build Coastguard Worker Sets the number of dots which, when found in a name, causes 551*663afb9bSAndroid Build Coastguard Worker the first query to be without any search domain. 552*663afb9bSAndroid Build Coastguard Worker 553*663afb9bSAndroid Build Coastguard Worker @param ndots the new ndots parameter 554*663afb9bSAndroid Build Coastguard Worker */ 555*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 556*663afb9bSAndroid Build Coastguard Worker void evdns_base_search_ndots_set(struct evdns_base *base, const int ndots); 557*663afb9bSAndroid Build Coastguard Worker 558*663afb9bSAndroid Build Coastguard Worker /** 559*663afb9bSAndroid Build Coastguard Worker A callback that is invoked when a log message is generated 560*663afb9bSAndroid Build Coastguard Worker 561*663afb9bSAndroid Build Coastguard Worker @param is_warning indicates if the log message is a 'warning' 562*663afb9bSAndroid Build Coastguard Worker @param msg the content of the log message 563*663afb9bSAndroid Build Coastguard Worker */ 564*663afb9bSAndroid Build Coastguard Worker typedef void (*evdns_debug_log_fn_type)(int is_warning, const char *msg); 565*663afb9bSAndroid Build Coastguard Worker 566*663afb9bSAndroid Build Coastguard Worker 567*663afb9bSAndroid Build Coastguard Worker /** 568*663afb9bSAndroid Build Coastguard Worker Set the callback function to handle DNS log messages. If this 569*663afb9bSAndroid Build Coastguard Worker callback is not set, evdns log messages are handled with the regular 570*663afb9bSAndroid Build Coastguard Worker Libevent logging system. 571*663afb9bSAndroid Build Coastguard Worker 572*663afb9bSAndroid Build Coastguard Worker @param fn the callback to be invoked when a log message is generated 573*663afb9bSAndroid Build Coastguard Worker */ 574*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 575*663afb9bSAndroid Build Coastguard Worker void evdns_set_log_fn(evdns_debug_log_fn_type fn); 576*663afb9bSAndroid Build Coastguard Worker 577*663afb9bSAndroid Build Coastguard Worker /** 578*663afb9bSAndroid Build Coastguard Worker Set a callback that will be invoked to generate transaction IDs. By 579*663afb9bSAndroid Build Coastguard Worker default, we pick transaction IDs based on the current clock time, which 580*663afb9bSAndroid Build Coastguard Worker is bad for security. 581*663afb9bSAndroid Build Coastguard Worker 582*663afb9bSAndroid Build Coastguard Worker @param fn the new callback, or NULL to use the default. 583*663afb9bSAndroid Build Coastguard Worker 584*663afb9bSAndroid Build Coastguard Worker NOTE: This function has no effect in Libevent 2.0.4-alpha and later, 585*663afb9bSAndroid Build Coastguard Worker since Libevent now provides its own secure RNG. 586*663afb9bSAndroid Build Coastguard Worker */ 587*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 588*663afb9bSAndroid Build Coastguard Worker void evdns_set_transaction_id_fn(ev_uint16_t (*fn)(void)); 589*663afb9bSAndroid Build Coastguard Worker 590*663afb9bSAndroid Build Coastguard Worker /** 591*663afb9bSAndroid Build Coastguard Worker Set a callback used to generate random bytes. By default, we use 592*663afb9bSAndroid Build Coastguard Worker the same function as passed to evdns_set_transaction_id_fn to generate 593*663afb9bSAndroid Build Coastguard Worker bytes two at a time. If a function is provided here, it's also used 594*663afb9bSAndroid Build Coastguard Worker to generate transaction IDs. 595*663afb9bSAndroid Build Coastguard Worker 596*663afb9bSAndroid Build Coastguard Worker NOTE: This function has no effect in Libevent 2.0.4-alpha and later, 597*663afb9bSAndroid Build Coastguard Worker since Libevent now provides its own secure RNG. 598*663afb9bSAndroid Build Coastguard Worker */ 599*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 600*663afb9bSAndroid Build Coastguard Worker void evdns_set_random_bytes_fn(void (*fn)(char *, size_t)); 601*663afb9bSAndroid Build Coastguard Worker 602*663afb9bSAndroid Build Coastguard Worker /* 603*663afb9bSAndroid Build Coastguard Worker * Functions used to implement a DNS server. 604*663afb9bSAndroid Build Coastguard Worker */ 605*663afb9bSAndroid Build Coastguard Worker 606*663afb9bSAndroid Build Coastguard Worker struct evdns_server_request; 607*663afb9bSAndroid Build Coastguard Worker struct evdns_server_question; 608*663afb9bSAndroid Build Coastguard Worker 609*663afb9bSAndroid Build Coastguard Worker /** 610*663afb9bSAndroid Build Coastguard Worker A callback to implement a DNS server. The callback function receives a DNS 611*663afb9bSAndroid Build Coastguard Worker request. It should then optionally add a number of answers to the reply 612*663afb9bSAndroid Build Coastguard Worker using the evdns_server_request_add_*_reply functions, before calling either 613*663afb9bSAndroid Build Coastguard Worker evdns_server_request_respond to send the reply back, or 614*663afb9bSAndroid Build Coastguard Worker evdns_server_request_drop to decline to answer the request. 615*663afb9bSAndroid Build Coastguard Worker 616*663afb9bSAndroid Build Coastguard Worker @param req A newly received request 617*663afb9bSAndroid Build Coastguard Worker @param user_data A pointer that was passed to 618*663afb9bSAndroid Build Coastguard Worker evdns_add_server_port_with_base(). 619*663afb9bSAndroid Build Coastguard Worker */ 620*663afb9bSAndroid Build Coastguard Worker typedef void (*evdns_request_callback_fn_type)(struct evdns_server_request *, void *); 621*663afb9bSAndroid Build Coastguard Worker #define EVDNS_ANSWER_SECTION 0 622*663afb9bSAndroid Build Coastguard Worker #define EVDNS_AUTHORITY_SECTION 1 623*663afb9bSAndroid Build Coastguard Worker #define EVDNS_ADDITIONAL_SECTION 2 624*663afb9bSAndroid Build Coastguard Worker 625*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_A 1 626*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_NS 2 627*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_CNAME 5 628*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_SOA 6 629*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_PTR 12 630*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_MX 15 631*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_TXT 16 632*663afb9bSAndroid Build Coastguard Worker #define EVDNS_TYPE_AAAA 28 633*663afb9bSAndroid Build Coastguard Worker 634*663afb9bSAndroid Build Coastguard Worker #define EVDNS_QTYPE_AXFR 252 635*663afb9bSAndroid Build Coastguard Worker #define EVDNS_QTYPE_ALL 255 636*663afb9bSAndroid Build Coastguard Worker 637*663afb9bSAndroid Build Coastguard Worker #define EVDNS_CLASS_INET 1 638*663afb9bSAndroid Build Coastguard Worker 639*663afb9bSAndroid Build Coastguard Worker /* flags that can be set in answers; as part of the err parameter */ 640*663afb9bSAndroid Build Coastguard Worker #define EVDNS_FLAGS_AA 0x400 641*663afb9bSAndroid Build Coastguard Worker #define EVDNS_FLAGS_RD 0x080 642*663afb9bSAndroid Build Coastguard Worker 643*663afb9bSAndroid Build Coastguard Worker /** Create a new DNS server port. 644*663afb9bSAndroid Build Coastguard Worker 645*663afb9bSAndroid Build Coastguard Worker @param base The event base to handle events for the server port. 646*663afb9bSAndroid Build Coastguard Worker @param socket A UDP socket to accept DNS requests. 647*663afb9bSAndroid Build Coastguard Worker @param flags Always 0 for now. 648*663afb9bSAndroid Build Coastguard Worker @param callback A function to invoke whenever we get a DNS request 649*663afb9bSAndroid Build Coastguard Worker on the socket. 650*663afb9bSAndroid Build Coastguard Worker @param user_data Data to pass to the callback. 651*663afb9bSAndroid Build Coastguard Worker @return an evdns_server_port structure for this server port or NULL if 652*663afb9bSAndroid Build Coastguard Worker an error occurred. 653*663afb9bSAndroid Build Coastguard Worker */ 654*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 655*663afb9bSAndroid Build Coastguard Worker struct evdns_server_port *evdns_add_server_port_with_base(struct event_base *base, evutil_socket_t socket, int flags, evdns_request_callback_fn_type callback, void *user_data); 656*663afb9bSAndroid Build Coastguard Worker /** Close down a DNS server port, and free associated structures. */ 657*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 658*663afb9bSAndroid Build Coastguard Worker void evdns_close_server_port(struct evdns_server_port *port); 659*663afb9bSAndroid Build Coastguard Worker 660*663afb9bSAndroid Build Coastguard Worker /** Sets some flags in a reply we're building. 661*663afb9bSAndroid Build Coastguard Worker Allows setting of the AA or RD flags 662*663afb9bSAndroid Build Coastguard Worker */ 663*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 664*663afb9bSAndroid Build Coastguard Worker void evdns_server_request_set_flags(struct evdns_server_request *req, int flags); 665*663afb9bSAndroid Build Coastguard Worker 666*663afb9bSAndroid Build Coastguard Worker /* Functions to add an answer to an in-progress DNS reply. 667*663afb9bSAndroid Build Coastguard Worker */ 668*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 669*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_add_reply(struct evdns_server_request *req, int section, const char *name, int type, int dns_class, int ttl, int datalen, int is_name, const char *data); 670*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 671*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_add_a_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); 672*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 673*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); 674*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 675*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_add_ptr_reply(struct evdns_server_request *req, struct in_addr *in, const char *inaddr_name, const char *hostname, int ttl); 676*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 677*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl); 678*663afb9bSAndroid Build Coastguard Worker 679*663afb9bSAndroid Build Coastguard Worker /** 680*663afb9bSAndroid Build Coastguard Worker Send back a response to a DNS request, and free the request structure. 681*663afb9bSAndroid Build Coastguard Worker */ 682*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 683*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_respond(struct evdns_server_request *req, int err); 684*663afb9bSAndroid Build Coastguard Worker /** 685*663afb9bSAndroid Build Coastguard Worker Free a DNS request without sending back a reply. 686*663afb9bSAndroid Build Coastguard Worker */ 687*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 688*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_drop(struct evdns_server_request *req); 689*663afb9bSAndroid Build Coastguard Worker struct sockaddr; 690*663afb9bSAndroid Build Coastguard Worker /** 691*663afb9bSAndroid Build Coastguard Worker Get the address that made a DNS request. 692*663afb9bSAndroid Build Coastguard Worker */ 693*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 694*663afb9bSAndroid Build Coastguard Worker int evdns_server_request_get_requesting_addr(struct evdns_server_request *req, struct sockaddr *sa, int addr_len); 695*663afb9bSAndroid Build Coastguard Worker 696*663afb9bSAndroid Build Coastguard Worker /** Callback for evdns_getaddrinfo. */ 697*663afb9bSAndroid Build Coastguard Worker typedef void (*evdns_getaddrinfo_cb)(int result, struct evutil_addrinfo *res, void *arg); 698*663afb9bSAndroid Build Coastguard Worker 699*663afb9bSAndroid Build Coastguard Worker struct evdns_base; 700*663afb9bSAndroid Build Coastguard Worker struct evdns_getaddrinfo_request; 701*663afb9bSAndroid Build Coastguard Worker /** Make a non-blocking getaddrinfo request using the dns_base in 'dns_base'. 702*663afb9bSAndroid Build Coastguard Worker * 703*663afb9bSAndroid Build Coastguard Worker * If we can answer the request immediately (with an error or not!), then we 704*663afb9bSAndroid Build Coastguard Worker * invoke cb immediately and return NULL. Otherwise we return 705*663afb9bSAndroid Build Coastguard Worker * an evdns_getaddrinfo_request and invoke cb later. 706*663afb9bSAndroid Build Coastguard Worker * 707*663afb9bSAndroid Build Coastguard Worker * When the callback is invoked, we pass as its first argument the error code 708*663afb9bSAndroid Build Coastguard Worker * that getaddrinfo would return (or 0 for no error). As its second argument, 709*663afb9bSAndroid Build Coastguard Worker * we pass the evutil_addrinfo structures we found (or NULL on error). We 710*663afb9bSAndroid Build Coastguard Worker * pass 'arg' as the third argument. 711*663afb9bSAndroid Build Coastguard Worker * 712*663afb9bSAndroid Build Coastguard Worker * Limitations: 713*663afb9bSAndroid Build Coastguard Worker * 714*663afb9bSAndroid Build Coastguard Worker * - The AI_V4MAPPED and AI_ALL flags are not currently implemented. 715*663afb9bSAndroid Build Coastguard Worker * - For ai_socktype, we only handle SOCKTYPE_STREAM, SOCKTYPE_UDP, and 0. 716*663afb9bSAndroid Build Coastguard Worker * - For ai_protocol, we only handle IPPROTO_TCP, IPPROTO_UDP, and 0. 717*663afb9bSAndroid Build Coastguard Worker */ 718*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 719*663afb9bSAndroid Build Coastguard Worker struct evdns_getaddrinfo_request *evdns_getaddrinfo( 720*663afb9bSAndroid Build Coastguard Worker struct evdns_base *dns_base, 721*663afb9bSAndroid Build Coastguard Worker const char *nodename, const char *servname, 722*663afb9bSAndroid Build Coastguard Worker const struct evutil_addrinfo *hints_in, 723*663afb9bSAndroid Build Coastguard Worker evdns_getaddrinfo_cb cb, void *arg); 724*663afb9bSAndroid Build Coastguard Worker 725*663afb9bSAndroid Build Coastguard Worker /* Cancel an in-progress evdns_getaddrinfo. This MUST NOT be called after the 726*663afb9bSAndroid Build Coastguard Worker * getaddrinfo's callback has been invoked. The resolves will be canceled, 727*663afb9bSAndroid Build Coastguard Worker * and the callback will be invoked with the error EVUTIL_EAI_CANCEL. */ 728*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 729*663afb9bSAndroid Build Coastguard Worker void evdns_getaddrinfo_cancel(struct evdns_getaddrinfo_request *req); 730*663afb9bSAndroid Build Coastguard Worker 731*663afb9bSAndroid Build Coastguard Worker /** 732*663afb9bSAndroid Build Coastguard Worker Retrieve the address of the 'idx'th configured nameserver. 733*663afb9bSAndroid Build Coastguard Worker 734*663afb9bSAndroid Build Coastguard Worker @param base The evdns_base to examine. 735*663afb9bSAndroid Build Coastguard Worker @param idx The index of the nameserver to get the address of. 736*663afb9bSAndroid Build Coastguard Worker @param sa A location to receive the server's address. 737*663afb9bSAndroid Build Coastguard Worker @param len The number of bytes available at sa. 738*663afb9bSAndroid Build Coastguard Worker 739*663afb9bSAndroid Build Coastguard Worker @return the number of bytes written into sa on success. On failure, returns 740*663afb9bSAndroid Build Coastguard Worker -1 if idx is greater than the number of configured nameservers, or a 741*663afb9bSAndroid Build Coastguard Worker value greater than 'len' if len was not high enough. 742*663afb9bSAndroid Build Coastguard Worker */ 743*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 744*663afb9bSAndroid Build Coastguard Worker int evdns_base_get_nameserver_addr(struct evdns_base *base, int idx, 745*663afb9bSAndroid Build Coastguard Worker struct sockaddr *sa, ev_socklen_t len); 746*663afb9bSAndroid Build Coastguard Worker 747*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 748*663afb9bSAndroid Build Coastguard Worker } 749*663afb9bSAndroid Build Coastguard Worker #endif 750*663afb9bSAndroid Build Coastguard Worker 751*663afb9bSAndroid Build Coastguard Worker #endif /* !EVENT2_DNS_H_INCLUDED_ */ 752