xref: /minix3/external/bsd/libevent/dist/include/event2/dns.h (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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