Annotation of embedaddon/libevent/evdns.3, revision 1.1.1.1
1.1 misho 1: .\"
2: .\" Copyright (c) 2006 Niels Provos <provos@citi.umich.edu>
3: .\" All rights reserved.
4: .\"
5: .\" Redistribution and use in source and binary forms, with or without
6: .\" modification, are permitted provided that the following conditions
7: .\" are met:
8: .\"
9: .\" 1. Redistributions of source code must retain the above copyright
10: .\" notice, this list of conditions and the following disclaimer.
11: .\" 2. Redistributions in binary form must reproduce the above copyright
12: .\" notice, this list of conditions and the following disclaimer in the
13: .\" documentation and/or other materials provided with the distribution.
14: .\" 3. The name of the author may not be used to endorse or promote products
15: .\" derived from this software without specific prior written permission.
16: .\"
17: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18: .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19: .\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20: .\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21: .\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22: .\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23: .\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24: .\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25: .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26: .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27: .\"
28: .Dd October 7, 2006
29: .Dt EVDNS 3
30: .Os
31: .Sh NAME
32: .Nm evdns_init
33: .Nm evdns_shutdown
34: .Nm evdns_err_to_string
35: .Nm evdns_nameserver_add
36: .Nm evdns_count_nameservers
37: .Nm evdns_clear_nameservers_and_suspend
38: .Nm evdns_resume
39: .Nm evdns_nameserver_ip_add
40: .Nm evdns_resolve_ipv4
41: .Nm evdns_resolve_reverse
42: .Nm evdns_resolv_conf_parse
43: .Nm evdns_config_windows_nameservers
44: .Nm evdns_search_clear
45: .Nm evdns_search_add
46: .Nm evdns_search_ndots_set
47: .Nm evdns_set_log_fn
48: .Nd asynchronous functions for DNS resolution.
49: .Sh SYNOPSIS
50: .Fd #include <sys/time.h>
51: .Fd #include <event.h>
52: .Fd #include <evdns.h>
53: .Ft int
54: .Fn evdns_init
55: .Ft void
56: .Fn evdns_shutdown "int fail_requests"
57: .Ft "const char *"
58: .Fn evdns_err_to_string "int err"
59: .Ft int
60: .Fn evdns_nameserver_add "unsigned long int address"
61: .Ft int
62: .Fn evdns_count_nameservers
63: .Ft int
64: .Fn evdns_clear_nameservers_and_suspend
65: .Ft int
66: .Fn evdns_resume
67: .Ft int
68: .Fn evdns_nameserver_ip_add(const char *ip_as_string);
69: .Ft int
70: .Fn evdns_resolve_ipv4 "const char *name" "int flags" "evdns_callback_type callback" "void *ptr"
71: .Ft int
72: .Fn evdns_resolve_reverse "struct in_addr *in" "int flags" "evdns_callback_type callback" "void *ptr"
73: .Ft int
74: .Fn evdns_resolv_conf_parse "int flags" "const char *"
75: .Ft void
76: .Fn evdns_search_clear
77: .Ft void
78: .Fn evdns_search_add "const char *domain"
79: .Ft void
80: .Fn evdns_search_ndots_set "const int ndots"
81: .Ft void
82: .Fn evdns_set_log_fn "evdns_debug_log_fn_type fn"
83: .Ft int
84: .Fn evdns_config_windows_nameservers
85: .Sh DESCRIPTION
86: Welcome, gentle reader
87: .Pp
88: Async DNS lookups are really a whole lot harder than they should be,
89: mostly stemming from the fact that the libc resolver has never been
90: very good at them. Before you use this library you should see if libc
91: can do the job for you with the modern async call getaddrinfo_a
92: (see http://www.imperialviolet.org/page25.html#e498). Otherwise,
93: please continue.
94: .Pp
95: This code is based on libevent and you must call event_init before
96: any of the APIs in this file. You must also seed the OpenSSL random
97: source if you are using OpenSSL for ids (see below).
98: .Pp
99: This library is designed to be included and shipped with your source
100: code. You statically link with it. You should also test for the
101: existence of strtok_r and define HAVE_STRTOK_R if you have it.
102: .Pp
103: The DNS protocol requires a good source of id numbers and these
104: numbers should be unpredictable for spoofing reasons. There are
105: three methods for generating them here and you must define exactly
106: one of them. In increasing order of preference:
107: .Pp
108: .Bl -tag -width "DNS_USE_GETTIMEOFDAY_FOR_ID" -compact -offset indent
109: .It DNS_USE_GETTIMEOFDAY_FOR_ID
110: Using the bottom 16 bits of the usec result from gettimeofday. This
111: is a pretty poor solution but should work anywhere.
112: .It DNS_USE_CPU_CLOCK_FOR_ID
113: Using the bottom 16 bits of the nsec result from the CPU's time
114: counter. This is better, but may not work everywhere. Requires
115: POSIX realtime support and you'll need to link against -lrt on
116: glibc systems at least.
117: .It DNS_USE_OPENSSL_FOR_ID
118: Uses the OpenSSL RAND_bytes call to generate the data. You must
119: have seeded the pool before making any calls to this library.
120: .El
121: .Pp
122: The library keeps track of the state of nameservers and will avoid
123: them when they go down. Otherwise it will round robin between them.
124: .Pp
125: Quick start guide:
126: #include "evdns.h"
127: void callback(int result, char type, int count, int ttl,
128: void *addresses, void *arg);
129: evdns_resolv_conf_parse(DNS_OPTIONS_ALL, "/etc/resolv.conf");
130: evdns_resolve("www.hostname.com", 0, callback, NULL);
131: .Pp
132: When the lookup is complete the callback function is called. The
133: first argument will be one of the DNS_ERR_* defines in evdns.h.
134: Hopefully it will be DNS_ERR_NONE, in which case type will be
135: DNS_IPv4_A, count will be the number of IP addresses, ttl is the time
136: which the data can be cached for (in seconds), addresses will point
137: to an array of uint32_t's and arg will be whatever you passed to
138: evdns_resolve.
139: .Pp
140: Searching:
141: .Pp
142: In order for this library to be a good replacement for glibc's resolver it
143: supports searching. This involves setting a list of default domains, in
144: which names will be queried for. The number of dots in the query name
145: determines the order in which this list is used.
146: .Pp
147: Searching appears to be a single lookup from the point of view of the API,
148: although many DNS queries may be generated from a single call to
149: evdns_resolve. Searching can also drastically slow down the resolution
150: of names.
151: .Pp
152: To disable searching:
153: .Bl -enum -compact -offset indent
154: .It
155: Never set it up. If you never call
156: .Fn evdns_resolv_conf_parse,
157: .Fn evdns_init,
158: or
159: .Fn evdns_search_add
160: then no searching will occur.
161: .It
162: If you do call
163: .Fn evdns_resolv_conf_parse
164: then don't pass
165: .Va DNS_OPTION_SEARCH
166: (or
167: .Va DNS_OPTIONS_ALL,
168: which implies it).
169: .It
170: When calling
171: .Fn evdns_resolve,
172: pass the
173: .Va DNS_QUERY_NO_SEARCH
174: flag.
175: .El
176: .Pp
177: The order of searches depends on the number of dots in the name. If the
178: number is greater than the ndots setting then the names is first tried
179: globally. Otherwise each search domain is appended in turn.
180: .Pp
181: The ndots setting can either be set from a resolv.conf, or by calling
182: evdns_search_ndots_set.
183: .Pp
184: For example, with ndots set to 1 (the default) and a search domain list of
185: ["myhome.net"]:
186: Query: www
187: Order: www.myhome.net, www.
188: .Pp
189: Query: www.abc
190: Order: www.abc., www.abc.myhome.net
191: .Pp
192: .Sh API reference
193: .Pp
194: .Bl -tag -width 0123456
195: .It Ft int Fn evdns_init
196: Initializes support for non-blocking name resolution by calling
197: .Fn evdns_resolv_conf_parse
198: on UNIX and
199: .Fn evdns_config_windows_nameservers
200: on Windows.
201: .It Ft int Fn evdns_nameserver_add "unsigned long int address"
202: Add a nameserver. The address should be an IP address in
203: network byte order. The type of address is chosen so that
204: it matches in_addr.s_addr.
205: Returns non-zero on error.
206: .It Ft int Fn evdns_nameserver_ip_add "const char *ip_as_string"
207: This wraps the above function by parsing a string as an IP
208: address and adds it as a nameserver.
209: Returns non-zero on error
210: .It Ft int Fn evdns_resolve "const char *name" "int flags" "evdns_callback_type callback" "void *ptr"
211: Resolve a name. The name parameter should be a DNS name.
212: The flags parameter should be 0, or DNS_QUERY_NO_SEARCH
213: which disables searching for this query. (see defn of
214: searching above).
215: .Pp
216: The callback argument is a function which is called when
217: this query completes and ptr is an argument which is passed
218: to that callback function.
219: .Pp
220: Returns non-zero on error
221: .It Ft void Fn evdns_search_clear
222: Clears the list of search domains
223: .It Ft void Fn evdns_search_add "const char *domain"
224: Add a domain to the list of search domains
225: .It Ft void Fn evdns_search_ndots_set "int ndots"
226: Set the number of dots which, when found in a name, causes
227: the first query to be without any search domain.
228: .It Ft int Fn evdns_count_nameservers "void"
229: Return the number of configured nameservers (not necessarily the
230: number of running nameservers). This is useful for double-checking
231: whether our calls to the various nameserver configuration functions
232: have been successful.
233: .It Ft int Fn evdns_clear_nameservers_and_suspend "void"
234: Remove all currently configured nameservers, and suspend all pending
235: resolves. Resolves will not necessarily be re-attempted until
236: evdns_resume() is called.
237: .It Ft int Fn evdns_resume "void"
238: Re-attempt resolves left in limbo after an earlier call to
239: evdns_clear_nameservers_and_suspend().
240: .It Ft int Fn evdns_config_windows_nameservers "void"
241: Attempt to configure a set of nameservers based on platform settings on
242: a win32 host. Preferentially tries to use GetNetworkParams; if that fails,
243: looks in the registry. Returns 0 on success, nonzero on failure.
244: .It Ft int Fn evdns_resolv_conf_parse "int flags" "const char *filename"
245: Parse a resolv.conf like file from the given filename.
246: .Pp
247: See the man page for resolv.conf for the format of this file.
248: The flags argument determines what information is parsed from
249: this file:
250: .Bl -tag -width "DNS_OPTION_NAMESERVERS" -offset indent -compact -nested
251: .It DNS_OPTION_SEARCH
252: domain, search and ndots options
253: .It DNS_OPTION_NAMESERVERS
254: nameserver lines
255: .It DNS_OPTION_MISC
256: timeout and attempts options
257: .It DNS_OPTIONS_ALL
258: all of the above
259: .El
260: .Pp
261: The following directives are not parsed from the file:
262: sortlist, rotate, no-check-names, inet6, debug
263: .Pp
264: Returns non-zero on error:
265: .Bl -tag -width "0" -offset indent -compact -nested
266: .It 0
267: no errors
268: .It 1
269: failed to open file
270: .It 2
271: failed to stat file
272: .It 3
273: file too large
274: .It 4
275: out of memory
276: .It 5
277: short read from file
278: .El
279: .El
280: .Sh Internals:
281: Requests are kept in two queues. The first is the inflight queue. In
282: this queue requests have an allocated transaction id and nameserver.
283: They will soon be transmitted if they haven't already been.
284: .Pp
285: The second is the waiting queue. The size of the inflight ring is
286: limited and all other requests wait in waiting queue for space. This
287: bounds the number of concurrent requests so that we don't flood the
288: nameserver. Several algorithms require a full walk of the inflight
289: queue and so bounding its size keeps thing going nicely under huge
290: (many thousands of requests) loads.
291: .Pp
292: If a nameserver loses too many requests it is considered down and we
293: try not to use it. After a while we send a probe to that nameserver
294: (a lookup for google.com) and, if it replies, we consider it working
295: again. If the nameserver fails a probe we wait longer to try again
296: with the next probe.
297: .Sh SEE ALSO
298: .Xr event 3 ,
299: .Xr gethostbyname 3 ,
300: .Xr resolv.conf 5
301: .Sh HISTORY
302: The
303: .Nm evdns
304: API was developed by Adam Langley on top of the
305: .Nm libevent
306: API.
307: The code was integrate into
308: .Nm Tor
309: by Nick Mathewson and finally put into
310: .Nm libevent
311: itself by Niels Provos.
312: .Sh AUTHORS
313: The
314: .Nm evdns
315: API and code was written by Adam Langley with significant
316: contributions by Nick Mathewson.
317: .Sh BUGS
318: This documentation is neither complete nor authoritative.
319: If you are in doubt about the usage of this API then
320: check the source code to find out how it works, write
321: up the missing piece of documentation and send it to
322: me for inclusion in this man page.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>