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